2

我的 Rails 应用程序使用了许多 jQuery 插件。几乎所有页面都使用 jQuery.cookies 扩展来确定是否应该显示或隐藏特定元素。

此插件最初是 assets/javascripts 下自己的文件,并使用以下清单加载:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_self
//= require_directory . //there is a subdirectory i'm ignoring, but jquery.cookies isn't in it

在 Internet Explorer 上,jquery.cookies.js 正在每个需要它的页面上进行评估,除了两个页面,其中cookies对象没有被添加到jQuery. 这些页面包含与我的应用程序上的任何其他页面相同的 javascript:

javascript_include_tag('application')

在受影响的页面上,当评估以下代码时,它会抛出一个错误,如“对象不支持此属性或方法”有关 cookie 方法:

if ($.cookie("showHero") == 'true' || $.cookie("showHero") == null) {
    $('#hero').css('display', 'block');
} else {
    $('#hero').css('display', 'none');
}

将 jQuery.cookies.js 的内容移到 application.js 的顶部,在调用之前$(document).ready()似乎可以缓解这种症状并让 javascript 正常运行,但恐怕我还没有解决真正的问题。

这将发生在使用预编译资产的开发和生产中。

这些页面都没有引入任何页面独有的 javascript,为什么 jQuery.cookies 可能无法在如此狭窄的情况下进行评估?是否有处理多个不同的 javascript 文件的约定,我不知道我可能错过了?

编辑

我把它收回; 将 jquery.cookies 的内容移动到 application.js 似乎只在第一次加载页面时工作。随后的重新加载表现出相同的行为。一败涂地。

4

1 回答 1

1

事实证明,存在FB.init()仅在此页面上运行的条件,它似乎破坏了$用于访问 cookie 对象的符号。

我不完全确定这是为什么;这可能是FB使用原型库的结果,或者FB对象可能由于某种原因导致 jQuery 重新初始化。

通过包含在另一个函数中来更改 js 文件的内容$(document).ready()允许两组 javascript 运行,尽管调用jQuery.noConflict()并通过它jQuery而不是$同样有效,但也需要更改任何js.erb文件。

//= require jquery
//= require jquery-ujs

(function($) { // the $ is explicitly set to jQuery for this scope
  $(document).ready(function() {

    // no more complaints that 'cookies is not a method of $'
    if ($.cookies('showHero') == true ) {
       // do something
    }
  });
})(jQuery); 
于 2012-05-09T23:24:42.060 回答