我只在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>");
现在所有浏览器都能正常运行。
答案 0 :(得分:5)
您似乎使用了jqGrid的developer version。它包含jqGrid所包含的许多模块。文件jquery.jqGrid.js
也称为grid.loader.js
,只是按指定的顺序动态包含模块。
问题在于有很多动态的方法,包括JavaScript文件,所有这些都有优点和缺点。如果您只是在页面中包含<script>
所有模块的jquery.jqGrid.js
语句,或者您真正需要的所有模块都可以使用。
IE之前出现了同样的问题。我建议the fix使用document.writeln
,jquery.jqGrid.js
上的<script>
代码中包含jquery.jqGrid.js
,但该方式仅用于IE。似乎Firefox 4也应该使用相同的方式。如果您在HTML页面的<head>
内使用document.writeln
<xml>
,那么我所知道的<!DOCTYPE ...
方法的唯一缺点是对XHTML页面的限制:您不应在{{1}}之前的页面开头添加{{1}}标题。
我之前编写的最好,最简单,最安全的方法是直接包含您需要的所有模块。我只是个人用途。