最佳实践:JavaScript/jQuery

3
在我的工作中,我们讨论了最佳实践。考虑到我们有一个或多个a标签。当单击a标签时,我们希望a标签触发JavaScript函数。为了实现这个功能,我们可以通过jQuery将事件绑定到a标签上,或者我们可以在a标签上内联调用一个函数。每种解决方案的优缺点是什么,哪种方法最好。
问题2: 通常我们有一个包含JavaScript/jQuery的JavaScript文件位于主页面上。在每个页面上都使用jQuery选择器是否会有任何开销?
5个回答

2

问题 1

我建议您参考以下内容:

不显眼的JavaScript节省您的时间和金钱,使您的网站更加灵活
不显眼的Javascript演示文稿

因此:

  • 将功能与Web页面的结构/内容和呈现分离(“行为层”)

  • 避免传统JavaScript编程的问题的最佳实践(例如浏览器不一致性和可扩展性不足)

  • 渐进增强以支持可能不支持高级JavaScript功能的用户代理

问题 2

仅在需要它的页面上包含javascript文件,例如对需要它的页面。


1
问题1:有些人认为将JavaScript与HTML分离会使代码更易读、易维护。我也赞同这一观点。如果HTML只包含HTML标记,所有的JavaScript都在JS文件中,则代码更容易阅读。

如果您将相同的事件处理程序分配给多个元素,则如果您的要求发生变化,则肯定需要更改较少的内容。

在分配事件处理程序时,有一些功能方面的考虑。使用jQuery时,在DOMReady之前可以做的事情不多。在加载许多元素或由于某种原因DOM加载缓慢的页面上,用户可能在其事件处理程序被分配之前单击链接。如果您以行内方式编写赋值,并确保从单击调用的函数已在中加载,则知道您的事件将触发。

我仍然认为在DOMReady中分配事件监听器是合理的(并确保页面加载快速),但请考虑如果用户在事件监听器被分配之前点击链接会发生什么。我通常提倡使用javascript:void(0);而不是#作为href的值,因为它不会做任何事情。如果你的href指向#并且你依赖于return false来防止浏览器跟随链接,那么你就没有考虑到用户在DOMReady之前点击或者在你的点击处理程序中有一个JavaScript错误阻止了继续执行的情况。在某些浏览器中,跟随指向#的链接可能会导致刷新,但在最好的情况下,它仍然会在浏览器历史记录中创建一个项目,因此单击“返回”按钮只会将您带回到当前位置。 问题2: 当然会有一些开销。每次页面加载时,脚本将搜索与不同选择器匹配的元素。如果您知道在给定页面上某些元素永远不会被找到,则可以通过简单地不查找这些元素来减少执行时间。如果您想将其全部保存在一个大的脚本文件中,您可以根据URL确定是否运行特定的选择器集。检查location.href几次当然可以忽略不计。您将节省多少执行时间取决于选择器的数量以及它们的复杂性。简单的ID选择器对执行时间几乎没有影响。
(尼克的评论)

3
最后一部分是不正确的:“如果你使用实时查询,会有更大的开销,因为在这些情况下,每次修改 DOM 时都会进行活动处理。”……每当 DOM 被修改时,没有处理活动。 .live().delegate()基于事件冒泡工作,它们只是等待事件冒泡,事实上,如果你有成百上千个元素,监听事件冒泡到 document(这正是 .live() 所做的)并在那里处理它,比将 n 个事件处理程序附加到 n 个元素上更便宜,可以减缓页面加载速度。 - Nick Craver
@Nick Craver:太棒了,我不知道呢。谢谢你的填充 =) - David Hedlund

0

你在谈论不显眼的JavaScript,这是现在最流行的东西。

“不显眼的JavaScript”是JavaScript编程语言在互联网上的一种新兴技术。虽然该术语没有正式定义,但其基本原则通常被理解为:

将功能(“行为层”)与Web页面的结构/内容和呈现分离

遵循最佳实践,避免传统JavaScript编程的问题(如浏览器不一致性和缺乏可扩展性)

渐进增强以支持可能不支持高级JavaScript功能的用户代理

对我来说,这是最好的解决方案,原因如下。

关于问题#2,使用选择器会有一些开销,但通过适当的优化,您应该可以解决。如果您注意到某些速度问题,您可以仅在需要时调用选择器,而不是所有时间。


0

不同的时代需要不同的措施。

<a />标签的事件处理程序旨在决定是否跟随链接。例如,您可以说<a href="http://google.com" onclick="…" >…</a>如果该函数返回false,则页面在单击时不应切换。(这是比使用<a href="#" />更好的选择,因为如果正确执行,它适用于关闭javascript的浏览器。)

另一方面,如果您有许多执行相似操作且不想硬编码所有操作的链接,则一次性使用jquery绑定事件处理程序非常有用。

可以阅读有关Javascript样式元素的内容here,但这并没有涉及到jquery。


你仍然可以使用正确的 href 链接并绑定一个 jQuery 点击事件处理程序,指示浏览器是否跟随该 URL 的链接。 - David Hedlund

0

无疑,不侵入式的JS比内联JS更好,因此您应该将绑定放在单独的jQuery文件中。

另一方面,请记住,在jQuery选择器中具体指定是提高性能的好方法。例如:$('div.content a.link_btn')$('.link_btn')要快得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接