jquery bind click和 tag onclick之间的性能
我正在开发一个Web应用程序并使用相当多的JavaScript执行任务。 我有一些与Jquery绑定的标签点击做一些工作,所以我有这样的代码:
HTML代码:
some content here some content here ....
Jquery代码:
$('#id1').click(function(){ //do something here.. return false; }); $('#id2').click(function(){ //do something else here.. return false; });
使用这种方法,当脚本运行时,jquery必须查找选择器(id1,id2,ect)。
但还有另一种方法可以避免查找选择器,具体如下:
some content here some content here
和js代码:
function f1(){ //do something here.. }); function f2(){ //do something else here.. });
考虑到性能,哪种方法更好? 感谢帮助。
真正的性能提升是通过仅使用附加到父元素的一个事件处理程序,并使用event.target捕获子元素生成的事件,因为事件在JavaScript中默认冒泡到最外面的父元素。
将您的链接包裹在div中
只附加一个事件监听器
$('#parent').click(function(event){ // event.target is now the element who originated the event $(event.target).doSomething(); });
这是速度的大幅提升,特别是在IE等旧版浏览器中,以及当你开始有很多事件时。
在此查看示例
忘记表现 – 两者之间的任何差异都是无关紧要的。
第一种方法更好,因为它保持了行为和内容之间的严格分离。
顺便提一下,性能差异仅在分配事件处理程序时产生 。 在这种情况下,内联调用不必“找到”dom元素,但是,由于你的jquery选择器是通过id选择的(这非常有效),额外步骤引起的“开销”将很小。
性能明智的内联调用很快,因为它是立即触发的,而如果你使用jquery,它会监听这个事件并找到所有附加的处理程序并按顺序执行它们。 但是使用jquery,您可以设法以系统的方式附加所需的处理程序。
一种可能性是使用.delegate(),您可以在其中设置特定于上下文的绑定。 由于委托的工作原理,这应该比.live()和几个.click()绑定更快。 这里有一个很好的写作, 这里有一个优秀的必读。 祝好运!
HTML
jQuery的/ JavaScript的
$("#wrapper").delegate("#id1", "click", function(e){ e.preventDefault(); //do something here.. });
Jquery Delegate API
根据Jose Faeti的回答,这里有两个问题:
- 我怎样才能直接回答他的回答? ;)
- 我有以下场景: http : //jsfiddle.net/syY4D/
问题是,包含其他元素(如div或spans)的锚标签不会被视为已点击。 这是儿童元素。
hello
i don't need to be listened to there neither me, only a-tags should be concerned only i am "really" listened to more content
这可能很难看,但在我们现有的应用程序中,这是当前的状态。 所以我改编了相应的JavaScript如下:
$('#foo').click( function ( event ) { event.preventDefault(); if( $(event.target).hasClass('clickable') ) { alert('clicked: ' + event.target.name ); } else { if( $(event.target).closest('a.clickable').length ) alert('has parent: ' + $(event.target).closest('a.clickable').attr('name') ); } });
我的问题:有没有更好的解决方案呢? 性能更高? 它难看还是你会做出不同的事情?
干杯