IE无法在某些页面上加载jQuery扩展

时间:2012-05-09 18:23:33

标签: javascript jquery ruby-on-rails

我的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。这些页面包含与我的应用程序中任何其他页面相同的javascripts:

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只在第一次加载页面时才会起作用。后续重新加载表现出相同的行为。完全失败。

1 个答案:

答案 0 :(得分:1)

事实证明,有一个条件仅在此页面上运行FB.init(),这似乎已经破坏了用于访问Cookie对象的$符号。

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

通过将$(document).ready()括在另一个函数中来更改js文件的内容允许同时运行两组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);