问题2: 通常我们有一个包含JavaScript/jQuery的JavaScript文件位于主页面上。在每个页面上都使用jQuery选择器是否会有任何开销?
问题 1
我建议您参考以下内容:
不显眼的JavaScript节省您的时间和金钱,使您的网站更加灵活
不显眼的Javascript演示文稿
因此:
将功能与Web页面的结构/内容和呈现分离(“行为层”)
避免传统JavaScript编程的问题的最佳实践(例如浏览器不一致性和可扩展性不足)
渐进增强以支持可能不支持高级JavaScript功能的用户代理
问题 2
仅在需要它的页面上包含javascript文件,例如对需要它的页面。
如果您将相同的事件处理程序分配给多个元素,则如果您的要求发生变化,则肯定需要更改较少的内容。
在分配事件处理程序时,有一些功能方面的考虑。使用jQuery时,在DOMReady之前可以做的事情不多。在加载许多元素或由于某种原因DOM加载缓慢的页面上,用户可能在其事件处理程序被分配之前单击链接。如果您以行内方式编写赋值,并确保从单击调用的函数已在中加载,则知道您的事件将触发。
我仍然认为在DOMReady中分配事件监听器是合理的(并确保页面加载快速),但请考虑如果用户在事件监听器被分配之前点击链接会发生什么。我通常提倡使用javascript:void(0);
而不是#
作为href
的值,因为它不会做任何事情。如果你的href
指向#
并且你依赖于return false
来防止浏览器跟随链接,那么你就没有考虑到用户在DOMReady之前点击或者在你的点击处理程序中有一个JavaScript错误阻止了继续执行的情况。在某些浏览器中,跟随指向#
的链接可能会导致刷新,但在最好的情况下,它仍然会在浏览器历史记录中创建一个项目,因此单击“返回”按钮只会将您带回到当前位置。
问题2: 当然会有一些开销。每次页面加载时,脚本将搜索与不同选择器匹配的元素。如果您知道在给定页面上某些元素永远不会被找到,则可以通过简单地不查找这些元素来减少执行时间。如果您想将其全部保存在一个大的脚本文件中,您可以根据URL确定是否运行特定的选择器集。检查location.href
几次当然可以忽略不计。您将节省多少执行时间取决于选择器的数量以及它们的复杂性。简单的ID选择器对执行时间几乎没有影响。你在谈论不显眼的JavaScript,这是现在最流行的东西。
“不显眼的JavaScript”是JavaScript编程语言在互联网上的一种新兴技术。虽然该术语没有正式定义,但其基本原则通常被理解为:
将功能(“行为层”)与Web页面的结构/内容和呈现分离
遵循最佳实践,避免传统JavaScript编程的问题(如浏览器不一致性和缺乏可扩展性)
渐进增强以支持可能不支持高级JavaScript功能的用户代理
对我来说,这是最好的解决方案,原因如下。
关于问题#2,使用选择器会有一些开销,但通过适当的优化,您应该可以解决。如果您注意到某些速度问题,您可以仅在需要时调用选择器,而不是所有时间。
不同的时代需要不同的措施。
<a />
标签的事件处理程序旨在决定是否跟随链接。例如,您可以说<a href="http://google.com" onclick="…" >…</a>
如果该函数返回false
,则页面在单击时不应切换。(这是比使用<a href="#" />
更好的选择,因为如果正确执行,它适用于关闭javascript的浏览器。)
另一方面,如果您有许多执行相似操作且不想硬编码所有操作的链接,则一次性使用jquery绑定事件处理程序非常有用。
可以阅读有关Javascript样式元素的内容here,但这并没有涉及到jquery。
href
链接并绑定一个 jQuery 点击事件处理程序,指示浏览器是否跟随该 URL 的链接。 - David Hedlund无疑,不侵入式的JS比内联JS更好,因此您应该将绑定放在单独的jQuery文件中。
另一方面,请记住,在jQuery选择器中具体指定是提高性能的好方法。例如:$('div.content a.link_btn')
比$('.link_btn')
要快得多。
.live()
和.delegate()
基于事件冒泡工作,它们只是等待事件冒泡,事实上,如果你有成百上千个元素,监听事件冒泡到document
(这正是.live()
所做的)并在那里处理它,比将n
个事件处理程序附加到n
个元素上更便宜,可以减缓页面加载速度。 - Nick Craver