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

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

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

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

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

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

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

jQuery.Event(event, props)

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

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

jQuery.event.fix(event)

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

ETA:

实际上,仔细查看代码, jQuery.event.fix()应该可以工作 – 以@ Beetroot-Beetroot描述的方式。 这就是jQuery在事件调度中创建jQuery事件对象所做的一切。

你想要jQuery.event.fix

new jQuery.Event(nativeEvent)

  • nativeEvent存储为originalEvent属性。
  • 处理一些冒泡的逻辑。
  • 时间戳事件
  • 将事件标记为“jQuery得到了这个”
  • 给它所有冒泡/默认防止function 。

请注意,此时事件没有任何“eventy”属性,只有originalEventtimeStamptimeStamp / default- timeStamp函数。

jQuery.event.fix(nativeEvent)

  • 以上都是如此
  • 根据事件类型计算出需要应用的特定修复(“修复钩子”)
  • 复制来自nativeEvent一组默认属性,以及来自修复挂钩的特定属性
  • 修复了targetmetaKey属性的跨浏览器问题
  • 为修复挂钩应用特定的跨浏览器修补程序和规范化 。

试试这个:

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

有:

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

http://jsfiddle.net/Wrzpb/