将本机浏览器事件对象转换为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”属性,只有originalEvent
, timeStamp
和timeStamp
/ default- timeStamp
函数。
jQuery.event.fix(nativeEvent)
- 以上都是如此
- 根据事件类型计算出需要应用的特定修复(“修复钩子”)
- 复制来自
nativeEvent
一组默认属性,以及来自修复挂钩的特定属性 - 修复了
target
和metaKey
属性的跨浏览器问题 - 为修复挂钩应用特定的跨浏览器修补程序和规范化 。
试试这个:
document.getElementById('elmtid').onclick = anotherFunction;
有:
function anotherFunction(evt){ evt = $.event.fix(evt || window.event);//Note need for cross-browser reference to the native event ... }
- 当Internet Explorer开发人员工具栏可见时,JavaScript脚本仅适用于Internet Explorer
- jQuery的isFunction和InternetExplorer
- IE 10中的event.preventDefault
- jQuery text()函数在IE中丢失换行符
- IE中的Cookie已禁用问题
- 一个按钮元素上的jQuery .attr(’type’,’submit’)在IE7中给出了一个奇怪的错误
- 使用jquery ui datepicker的Knockout.js可以在IE以外的任何地方使用
- IE没有从Ajax响应中撤回Flash Object src
- 堆栈在第0行溢出