Ошибка JavaScript, но только в Firefox 4 - PullRequest
6 голосов
/ 05 апреля 2011

Я получаю следующую ошибку только в 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, я столкнулся с этим. Я уверен, что я загружаю этот вызов в jqgrid после того, как я загружаю все остальные мои javascript (и он отлично работает во всех других протестированных браузерах и более старых версиях 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 внизу скрипта вида, а не загружать его как отдельный файл, но ничего не изменилось.

Есть идеи, как решить эту проблему?


Исправлено, любезно Олег , заключается в изменении способа загрузки различных включенных файлов. В загрузчике (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 Ответ

5 голосов
/ 05 апреля 2011

Кажется, вы используете версию разработчика jqGrid. Он включает в себя множество модулей, из которых состоит jqGrid. Файл jquery.jqGrid.js, также известный как grid.loader.js, просто динамически включает модули в указанном порядке.

Проблема в том, что существует много способов динамического включения файлов JavaScript, и все они имеют свои преимущества и недостатки. Если вы просто включите на своей странице оператор <script> для всех модулей из jquery.jqGrid.js или всех модулей, которые вам действительно нужны, ваша программа будет работать.

Та же проблема была раньше с IE. Я предложил исправить , чтобы использовать document.writeln, для которого теперь включен код jquery.jqGrid.js на github , но этот способ будет использоваться только для IE. Похоже, что Firefox 4 тоже следует использовать таким же образом. Если вы используете <script> с jquery.jqGrid.js внутри <head> страницы HTML, то единственным недостатком метода document.writeln, который, как я знаю, является ограничение для страниц XHTML: вы не должны включать заголовок <xml> в начало страницы до <!DOCTYPE ....

Лучший, простой и самый безопасный метод, как я писал ранее, - это включить все модули, которые вам нужны напрямую. Я лично использую только способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...