我正在使用带有一些选项的自动完成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>
的特定页面并且工作正常,但我不喜欢这种方法。
答案 0 :(得分:1)
您需要将此文件放在资产管道之外,即不在app/assets
,lib/assets
或public/assets
内。您可以将其放在public
文件夹中,然后在您需要的视图中使用javascript_include_tag
链接到该文件夹。
答案 1 :(得分:0)
有几种方法可以解决这个问题。可能最简单的方法是将所有相关的js直接放在它关注的页面中 - 只需添加一个脚本标记,将其放入其中,然后完成它。
我不是这种方法的忠实粉丝,并不适用于所有情况。我要继续猜测在assets/javascripts
,你有一个“require_tree”。结合了&amp;提供文件夹中的每个文件。您可以做的是稍微分解一下 - 将每个页面上服务的每个文件保存在特定的单独文件夹中,并要求该文件夹中的每个文件。将foo.js
之类的内容保存在其他位置,并根据需要组合/提供它们。
我不能肯定地说,但我猜这种JavaScript文件的划分将是矫枉过正的。我认为最好的办法是改变foo.js
的结构,这样你仍然可以用其他一切来提供它,但它不会自动运行。有几种方法可以做到这一点。一种方法是将所有内容包装在一个命名函数中,并在需要它的特定页面上调用该函数。
但是,如果问题只是配置jQuery插件,那么您可以更多地依赖jQuery来实现这一点。我必须看到有问题的代码,但你应能够在空集上调用插件。
例如,如果您正在使用jQuery-ui并将某些内容声明为可拖动,则$("#my_element").draggable()
如果页面上不存在“#my_element”则不会导致异常 - 相反,什么都不会发生。我不能肯定地说没有看到你正在做什么,但我敢打赌,你可以通过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
函数作为自动完成配置的一部分。我要做更多的挖掘,但除此之外,这是一种合理的方式。