Javascript错误,但仅限于Firefox 4

时间:2011-04-04 21:01:22

标签: javascript jquery jqgrid

我只在Firefox 4中出现以下错误(不在FF 3.6.16,Safari,Chrome,Opera或IE中):

jQuery("#list").jqGrid is not a function
   loadComplete: function(){console.log('complete');} 

myfile.js line 542

loadComplete是jqgrid代码块的最后一行(第542行)。所以它到达jqgrid的调用结束然后抛出这个错误。

这是在过去一年一直运作良好的网站上。一旦我升级到Firefox 4,我遇到了这个问题。我确定在加载所有其他javascript后,我将此调用加载到jqgrid(并且它在所有其他测试的浏览器和旧版本的Firefox中都能正常工作)。

可能导致这样的事情?我原本以为它可以通过确保调用jqgrid是在jquery和jqgrid插件加载之后才能解决但是......这似乎就是这种情况(我甚至尝试在加载时设置5秒超时)调用jqgrid的位,以便确保加载所有内容但仍然失败)。无论如何,为什么只在FF4?


额外信息:

以下是页面上的js加载顺序:

<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui-1.8.1.custom.min.js"></script>
<script type="text/javascript" src="/js/i18n/grid.locale-en.js"></script>
<script type="text/javascript" src="/js/jquery.jqGrid.js"></script>
<script type="text/javascript" src="/js/ajaxupload.js"></script>

然后在页面末尾加载jqgrid调用的特定视图:

<script type="text/javascript" src="/js/viewspecific.js"></script>

最后一个是由Zend Framework中的一个方法加载的,该方法可以预先加载,附加或偏移加载文件。在对此进行故障排除时,我明确使用了append以及偏移量来强制此脚本最后加载死机。我甚至尝试在视图脚本的底部包含原始JS,而不是作为单独的文件加载,但没有任何区别。

有关如何解决此问题的任何想法?


修复,礼貌Oleg,是修改各种包含文件的加载方式。在loader(jquery.jqGrid.js)中,您将看到特定于浏览器的代码,如:

if(jQuery.browser.safari ) {
    jQuery.ajax({url:filename,dataType:'script', async:false, cache: true});
} else {
if (jQuery.browser.msie) {
    document.write('<script type="text/javascript" src="'+filename+'"></script>');
} else {
    IncludeJavaScript(filename);
}
}

我用更通用的代替了它:

document.writeln("<script type='text/javascript' src='"+filename+"'></script>"); 

现在所有浏览器都能正常运行。

1 个答案:

答案 0 :(得分:5)

您似乎使用了jqGrid的developer version。它包含jqGrid所包含的许多模块。文件jquery.jqGrid.js也称为grid.loader.js,只是按指定的顺序动态包含模块。

问题在于有很多动态的方法,包括JavaScript文件,所有这些都有优点和缺点。如果您只是在页面中包含<script>所有模块的jquery.jqGrid.js语句,或者您真正需要的所有模块都可以使用。

IE之前出现了同样的问题。我建议the fix使用document.writelnjquery.jqGrid.js上的<script>代码中包含jquery.jqGrid.js,但该方式仅用于IE。似乎Firefox 4也应该使用相同的方式。如果您在HTML页面的<head>内使用document.writeln <xml>,那么我所知道的<!DOCTYPE ...方法的唯一缺点是对XHTML页面的限制:您不应在{{1}}之前的页面开头添加{{1}}标题。

我之前编写的最好,最简单,最安全的方法是直接包含您需要的所有模块。我只是个人用途。