Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails内联Javascript和最佳实践_Javascript_Ruby On Rails_Coding Style - Fatal编程技术网

Rails内联Javascript和最佳实践

Rails内联Javascript和最佳实践,javascript,ruby-on-rails,coding-style,Javascript,Ruby On Rails,Coding Style,我对使用Rails有点陌生,我正在开发的一个应用程序进展顺利——不过我查看了生成的HTML并注意到了一些事情,如 <script type="text/javascript"> //<![CDATA[ Droppables.add(...); //]]> </script> // 散布在HTML中,这当然与我使用的地方相匹配: <%= drop_receiving_element ... %> 我想知道的是。。。有没有更好的方法来做到这

我对使用Rails有点陌生,我正在开发的一个应用程序进展顺利——不过我查看了生成的HTML并注意到了一些事情,如

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

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

<%= drop_receiving_element ... %>

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


另一种选择可能是将所有这些“标记块”推送到一个数组中,然后将它们写到应用程序.rhtml文件中,但它仍然有点凌乱…

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

imo认为,最干净的方法就是使用简单的html/css构建应用程序,并使用不引人注目的javascript对其进行增强,以提供更好的用户体验

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

根据这些评论,我想添加一些可能的选项,让您开始:

  • JQuery
  • 尤伊
  • 原型

    • 这让我困扰了一段时间,最终我想出了一个双管齐下的办法

      如果您正在为一个封闭的域开发一个web应用程序,搜索引擎性能和javascript都不是问题,那么请实事求是,让Rails的javascript助手来做他们的事情

      如果您是为web开发的,那么按照Tomh的建议,用简单的html/css编码,然后增强onDomReady


      如果您仍然希望使用诸如Butto remote之类的Rails帮助程序来使用内联javascript,那么就编写页面加载处理程序来向服务器发送Ajax请求。然后,您可以使用page.replace/page.replace\u html将常规页面元素替换为帮助程序返回的代码。

      我还建议使用不引人注目的Javascript方法和使用

      有关如何使用Rails实现这一点的入门教程,请看一下


      如果您想继续在jQuery中使用helpers,那么请看一看,但是如果您这样做,您仍然违反了不引人注目的Javascript前提。

      最佳实践是删除所有内联Javascript。但是,我遇到了3种情况,您绝对需要内联javascript:

      1.解决图像错误的步骤 如果图像标记引用的图像路径不存在,防止图像错误出现(即使在web检查器中)的唯一方法是:

      <img src="/i/dont/exist.png" onerror="$(this).attr("src", "/i/do/exist.png")" />
      
      下面的代码也不起作用,因为
      onerror
      事件没有冒泡:

      $("img").live("error", function() {
        $(this).attr("src", "/i/do/exist.png");
      });
      
      因此,您必须使用内联javascript来实现这一点

      2.在页面加载时呈现javascript模板

      如果你等到<代码> $(文档)。就绪< /Cord>将你的内容导入到DOM中的一个空容器元素中,用户将在一秒内看到空白点。这就是为什么当您的页面第一次加载时,提要会有一瞬间是空白的。即使您只是在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>
      
      App.bootstrap({some:“json”});
      //这里的动态内容
      App.renderContent();
      
      
    • App.renderSidebar();
      3.您正在使用JSON引导应用程序 如果您使用的是JSON+javascript模板,最好将第一组数据引导到响应体中,方法是将其内联到页面中(在上面的dom示例中也是如此)。这使得您不需要额外的ajax请求来呈现内容

      其他一切都应该使用不引人注目的Javascript来完成 Rails有很多javascript助手,谢天谢地,在Rails3中,大部分(全部?)都不引人注目;他们现在正在使用
      data-
      属性和一个外部
      rails.js
      文件。然而,许多ruby部分javascript的精华仍然倾向于编写帮助器方法,添加复杂的javascript内联:


      这是很有帮助的,但我认为有一个清晰的自述文件来描述如何将javascript添加到
      应用程序.js
      中更有用。外部javascript使定制/扩展功能变得更加容易,它使您能够更好地控制系统,并最大限度地减少跨html页面的重复(因此响应体更小,浏览器可以缓存外部javascript文件)。除非您需要处理丢失的图像、即时呈现或引导一些json,否则您可以将其他所有内容都放在外部javascript文件中,而不必使用Rails javascript/ajax帮助程序。

      有时内联javascript对于关键、快速的视图(例如,某些登录页)或小片段非常有用(例如,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。

      我意识到这通常是最佳实践,但我从Rails的角度对此感到好奇。我看到的许多Rails应用程序都使用了这些脚本生成器,它们似乎刚刚出炉
      <%= facebook_tag %>