虽然已经有人问过,但我想解决正确的jQuery编程问题。
方法#1:
<script>
function DoClickAction() {
// Some work
return false;
}
</script>
<a href="#" id="ActionButton" onclick="DoClickAction();">Do some work</a>
VS
方法#2:
<script>
$(function() {
$("#ActionButton").on("click", DoClickAction);
}
function DoClickAction() {
// Some work
return false;
}
</script>
<a href="#" id="ActionButton">Do some work</a>
我正与同事讨论这个问题,我的意见是,这两种方法都有足够的利弊,不能说“这是正确的方法”,但如果我必须选择我倾向于更喜欢方法#1,这就是原因:
方法#1专业人士:
方法#2专业人士:
您对此有何看法?
答案 0 :(得分:4)
不要列出任何一种方法的专家,而是让我关注方法1的概念:
就第二种方法而言,我能想到的唯一“缺点”是:
除此之外,method2还有另一个 major 专业版,你没有列出: delegation 。起初,代表团看起来很难,但It's easy,jQuery的$.delegate
使得更容易,仍然使用$.on
with a selector委托事件。
基本上,委派允许您使用单个侦听器处理整个页面或页面的一部分的所有事件,例如click
。这与将事件绑定到每个元素相反。因此:事件循环上的1个监听器与数十/数百。很明显,这是一种更高效的做事方式。
假设您在页面上有一个导航div,如下所示:
<div id='nav'>
<ul>
<li id='nav-home'>Some pseudo-link</li>
<li id='nav-page1'>Another</li>
</ul>
</div>
您想要点击用户,点击其中一个<li>
标签。您列出的第一种方法可以解决问题:<li id='nav-home' onclick='clickNav(event, this)'>
。我正在传递事件对象和 this
(一个DOM引用)以访问授权我访问的所有内容。
使用委托,我可以这样做:
//jQ
$('#nav').on('click','li',function(e)
{
$.ajax({//you know the gist
url: 'ajax/' + $(this).id().replace('nav-',''),
success: function(){}
});
});
//vanillaJS:
document.getElementById('nav').addEventListener('click',function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if (e.tagName.toLowerCase() === 'li')
{
//perform ajax call
}
},false);
答案 1 :(得分:1)
我自己非常偏爱#2,因为它提供了JavaScript和HTML的清晰分离。浏览器插件可以完全否定HTML中没有按钮操作的负面影响。
此外,正如您已经说过的,有时我想将onclick事件附加到表的每一行,并且在每行上设置元素的OnClick属性比简单地附加单击更浪费在其他地方用一行代码处理每个代码。