最佳做法是删除所有内联 javascript。但是,我遇到了 3 种情况,您绝对需要内联 javascript:
1。解决图像错误
如果图像标签引用了不存在的图像路径,防止图像错误出现的唯一方法(即使在网络检查器中)是这样做:
<img src="/i/dont/exist.png" onerror="$(this).attr("src", "/i/do/exist.png")" />
以下内容不起作用,因为onerror 事件在您甚至有时间使用 jQuery 抓取图像之前执行:
$("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 页面首次加载时,Feed 会瞬间空白。即使您只是将外部脚本文件放在 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 请求来呈现内容。
其他一切都应该使用 Unobtrusive Javascript 完成
Rails 有很多 javascript 帮助程序,幸好在 Rails 3 中大部分(全部?)是不显眼的;他们现在使用data- 属性和外部rails.js 文件。然而,许多部分 ruby 部分 javascript 的 gem 仍然倾向于编写辅助方法添加复杂的 javascript 内联:
这很有帮助,但我认为只有一个清晰的 README 描述如何将 javascript 添加到您的 application.js 会更有用。外部 javascript 使自定义/扩展功能变得更加容易,它使您可以更好地控制系统,并最大限度地减少 html 页面之间的重复(因此响应正文更小,浏览器可以缓存外部javascript 文件)。除非您需要处理丢失的图像、即时渲染或引导一些 json,否则您可以将其他所有内容放在外部 javascript 文件中,而不必使用 Rails javascript/ajax 助手。