将本机浏览器事件对象转换为jQuery事件对象

时间:2012-02-29 23:33:26

标签: javascript jquery internet-explorer

我通过本机浏览器onclick属性为元素分配一个事件处理函数:

document.getElementById('elmtid').onclick = function(event) { anotherFunction(event) };

当我在anotherFunction(event)时,我希望能够像使用jQuery中通过.on()方法获得的事件对象一样使用事件对象。我想这样做是因为jQuery事件对象具有适用于所有浏览器的.pageX.pageY.stopPropagation()等属性和方法。

所以我的问题是,在我将本机浏览器事件对象传入anotherFunction()后,如何将其转换为jQuery事件?我试过了$(event),但它没有用。

这里显而易见的问题是:为什么不使用jQuery .on.bind.click等来分配事件处理函数?答案是:我正在构建一个页面,其中有一个巨大的表格,上面有很多可点击的东西。不幸的是,这个项目要求页面必须在IE6和IE7中快速渲染。在IE6和IE7中使用.on等创建了DOM泄漏并快速占用内存(使用Drip测试自己:http://outofhanwell.com/ieleak/index.php?title=Main_Page)。通过.onclick设置onclick行为是我必须在IE6和IE7中快速呈现的唯一选项。

3 个答案:

答案 0 :(得分:15)

评论太长了......因为文档对此有点模糊......(我在下面看1.7.1)

jQuery.Event(event, props)

  • 创建一个新对象
  • 将其type属性设置为事件的type属性。
  • 通过规范化调用设置isDefaultPrevented,以检查是否阻止默认值。
  • 设置originalEvent以引用您传入的事件。
  • 添加props对象参数提供的任意属性集。
  • 设置时间戳。
  • 将对象标记为“已修复”。

你得到的基本上是一个新对象,它有一些额外的属性和对原始事件的引用 - 除了isDefaultPrevented之外没有规范化。

jQuery.event.fix(event)

  • 忽略已标记为“已修复”的对象。
  • 制作可写副本(通过jQuery.Event())并规范化here提到的属性。

<强> ETA:

实际上,仔细观察代码,jQuery.event.fix()应该有效 - 就像@ Beetroot-Beetroot所描述的那样。这就是jQuery在事件调度中创建jQuery事件对象所做的一切。

答案 1 :(得分:10)

答案 2 :(得分:6)

试试这个:

document.getElementById('elmtid').onclick = anotherFunction;

with:

function anotherFunction(evt){
    evt = $.event.fix(evt || window.event);//Note need for cross-browser reference to the native event
    ...
}

http://jsfiddle.net/Wrzpb/