JavaScript事件类型
Web浏览器中可能发生的事件有很多类型。这里我将主要将下面几种常用的事件类型:
- UI事件
- 焦点事件
- 鼠标与滚轮事件
- 键盘与文本事件
- 复合事件
- 变动事件
- HTML5事件
- 设备事件
- 触摸与手势事件
第一部分:UI事件
UI事件中UI即(User Interface,用户界面),当用户与页面桑拿的元素交互时触发。
UI事件中主要包括load,unload,abort,error,select,resize,scroll事件。
1.load事件
此事件为当页面完全加载完之后(包括所有的图像、js文件、css文件等外部资源),就会触发window上面的load事件。
这个事件是JavaScript中最常用的事件,比如我们经常会使用window.onload=function(){};这种形式,即当页面完全加载完之后执行其中的函数。
另外,之前一直都不知道,这个事件还可以用在其他元素上,比如图像元素,如下所示:
<img src="smile.png" onload="alert('loaded')">
即当图片完全加载出来之后会有弹窗。当然也可以使用JS来实现,如下所示:
var img=document.getElementById("img");
EventUtil.addHandler(img,"load",function(){
event=EventUtil.getEvent(event);
alert(EventUtil.getTarget(event).src);
});
2.unload事件
显然,这个事件是与load事件相对的。在文档被完全卸载后触发。用户从一个页面切换到另一个页面就会触发unload时间。利用这个事件最多的情况是清楚引用,避免内存泄漏。
这个事件同样有两种方式来指定。一种是JavaScript方式,使用EventUtil.addHandler();另一种就是在body元素中添加一个特性。
值得注意的是,一定要小心编写onload事件中的代码,因为它是在页面卸载后才触发,所以说页面加载后存在的那些对象,在onload触发之后就不一定存在了!
<body onload="alert('changed')">
3.resize事件
当调整浏览器的窗口到一个新的宽度或高度时,就会触发resize事件。这个事件在window(窗口)上面触发。 因此同样可以通过JS或者body元素中的onresize特性来指定处理程序。
<body onresize="alert('changed')">
写了这句代码,那么浏览器的大小发生改变时就会弹出窗口。
4.scroll事件
这个事件会在文档被滚动期间重复被触发,所以应当尽量保持事件处理程序的代码简单。
第二部分:焦点事件
焦点事件会在页面元素获得或失去焦点时触发。主要有下面几种:
- blur 在元素失去焦点时触发。这个事件不冒泡,所有浏览器都支持。
- focus 在元素获得焦点时触发。这个事件不冒泡,所有浏览器都支持。
- focusin 在元素获得焦点时触发。这个事件冒泡, 某些浏览器不支持。
- focusout 在元素失去焦点时触发。这个事件冒泡,某些浏览器不支持。
注意:即使blur和focus不冒泡,也可以在捕获阶段侦听到他们。
第三部分:鼠标与滚轮事件
鼠标事件是Web开发中最常用的一类事件,因为鼠标是最主要的定位设备。
- click---用户单击鼠标左键或按下回车键触发
- dbclick---用户双击鼠标左键触发。
- mousedown---在用户按下了任意鼠标按钮时触发。
- mouseenter---在鼠标光标从元素外部首次移动到元素范围内时触发。此事件不冒泡。
- mouseleave---元素上方的光标移动到元素范围之外时触发。不冒泡。
- mousemove---光标在元素的内部不断的移动时触发。
- mouseover---鼠标指针位于一个元素外部,然后用户将首次移动到另一个元素边界之内时触发。
- mouseout---用户将光标从一个元素上方移动到另一个元素时触发。
- mouseup---在用户释放鼠标按钮时触发。
注意到:上述所有事件除了mouseenter和mouseleave外都冒泡。
重要:只有在同一个元素上相继触发mousedown和mouseup事件,才会触发click事件。同样,只有在同一个元素上触发两次click事件,才会触发dbclick事件。
dbclick事件的产生过程如下:
- mousedown
- mouseup
- click
- mousedown
- mouseup
- click
- dbclick
上面介绍了有关鼠标的事件,下面介绍一些对于鼠标光标的位置:客户区坐标位置、页面坐标位置、屏幕坐标位置
一、客户区坐标位置
通过客户区坐标可以知道鼠标是在视口中什么位置发生的。
clientX和clientY分别表示鼠标点击的位置。以body的左上角为原点,向右为X的正方向,向下为Y的正方向。这两个都是event的属性。举例如下:
<button id="clickMe">点我</button>
<script>
var button=document.getElementById("clickMe");
button.onclick=function(event){
alert(event.clientY+""+event.clientX);
};
</script>
二.页面坐标位置
和客户区坐标位置不同,页面坐标位置表示鼠标光标在页面而非视口中的位置。因此坐标是从页面本身而非视口的左边和顶边计算的。如果前面的话不能很好的理解,接着看这里:在页面没有滚动的情况下,页面坐标位置和客户区坐标位置是相同的。
页面坐标
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>页面坐标位置</title>
<style>
*{
margin:0;
padding:0;
}
div{
width: 800px;
height: 1200px;
/*我的电脑的视口高度为960px;*/
background: #ccc;
}
</style>
</head>
<body>
<div></div>
<button id="button"> 点击我</button>
<script>
var button=document.getElementById("button");
button.onclick=function(){
alert("pageX为"+event.pageX+"pageY为"+event.pageY);
};
</script>
</body>
</html>
在上面的例子中,我把div的高设置为了1200px;而我的浏览器视口高度为960px;所以一定需要滚动我们才能点击按钮,最终得到的结果是:pageX为13pageY为1210。
然而IE8及更早的浏览器是不支持事件对象上的页面坐标的,即不能通过pageX和pageY来获得页面坐标,这时需要使用客户区坐标和滚动信息来计算了。而滚动信息需要使用document.body(混杂模式)、document.documentElement(标准模式)中的scrollLeft和scrollTop属性。举例如下:
<button id="button"> 点击我</button>
<script>
var button=document.getElementById("button");
button.onclick=function(){
var pageX=event.clientX+(document.body.scrollLeft||document.documentElement.scrollLeft);
var pageY=event.clientY+(document.body.scrollRight||document.documentElement.scrollRight);
alert("pageX为"+pageX+"pageY为"+pageY);
};
</script>
此例子在IE浏览器下可得到同样结果。
三.屏幕坐标位置
与前两者又有所不同,鼠标事件发生时,还有一个光标相对于整个电脑屏幕的位置。通过screenX和screenY属性就可以确定鼠标事件发生时鼠标指针相对于整个屏幕的位置。
四.修改键
当点击某个元素时,如果我们同时按下了ctrl键,那么事件对象的ctrlKey属性值将为true,否则为false,对于alt、shift、meta(windows键盘的windows键、苹果机的Cmd键)的事件属性altKey、shiftKey、metaKey同样如此。下面举例如下:
<button id="button"> 点击我</button>
<script>
var button=document.getElementById("button");
button.onclick=function(){
var array=new Array();
if(event.shiftKey){
array.push("shift");
}
if(event.ctrlKey){
array.push("ctrl");
}
if(event.altKey){
array.push("alt");
}
if(event.metaKey){
array.push("meta");
}
alert(array.join(","));
};
</script>
这个例子中,我首先创建了一个array数组,接着如果我按下了那几个键,就会存入相应的名称。这里我同时按下了四个键,结果如下:
即最终将数组中的四个值拼接成了字符串显示出来。
五、相关元素
<button id="button"> 点击我</button>
<script>
var button=document.getElementById("button");
button.onmouseup=function(){
alert(event.button);
};
</script>
当我是用左键产生mousedown事件时,弹出窗口为0,中间键为1,右键为2。
六、鼠标滚轮事件
<script>
document.onmousewheel=function(){
alert(event.wheelDelta);
};
</script>
当我向下滚动滚轮时,效果如下:
第四部分:键盘和文本事件
该部分主要有下面几种事件:
- keydown:当用户按下键盘上的任意键时触发。按住不放,会重复触发。
- keypress:当用户按下键盘上的字符键时触发。按住不放,会重复触发。
- keyup:当用户释放键盘上的键时触发。
- textInput:这是唯一的文本事件,用意是将文本显示给用户之前更容易拦截文本。
这几个事件在用户通过文本框输入文本时才最常用到。
键盘事件:
document.addEventListener("keydown",handleKeyDownClick,false);
function handleKeyDownClick(event) {
var e = event||window.event||arguments.callee.caller.arguments[0];
if (e&&e.keyCode == 13) {
alert("keydown");
}
}
js事件和jquery事件的区别
一、关于加载DOM:
它们的区别
-
js中常使用window.onload方法,
jquery常使用(function(){}) 或者 (window).load(function(){})
-
js的window.onload这个方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行,
即js此时才可以访问网页中的任何元素。
而jqeury的$(document).ready()只要DOM完全就绪时就可以操作了
但是,例如,有时函数需要处理图片的宽高,可使用上个方法函数在执行时,可能图片的相关信息都没有加载完成
因此jqeury的$(window).load()就会在所有的内容(包括窗口,框架,对象和图片等)加载完成后触发,
如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。
二、关于事件绑定:
js中注册事件处理程序有两种基本方法:
1:给事件目标对象或文档元素设置属性
2:将事件处理程序传递给对象或元素的一个方法
对于1:
(1 )设置javascript对象属性为事件处理程序
例如:
window.οnlοad=function(){}
div.οnclick=function(){}
命名规则:事件处理程序属性的名字由"on"加上事件名组成,并且属性名区分大小写,所有都是小写,即使事件类型是由多个词组成
onclick,onchange,onload.onmouseover,onreadystatechange等
缺点:每个事件目标对于某种事件类型最多只有一个事件处理程序
例如:
window.οnlοad=function(){alrt("two");}
最后只会有two的弹框 当然可以通过
window.οnlοad=function(){
function(){....}
function(){...}
.....
}
来实现,但是,如果存在多个js文件,并且,每个文件都想调用window.onload时就不行了
(2 )设置HTML标签属性为事件处理程序
例如:
<button οnclick="alert("hello");">click</button>
使用规则:属性值是js代码字符串,这段代码应该是事件处理程序的主体,而非完整的函数声明,也就是说,html事件处理程序代码
不应该使用大括号包围且使用function关键字作为前缀。如果html处理程序属性包含多条js语句,则必须要使用分号分隔这些语句或断开属性值使其跨多行
对于2:
(1 )attachEvent() ,detachEvent()attachEvent(事件类型,处理函数程序)
例如:btn.attachEvent("onclick",handler)
与1的区别在于:允许相同的事件处理函数注册多次
(2) addEventListener() , removeEventListener() addEventListener(事件类型,事件处理函数,布尔值)
例如:btn.addEventListener("click",handler,false)
关于布尔值:通常情况下都是false,若传的是true,那么函数将注册为捕获事件处理程序,并在事件不同的调度阶段调用
与1的区别在于:允许相同的事件处理函数注册多次
注意:(1 )与(2)的区别
attchEvent()第一个参数使用带"on"前缀的事件处理程序属性名,而addEventListener则不带"on"
参数个数不同
一般而言,会这样写:
var btn=document.getElementById("btn");
var handler=function(){ alert("hello");};
if(btn.addEventListener)
btn.addEventListener("click",handler);
else if(btn.attachEvent)
btn.attachEvent("onclick",handler);
jquery中绑定事件方法: bind() 、 on() (两者其实类似)
bind(type,[data],fn)
- type: 含有一个或多个事件类型的字符串,由空格分隔多个事件。
- 比如"click"或"submit",还可以是自定义事件名。
- data:作为event.data属性值传递给事件对象的额外数据对象
- fn:绑定到每个匹配元素的事件上面的处理函数
- on():在选择元素上绑定一个或多个事件的事件处理函数。
on(events,[selector],[data],fn)
- events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" 。
- selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择的< null或省略,当它到达选定的元素,事件总是触发。
- data:当一个事件被触发时要传递event.data给事件处理函数。
- fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。
特点:
命名规则上:都少了"on"
可以使用连缀 例如 $('#btn').bind("mouseover",handler1).bind("mouseout",handler2);
可以简单绑定事件 例如 $('#btn').mouseover(headler1).mouseout(handler2);
事件对象常用的属性跟方法
一、数字对象
Number 对象表示数值日期,整数或浮点数。一般情况下,你不需要担心 Number 对象,因为浏览器自动将数字文 本转换为数字类的实例。
1、创建一个## Number 对象
var val = new Number(number);
如果该参数不能转换为数字,它将返回为NaN(Not-a-Number) 。
二、数字属性
| 属性 | 描述 |
|---|---|
| max_value | 最大的可能值在 JavaScript 中的数量可以有 1.7976931348623157E+308 |
| min_value | 最小的可能值在 JavaScript 中的数量可以有 5E-324 |
| NaN | 等价于一个值不是一个数字 |
| negative infinity | 比 min_value 小的值 |
| positive_infinity | 比 max_value 大的值 |
prototype 数字对象的静态属性,使用原型对象的属性来给当前文档中的数字对象分配新的属性和方法。
三、数字方法
String 对象通过大量的辅助方法来操作一系列字符的组合(即字符串),这些方法隐藏了 JavaScript 字符串原 始数据类型。
因为JavaScript 可以实现原始字符串数组和字符串对象之间的自动转换,可以调用字符串对象的任何一个辅 助方法作用于原始字符串数据。
1、创建一个String 对象
var val = new String(string);
参数string 是正确编码的字符序列。
2、String 属性
| 属性 | 描述 |
|---|---|
| constructor | 返回创建这个对象的布尔函数的一个引用 |
| prototype | 原型属性允许您添加对象的属性和方法 |
| length | 字符串的长度 |
3、String 对象方法
| 方法 | 描述 |
|---|---|
| charAt() | 返回在指定位置的字符 |
| charCodeAt() | 返回在指定的位置的字符的 Unicode 编码 |
| concat() | 连接字符串 |
| indexOf() | 检索字符串 |
| lastIndexOf() | 从后往前检索字符串 |
| localeCompare() | 用本地特定的顺序来比较两个字符串 |
| match() | 找到一个或多个正则表达式的匹配 |
| replace() | 替换与正则表达式匹配的子串 |
4、String 的 HTML 基本类型包装器
方法&描述
- author() 创建一个 HTML 锚作为一个超文本的目标
- big() 创建一个字符串用大号字体显示,就像使用
<big>标签的效果 - blink() 创建一个字符串闪动显示,就像使用
<blink>标签的效果 - bold() 创建一个字符串加粗显示,就像使用
<b>标签的效果 - fixed() 创建一个字符串以打字机文本显示,就像使用
<tt>标签的效果 - fontcolor() 创建一个字符串使用指定的颜色显示,就像使用
<font color="color">标签的效果 - fontsize() 创建一个字符串使用指定的尺寸显示,就像使用
<font size="size">标签的效果 - italics() 创建一个字符串使用斜体显示,就像使用
<i>标签的效果 - link() 创建一个 HTML 超链接,用来请求另一个 URL
- small() 创建一个字符串使用小字号显示,就像使用
<small>标签的效果 - strike() 创建一个字符串使用删除线显示,就像使用
<strike>标签的效果 - sub() 创建一个字符串显示为下标,就像使用
<sub>标签的效果 - sup()创建一个字符串显示为上标,就像使用
<sup>标签的效果
未完待续..........