2012-05-09 48 views
2

我有一些由我的Rails应用程序使用的jQuery插件。几乎所有页面都使用jQuery.cookies扩展来确定是否应显示或隐藏特定元素。IE无法加载某些页面上的jQuery扩展

这个插件最初下的资产/ JavaScript的它自己的文件,并使用加载以下清单:

//= 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中似乎只在第一次加载页面时起作用。后续重新加载显示相同的行为。完全丧失。

回答

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);