Aus*_*ust 11 javascript jquery event-handling javascript-events
我确信我们都看过vanilla-js(最快的JavaScript框架)的网站; D和我只是很好奇,确切地说,为ja添加一个事件处理程序比jQuery更快.所以我前往jsPerf测试它,我对结果感到非常惊讶.
jQuery的表现优于普通JavaScript超过2500%.
我的测试代码:
//jQuery
$('#test').click(function(){
console.log('hi');
});
//Plain JavaScript
document.getElementById('test').addEventListener('click', function(){
console.log('hi');
});
Run Code Online (Sandbox Code Playgroud)
我只是无法理解这是怎么发生的,因为似乎最终jQuery最终必须使用与普通JavaScript使用完全相同的功能.有人可以解释为什么会发生这种情况吗?
and*_*lrc 10
正如您在jQuery.event.add的这个片段中看到的那样,它只创建一次eventHandle.
查看更多:http://james.padolsey.com/jquery/#v=1.7.2&fn=jQuery.event.add
// Init the element's event structure and main handler, if this is the first
events = elemData.events;
if (!events) {
elemData.events = events = {};
}
eventHandle = elemData.handle;
if (!eventHandle) {
elemData.handle = eventHandle = function (e) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(eventHandle.elem, arguments) : undefined;
};
// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
eventHandle.elem = elem;
}
Run Code Online (Sandbox Code Playgroud)
这里我们有addEventListener:
// Init the event handler queue if we're the first
handlers = events[type];
if (!handlers) {
handlers = events[type] = [];
handlers.delegateCount = 0;
// Only use addEventListener/attachEvent if the special events handler returns false
if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
// Bind the global event handler to the element
if (elem.addEventListener) {
elem.addEventListener(type, eventHandle, false);
} else if (elem.attachEvent) {
elem.attachEvent("on" + type, eventHandle);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为内部jQuery实际上只需调用addEventListener() 一次,因为它自己的内部处理程序.设置完成后,只需将回调添加到简单列表中即可.因此,大多数电话.click()只是做一些簿记和.push()(或类似的东西).
| 归档时间: |
|
| 查看次数: |
8320 次 |
| 最近记录: |