js框架开发之旅--事件三

停止事件

我们点击一个元素,会触发它的默认事件,同时事件还会传播给他的父元素。
Prototype使用Event.stop()方法阻止默认事件和事件的传播。
jQuery遵循W3C的标准,给事件提供了更多的接口:
  •     event.preventDefault():阻止事件目标的默认事件触发。
  •     event.stopPropagation(): 阻止事件在DOM树上传播。
  •     event.stopImmediatePropagation(): 阻止当前元素的后续事件触发,同时阻止事件在DOM树上传播。

我们的接口设计

我们打算给事件对象继承下面的方法:
  •     event.stop() – 阻止默认事件和事件传播
  •     event.preventDefault() – 阻止默认事件
  •     event.stopPropagation() – 阻止事件传播


实现

我创建了一个私有的函数继承和修复事件对象,主要是修复IE的差异:
function stop(event) {
  event.preventDefault(event);
  event.stopPropagation(event);
}

function fix(event, element) {
  if (!event) var event = window.event;

  event.stop = function() { stop(event); };

  if (typeof event.target === 'undefined')
    event.target = event.srcElement || element;

  if (!event.preventDefault)
    event.preventDefault = function() { event.returnValue = false; };

  if (!event.stopPropagation)
    event.stopPropagation = function() { event.cancelBubble = true; };

  return event;
}

其他浏览器差异

其他的浏览器差异主要体现在键盘和鼠标事件上,jQuery处理了下面的一些差异:
  • Safari对文本节点处理的不同
  • 某些浏览器对pageX/Y的不支持
  • 键盘事件对event.which和event.metaKey的支持不同
  • event.which对鼠标点击的按钮的序列的支持
Prototype处理方式类似:
var _isButton;
if (Prototype.Browser.IE) {
  // IE doesn't map left/right/middle the same way.
  var buttonMap = { 0: 1, 1: 4, 2: 2 };
  _isButton = function(event, code) {
    return event.button === buttonMap[code];
  };
} else if (Prototype.Browser.WebKit) {
  // In Safari we have to account for when the user holds down
  // the "meta" key.
  _isButton = function(event, code) {
    switch (code) {
      case 0: return event.which == 1 && !event.metaKey;
      case 1: return event.which == 1 && event.metaKey;
      default: return false;
    }
  };
} else {
  _isButton = function(event, code) {
    return event.which ? (event.which === code + 1) : (event.button === code);
  };
}

结论

最近三篇文章我们介绍了事件的处理,我们阐述了如果开发一个兼容W3C和微软的事件框架。我们了解了事件的生命周期,学习了怎么阻止事件的默认事件和事件的传播。我们同样了解其他浏览器的差异和如何处理这些差异。
我们的事件框架的代码已经完成,你可以在github上查看:turing.events.js
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值