【问题标题】:Where to put a JS file for specific page in Rails?在 Rails 中将特定页面的 JS 文件放在哪里?
【发布时间】:2013-11-15 21:12:38
【问题描述】:

我正在使用带有一些选项的自动完成 JQuery 插件。小代码只在一个特定页面中使用。

我的第一次尝试是将它放在app/assets/javascripts/foo.js 中的一个单独的 JS 文件中。问题是代码抛出异常,因为该元素在其他页面中不存在。

我也想过从特定页面调用 JS 文件,但是我应该把这个 JS 文件放在哪里呢?

编辑 1

这是 foo.js 的代码

$(document).ready(function(){
    $("#search").autocomplete({
         // set options
    }) 
    .data( "ui-autocomplete" )._renderItem = 
        function( ul, item ) {
        // more code
        };
});

我在 firebug 中得到了 typeerror $(...).autocomplete(...).data(...) is null,所以我尝试将此代码放入带有 <script></script> 的特定页面,并且工作正常,但我不喜欢这种方法。

【问题讨论】:

    标签: jquery ruby-on-rails ruby-on-rails-4 asset-pipeline


    【解决方案1】:

    您需要将此文件放在资产管道之外,即不在app/assetslib/assetspublic/assets 内。您可以将它放在public 文件夹中,然后在您需要它的视图中使用javascript_include_tag 链接到它。

    【讨论】:

      【解决方案2】:

      有几种方法可以处理这个问题。可能最简单的方法是把所有相关的 js 直接放到它关注的页面中——只需添加一个脚本标签,放入其中,然后就可以完成了。

      我不是这种方法的忠实拥护者,而且它并非在所有情况下都有效。我将继续猜测assets/javascripts,你有一个“require_tree”。组合并提供文件夹中的每个文件。您可以做的是稍微分解一下 - 将您在每个页面上提供的每个文件保存在一个特定的单独文件夹中,并要求该文件夹中的每个文件。将foo.js 之类的内容保留在其他地方,并根据需要组合/提供它们。

      我不能肯定地说,但我猜这种对 JavaScript 文件的划分将是多余的。我认为最好的办法是更改foo.js 的结构,以便您仍然可以将其与其他所有内容一起提供,但它不会自动运行。有几种方法可以做到这一点。一种是将所有内容包装在一个命名函数中,然后在需要它工作的特定页面上调用该函数。


      但是,如果问题只是配置 jQuery 插件的问题,您可能可以更多地依赖 jQuery 来完成此操作。我必须查看有问题的代码,但您应该能够在空集上调用插件。

      例如,如果您使用 jQuery-ui 并将某些内容声明为可拖动的,那么如果页面上不存在“#my_element”,$("#my_element").draggable() 不会导致异常 - 相反,什么都不会发生。如果没有看到你在做什么,我不能肯定地说,但我敢打赌,你可以通过巧妙地重组 foo.js 并让它无害地存在于不需要它的页面上。


      关于编辑1

      一个简单但有点花哨的解决方法就是这样做:

      $(document).ready(function(){
        $("#search").autocomplete({
           // set options
        })
        .each(function() {
          $(this).data('ui-autocomplete')._renderItem = 
            function( ul, item ) {
            // more code
            };
        });
      

      我对 jQuery UI 小部件知之甚少,不知道是否有更好的方法 - 理想情况下,有某种方法可以将 _renderItem 函数作为自动完成配置的一部分。我会做更多的挖掘,但除此之外,这是一种合理的方法。

      【讨论】:

      • 是的,我正在使用带有自动完成功能的 JQuery-ui,例如 $("#search").autocomplete(...),并在 firebug 中抛出异常:typeerror $(...).autocomplete(...).data(...) is null
      • 嗯。您是否有机会发布更多代码?我认为即使没有元素,您发布的块也应该返回“null”而不会导致任何错误 - 您随后是否尝试使用该块返回的内容或其他内容?
      • 更新了一种方法,可以让您将所有内容保持在以前的同一位置。
      • 谢谢,现在异常消失了!但是由于某种原因,第一次加载页面时自动完成功能不起作用,但如果我刷新工作正常:(。
      • 奇数。如果您清除缓存,它还会这样做吗?另外,“#search”元素是从页面的 html 开始,还是由单独的脚本添加?
      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2017-05-05
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多