【问题标题】:Rails inline Javascript and Best PracticesRails 内联 Javascript 和最佳实践
【发布时间】:2023-03-24 04:29:01
【问题描述】:

有点刚开始使用 Rails,我正在开发的应用程序进展顺利 - 但是我正在查看生成的 HTML 并注意到类似...

<script type="text/javascript">
//<![CDATA[
Droppables.add(...);
//]]>
</script>

散布在 HTML 周围,这当然与我使用的地方相匹配:

<%= drop_receiving_element ... %>

我想知道的是......有没有更好的方法来做到这一点,或者让它更清洁?其中一些脚本标签来自部分,因此将它们放在“页面底部”在这种情况下并没有真正的帮助。

另一种选择可能是将所有这些“标签块”推入一个数组,然后将它们写到 application.rhtml 文件中,但它仍然有点混乱......

【问题讨论】:

  • 郑重声明,Rails 3 将不再是这种情况。Javascript 辅助方法将不显眼(无脚本标签)并且与库无关(可用于 jQuery、Prototype 等)。

标签: javascript ruby-on-rails coding-style


【解决方案1】:

如果您真的想使用最佳实践...不要使用内联 javascript。保持您的 HTML、CSS 和 Javascript 干净且彼此分离。理想情况下,html 文件应该可以在没有 CSS 和 javascript 的情况下使用。

imo 最简洁的方法是使用纯 html/css 构建您的应用程序,并使用不显眼的 javascript 对其进行增强,以提供更好的用户体验。

一种模式是在页面底部包含所有 JS 文件,并开始使用 onDomReady 等功能运行代码。

根据 cmets,我想添加一些可能的选项来帮助您入门:

  • jQuery
  • 小唯
  • 原型

【讨论】:

  • 我意识到这是一般的最佳实践,但我想从 Rails 的角度来看这个问题。我见过的很多 Rails 应用程序都使用这些脚本生成器,它们似乎只是在调用它们的地方输出脚本块......
  • 很多asp.net 开发者只做IE 网站,并不意味着你也应该这样做。我强烈考虑不要使用这样的“帮手”。
【解决方案2】:

最佳做法是删除所有内联 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 助手。

【讨论】:

    【解决方案3】:

    有时内联 JavaScript 对于关键、快速的视图(例如,某些登录页面)或小型 sn-ps(例如,Facebook SDK 初始化、Analytics/Kissmetrics 初始化脚本等)很有用,因为不使用外部库可以加快速度页面加载。对于这些情况,我建议在布局中使用部分 _facebook.js.erb,并定义一个助手:

    module ApplicationHelper
      def facebook_tag
        content_tag :script, render(partial: 'layouts/facebook.js')
      end
    end
    

    然后,创建文件 _facebook.js.erb 并使用定义的帮助程序将内联 JavaScript 包含在 application.html.erb 中:

    <%= facebook_tag %>
    

    对于任何其他情况,例如您提到的内联 JavaScript 的部分内容,我建议使用其他答案所建议的不显眼的 JavaScript。

    【讨论】:

    • 谢谢你!有什么线索可以将渲染包装在 uglify 步骤中吗?更多的学术活动......
    • 您应该在渲染部分后包含对 uglifier gem 的调用。但是您应该小心计算时间或缓存结果。一般来说,我建议只使用已经缩小的 js,因为这种方法只适用于某些知名的 sn-ps。
    【解决方案4】:

    这困扰了我一段时间,最终我想出了一个两管齐下的方法。

    如果您正在为封闭域开发 Web 应用程序,其中搜索引擎性能和 javascript 不是问题,请务实并让 Rails 的 javascript 助手完成他们的工作。

    如果您正在为整个 Web 开发,那么按照 Tomh 的建议进行操作,并使用纯 html/css 进行编码,然后增强 onDomReady。

    如果您仍想使用像 button_to_remote 这样使用内联 javascript 的 Rails 帮助程序,则编写页面加载处理程序以向服务器发送 Ajax 请求。然后,您可以使用 page.replace / page.replace_html 将常规页面元素替换为从帮助程序返回的代码。

    【讨论】:

      【解决方案5】:

      我还建议使用不显眼的 Javascript 方法并使用 jQuery

      有关如何使用 Rails 进行此操作的精彩介绍性教程,请查看jQuery + Rails screencast by Ryan Bates

      如果您想继续在 jQuery 中使用帮助程序,请查看 jRails,但如果您这样做,您仍然会违反不显眼的 Javascript 前提。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2013-02-17
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多