最佳实践是删除所有内联JavaScript。然而,我遇到过三种情况,你绝对需要使用内联JavaScript:
1. 解决图像错误
如果图像标签引用了不存在的图像路径,防止图像错误出现(即使在Web检查器中也是如此)的唯一方法是执行以下操作:
<img src="/i/dont/exist.png" onerror="$(this).attr("src", "/i/do/exist.png")" />
以下代码不起作用,因为在使用jQuery抓取图像之前,
onerror
事件已被执行:
$("img").error(function() {
$(this).attr("src", "/i/do/exist.png")
});
以下代码同样无法工作,因为
onerror
事件不会冒泡:
$("img").live("error", function() {
$(this).attr("src", "/i/do/exist.png");
});
所以你必须使用内联javascript。
2. 在页面加载时呈现javascript模板
如果你等到$(document).ready
将内容的源代码绘制在dom中的某个空容器元素中,用户会在一瞬间看到空白的位置。这就是为什么当你的Twitter页面首次加载时,动态内容为空的原因。即使您只是在dom底部放置一个外部脚本文件,并在其中将动态生成的html元素附加到页面上,甚至不使用$(document).ready
,也为时已晚。你必须在容器元素添加后立即附加动态节点:
<script>App.bootstrap({some: "json"});</script>
<nav id='navigation'></nav>
<header id='header'></header>
<section id='content'>
// dynamic content here
</section>
<script>App.renderContent();</script>
<aside id='sidebar'>
// dynamically toggle which one is selected with javascript
<nav>
<h3>Search By Category</h3>
<ol>
<li>
<a href="/category-a">Category A</a>
</li>
<li>
<a href="/category-b">Category B</a>
</li>
</ol>
</nav>
</aside>
<script>App.renderSidebar();</script>
<footer id='footer'></footer>
3. 使用JSON引导您的应用程序
如果您正在使用JSON + javascript模板,将第一组数据引导到响应主体中是一个好主意,通过在页面中内联包含它(在上面的dom示例中也是如此)。 这样做可以避免需要额外的AJAX请求来呈现内容。
其他所有事情都应该使用无侵入式Javascript完成
Rails有很多javascript助手,值得庆幸的是,在Rails 3中,大部分(全部?)都是无侵入式的。他们现在使用data-
属性和外部rails.js
文件。 然而,许多半Ruby半JavaScript的宝石仍然编写帮助器方法以内联添加复杂的JavaScript:
这很有帮助,但我认为只要有一个清晰的README文件描述如何将JavaScript添加到您的application.js
中就更有用了。外部javascript使得以后定制/扩展功能变得更加容易,并且可以更好地控制系统,并最小化跨html页面的复制(因此响应主体更小,浏览器可以缓存外部javascript文件)。除非您需要处理缺少图像、瞬时呈现或引导某些JSON外,您可以将其他所有内容放在外部JavaScript文件中,而不必使用Rails JavaScript / AJAX助手。