@demonly
2017-01-13T07:16:31.000000Z
字数 4808
阅读 1456
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" );
});