在我的工作中,我们讨论了什么是最佳实践。考虑我们有一个或多个标签。我们希望a标签在单击它时触发JavaScript函数。要拥有此功能,我们可以通过jQuery将事件绑定到a标签,或者我们可以在a标签上调用内联函数。 每种解决方案的优缺点是什么,以及最佳方法是什么。
问题2: 通常我们在我们的母版页上有我们的JavaScript / jQuery和JavaScript文件。是否有任何开销让jQuery选择器在每个页面上触发?
答案 0 :(得分:2)
问题1
我建议你看一下:
Unobtrusive JavaScript Saves You Time & Money, Keeps Your Website Agile
Unobtrusive Javascript Presentation
所以:
从网页中分离功能(“行为层”) 结构/内容和演示文稿
避免传统JavaScript编程问题的最佳做法(例如浏览器不一致和缺乏可扩展性)
逐步增强以支持可能不支持的用户代理 高级JavaScript功能
问题2
仅在需要的页面上包含javascript文件,例如需要它的页面。
答案 1 :(得分:1)
问题1:有些人会争辩说,保持javascript远离HTML会让您的代码具有更好的可读性和可维护性。我会把自己包括在那个群体中。我当然认为如果HTML只是HTML并且在JS文件中找到所有的javascript,代码就更容易阅读。
如果您为多个元素分配相同的事件处理程序,那么如果您的需求发生变化,您肯定必须更少的事情。
关于分配事件处理程序时 ,有一些功能注意事项。使用jQuery,在DOMReady之前你可以做很多事情。在加载大量元素的页面中,或者由于某种原因DOM缓慢加载的页面中,用户在分配事件处理程序之前单击链接当然是可能的。如果你内联编写作业,并确保点击中调用的函数已加载到HEAD
,那么你就知道你的事件会被激活。
我仍然认为在DOMReady中分配事件侦听器是合理的(并确保页面加载速度很快),但是请考虑如果用户在分配事件侦听器之前单击链接会发生什么。我通常提倡javascript:void(0);
超过#
作为href
的值,因为这不会做任何事情。如果您的href
指向#
且您依赖return false
来阻止浏览器关注该链接,则您无法覆盖用户在DOMReady 之前点击的情况或您的点击处理程序中存在javascript错误,导致无法继续执行。链接到#
可能会在某些浏览器中导致刷新,但在最好的情况下,它仍然会导致浏览器历史记录中的项目,因此单击后退按钮只会将您带到您所在的位置已经
问题2:肯定有一些开销。每次页面加载时,脚本都将搜索与不同选择器匹配的元素。如果您知道在给定页面上永远不会找到某些元素,则可以通过简单地不查找这些元素来将执行时间减少一些。如果你想将它全部保存在一个大的脚本文件中,你或许可以从URL中找出是否要运行一组特定的选择器。检查location.href
几次肯定可以忽略不计。您将节省多少执行时间取决于它们有多少选择器,以及它们是如何复杂。简单的ID选择器几乎不会影响执行时间。
如果使用(Nick的评论)live
查询,则会产生更大的开销,因为在这些情况下,每次修改DOM时都会进行活动工作。
答案 2 :(得分:0)
你在谈论unobstrusive javascript,这是现在炒作的事情。
“不引人注目的JavaScript”是一个 JavaScript中的新兴技术 编程语言,用于 全球资讯网。虽然这个词不是 正式定义,其基本原则 通常被理解为包括:
功能分离( 来自网页的“行为层”) 结构/内容和演示
避免这些问题的最佳做法 传统的JavaScript编程 (例如浏览器不一致和 缺乏可扩展性)
逐步增强支持 可能不支持的用户代理 高级JavaScript功能
对我来说,这是出于这些原因的最佳解决方案。
关于问题#2,使用选择器会有开销,但如果进行适当的优化,你应该没问题。如果您发现某些速度问题,您可以仅在需要时而不是所有时间调用选择器。
答案 3 :(得分:0)
不同的时间要求采取不同的措施。
<a />
标记的事件处理程序用于决定是否遵循该链接。例如,您可能会说<a href="http://google.com" onclick="…" >…</a>
如果该函数返回false
,则单击该页面时不应切换。 (这是比<a href="#" />
更好的替代方法,因为如果做得好,它适用于关闭javascript的浏览器。)
另一方面,如果你有许多链接接近同一个东西并且不想对它们进行全部硬编码,那么将jquery一起绑定到事件处理程序就会非常有用。
人们可以阅读有关Javascript样式here的元素,但这并没有触及jquery。
答案 4 :(得分:0)
绝对不引人注目的JS比Inline JS更好,所以你应该把你的绑定放在一个单独的jQuery文件中。
另一方面,请记住,在jQuery选择器中特定是提高性能的好方法。一世。即$('div.content a.link_btn') is a lot faster then $('.link_btn')