@demonly
2017-01-13T07:16:31.000000Z
字数 4808
阅读 1500
jQuery
jQuery 为大多数原生事件提供了简易方法,比如.click()、.focus()、.blur()、.change()。这些是 jQuery 的.on()方法的简写,这些方法在内部会调用.on()方法,因此推荐直接使用.on()方法。
$( "p" ).click(function() {console.log( "You clicked a paragraph!" );});
$( "p" ).on( "click", function() {console.log( "click" );});
.on()方法会返回原来的 jQuery 对象。
每个事件都会取得一个事件对象,事件对象包含了许多有用的属性和方法。
$( "input" ).on("change",{ foo: "bar" }, //绑定事件的同时传入 data 属性function( eventObject ) {console.log("An input value has changed! ", eventObject.data.foo);});
$p.on( "click.abc.foo", handler ); //定义在 abc 和foo 两个命名空间下$p.trigger( "click.abc" ); //执行 abc 命名空间下的 click 事件处理函数$p.off( "click.foo" ); //移除定义在 foo 命名空间下的事件处理函数
除了事件对象以外,事件处理函数还可以通过 this 取得绑定的 DOM 元素。
//多个事件,同个事件处理程序$( "input" ).on("click change",function() {console.log( "An input was clicked or changed!" );});//多个事件,多个事件处理程序$( "p" ).on({"click": function() { console.log( "clicked!" ); },"mouseover": function() { console.log( "hovered!" ); }});
.one()可以创建一次性事件。
$( "p" ).one( "click", firstClick ); //触发后移除该元素上的事件处理程序,即这个事件在所有 p元素上都可以触发一次$( "input[id]" ).one( "focus mouseover keydown", firstEvent); //任何一个事件触发,移除整个事件处理程序
.hover()方法接受一个或两个函数。如果传入了两个事件,那么这两个函数将分别在 mouseenter 和mouseleave 事件触发时被调用。如果仅传入一个函数,那么这个函数在 mouseenter 和mouseleave 事件触发时都会被调用。
//这会在 body 中任意一个 button 被点击时触发$( "body" ).on({click: function( event ) {alert( "Hello." );}}, "button" ); //"button"是 CSS 选择器//更加轻便的写法$( "body" ).on( "click", "button", function( event ) {alert( "Hello." );});
.trigger()可以触发任何用 jQuery 或者原生 JavaScript 绑定的事件,但是不能够触发原生浏览器事件。因为在使用原生 JavaScript 以及 jQuery 绑定事件时都会给 jQuery 留下一个引用。
$( "a" ).trigger( "click" );
如果需要模拟原生浏览器事件可以使用.simulate()方法。使用这个方法模拟原生浏览器事件同样会触发由 JavaScript 和jQuery 绑定的事件。
$( "a" ).simulate( "click" );
.triggerHandler()方法同样可以触发事件,但是与.trriger()有以下几点不同。
//绑定自定义事件$( ".lightbulb" ).on( "light:toggle", function( event ) {//do something});//触发自定义事件room.find( ".lightbulb" ).trigger( "light:toggle" );
jQuery 事件不仅可以被绑定在 DOM 元素上,也可以被绑定在一般对象上。
jQuery.event.props 是一个保存属性名字符串的数组,这些属性在 jQuery 处理事件时会被从原生事件对象复制到 jQuery 事件对象。使用 jQuery.event.props.push( "newPropertyName" )可以向这个列表添加属性名。如果原生事件对象中不存在这个属性的话这个属性的值就会是 undefined。向这个列表中添加过多的属性名会显著降低事件传递性能,因此对于偶尔才会用到的一些属性,推荐使用 event.originalEvent 来访问。如果一定要复制的话推荐使用 jQuery.event.fixHooks
jQuery.event.fixHooks 是一个对象,这个对象拥有两个属性。
//设置一个在 drop 事件中复制 dataTransfer 属性的钩子jQuery.event.fixHooks.drop = {props: [ "dataTransfer" ]};
同一个事件的 fixHooks 之间会产生冲突,而且由于 fixHooks 没有被广泛地使用,这个冲突仍然需要手动来解决。
var existingHook = jQuery.event.fixHooks.drop;if ( !existingHook ) {jQuery.event.fixHooks.drop = {props: [ "dataTransfer" ]};} else {if ( existingHook.props ) {existingHook.props.push( "dataTransfer" );} else {existingHook.props = [ "dataTransfer" ];}}
jQuery 特殊事件钩子的机制与 fixHooks 相似,特殊的事件信息保存在 jQuery.event.special.NAME 中(NAME 是特殊事件名称)。在特殊事件钩子的使用中也存在 fixHooks 中同样的问题。
jQuery.event.special.pushy = {bindType: "click",delegateType: "click"};
在绑定了"pushy"的元素上调用.trggle("click")会触发"pushy"事件,但是调用.off("click")并不会移除"pushy"事件。
事件对象中有一个 handleObj 对象,这个对象提供了关于事件的信息。这个对象应该被当做只读对象来对待。
$( ".dialog" ).on( "click.myPlugin", "button", {mydata: 42}, myHandler );
这个对象中只应该包括以下这些属性。
可以在事件对象中设置以下这些方法来对事件进行修改。
下面是一个例子:重复点击事件。
//设置特殊事件钩子jQuery.event.special.multiclick = {//设置事件映射delegateType: "click",bindType: "click",handle: function( event ) {var handleObj = event.handleObj;var targetData = jQuery.data( event.target );var ret = null;// 取得点击次数targetData.clicks = ( targetData.clicks || 0 ) + 1;if ( targetData.clicks % event.data.clicks === 0 ) {event.type = handleObj.origType;ret = handleObj.handler.apply( this, arguments );event.type = handleObj.type;return ret;}}};$( "p" ).on( "multiclick", {clicks: 3}, function( event ) {alert( "clicked 3 times" );});