[关闭]
@demonly 2017-01-13T07:16:31.000000Z 字数 4808 阅读 1456

jQuery 事件基础

jQuery


jQuery 事件基础

jQuery 为大多数原生事件提供了简易方法,比如.click()、.focus()、.blur()、.change()。这些是 jQuery 的.on()方法的简写,这些方法在内部会调用.on()方法,因此推荐直接使用.on()方法。

  1. $( "p" ).click(function() {
  2. console.log( "You clicked a paragraph!" );
  3. });
  1. $( "p" ).on( "click", function() {
  2. console.log( "click" );
  3. });

.on()方法会返回原来的 jQuery 对象。

事件对象

每个事件都会取得一个事件对象,事件对象包含了许多有用的属性和方法。

  1. $( "input" ).on(
  2. "change",
  3. { foo: "bar" }, //绑定事件的同时传入 data 属性
  4. function( eventObject ) {
  5. console.log("An input value has changed! ", eventObject.data.foo);
  6. }
  7. );
  1. $p.on( "click.abc.foo", handler ); //定义在 abc 和foo 两个命名空间下
  2. $p.trigger( "click.abc" ); //执行 abc 命名空间下的 click 事件处理函数
  3. $p.off( "click.foo" ); //移除定义在 foo 命名空间下的事件处理函数

除了事件对象以外,事件处理函数还可以通过 this 取得绑定的 DOM 元素。

设置多个事件响应

  1. //多个事件,同个事件处理程序
  2. $( "input" ).on(
  3. "click change",
  4. function() {
  5. console.log( "An input was clicked or changed!" );
  6. }
  7. );
  8. //多个事件,多个事件处理程序
  9. $( "p" ).on({
  10. "click": function() { console.log( "clicked!" ); },
  11. "mouseover": function() { console.log( "hovered!" ); }
  12. });

设置一次性事件

.one()可以创建一次性事件。

  1. $( "p" ).one( "click", firstClick ); //触发后移除该元素上的事件处理程序,即这个事件在所有 p元素上都可以触发一次
  2. $( "input[id]" ).one( "focus mouseover keydown", firstEvent); //任何一个事件触发,移除整个事件处理程序

辅助事件

.hover()方法接受一个或两个函数。如果传入了两个事件,那么这两个函数将分别在 mouseenter 和mouseleave 事件触发时被调用。如果仅传入一个函数,那么这个函数在 mouseenter 和mouseleave 事件触发时都会被调用。

事件委托

  1. //这会在 body 中任意一个 button 被点击时触发
  2. $( "body" ).on({
  3. click: function( event ) {
  4. alert( "Hello." );
  5. }
  6. }, "button" ); //"button"是 CSS 选择器
  7. //更加轻便的写法
  8. $( "body" ).on( "click", "button", function( event ) {
  9. alert( "Hello." );
  10. });

触发事件处理程序

.trigger()可以触发任何用 jQuery 或者原生 JavaScript 绑定的事件,但是不能够触发原生浏览器事件。因为在使用原生 JavaScript 以及 jQuery 绑定事件时都会给 jQuery 留下一个引用。

  1. $( "a" ).trigger( "click" );

如果需要模拟原生浏览器事件可以使用.simulate()方法。使用这个方法模拟原生浏览器事件同样会触发由 JavaScript 和jQuery 绑定的事件。

  1. $( "a" ).simulate( "click" );

.triggerHandler()方法同样可以触发事件,但是与.trriger()有以下几点不同。

  1. //绑定自定义事件
  2. $( ".lightbulb" ).on( "light:toggle", function( event ) {
  3. //do something
  4. });
  5. //触发自定义事件
  6. room.find( ".lightbulb" ).trigger( "light:toggle" );

jQuery 事件扩展

jQuery 事件不仅可以被绑定在 DOM 元素上,也可以被绑定在一般对象上。

jQuery.event.props

jQuery.event.props 是一个保存属性名字符串的数组,这些属性在 jQuery 处理事件时会被从原生事件对象复制到 jQuery 事件对象。使用 jQuery.event.props.push( "newPropertyName" )可以向这个列表添加属性名。如果原生事件对象中不存在这个属性的话这个属性的值就会是 undefined。向这个列表中添加过多的属性名会显著降低事件传递性能,因此对于偶尔才会用到的一些属性,推荐使用 event.originalEvent 来访问。如果一定要复制的话推荐使用 jQuery.event.fixHooks

jQuery.event.fixHooks 是一个对象,这个对象拥有两个属性。

  1. //设置一个在 drop 事件中复制 dataTransfer 属性的钩子
  2. jQuery.event.fixHooks.drop = {
  3. props: [ "dataTransfer" ]
  4. };

同一个事件的 fixHooks 之间会产生冲突,而且由于 fixHooks 没有被广泛地使用,这个冲突仍然需要手动来解决。

  1. var existingHook = jQuery.event.fixHooks.drop;
  2. if ( !existingHook ) {
  3. jQuery.event.fixHooks.drop = {
  4. props: [ "dataTransfer" ]
  5. };
  6. } else {
  7. if ( existingHook.props ) {
  8. existingHook.props.push( "dataTransfer" );
  9. } else {
  10. existingHook.props = [ "dataTransfer" ];
  11. }
  12. }

特殊事件钩子

jQuery 特殊事件钩子的机制与 fixHooks 相似,特殊的事件信息保存在 jQuery.event.special.NAME 中(NAME 是特殊事件名称)。在特殊事件钩子的使用中也存在 fixHooks 中同样的问题。

  1. jQuery.event.special.pushy = {
  2. bindType: "click",
  3. delegateType: "click"
  4. };

在绑定了"pushy"的元素上调用.trggle("click")会触发"pushy"事件,但是调用.off("click")并不会移除"pushy"事件。

handleObj 对象

事件对象中有一个 handleObj 对象,这个对象提供了关于事件的信息。这个对象应该被当做只读对象来对待。

  1. $( ".dialog" ).on( "click.myPlugin", "button", {
  2. mydata: 42
  3. }, myHandler );

这个对象中只应该包括以下这些属性。

可以在事件对象中设置以下这些方法来对事件进行修改。

下面是一个例子:重复点击事件。

  1. //设置特殊事件钩子
  2. jQuery.event.special.multiclick = {
  3. //设置事件映射
  4. delegateType: "click",
  5. bindType: "click",
  6. handle: function( event ) {
  7. var handleObj = event.handleObj;
  8. var targetData = jQuery.data( event.target );
  9. var ret = null;
  10. // 取得点击次数
  11. targetData.clicks = ( targetData.clicks || 0 ) + 1;
  12. if ( targetData.clicks % event.data.clicks === 0 ) {
  13. event.type = handleObj.origType;
  14. ret = handleObj.handler.apply( this, arguments );
  15. event.type = handleObj.type;
  16. return ret;
  17. }
  18. }
  19. };
  20. $( "p" ).on( "multiclick", {
  21. clicks: 3
  22. }, function( event ) {
  23. alert( "clicked 3 times" );
  24. });
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注