2014-01-27 4 views
2

У нас есть динамический загруженный jQuery. Это связано с тем, что у нас есть устаревший код, который не имеет главной страницы, и весь такой старый код уже ссылался на общий файл js, когда мы решили начать использовать jQuery. Поэтому вместо того, добавить ссылку на сотни файлов, мы обновили существующий файл, чтобы сделать следующее:динамически загружаемый jQuery спорадически выбрасывает jQuery undefined error

function loadjscssfile(filename) { 
    var fileref = document.createElement('script') 
    fileref.setAttribute("type", "text/javascript") 
    fileref.setAttribute("src", filename) 

    if (typeof fileref != "undefined") 
     document.getElementsByTagName("head")[0].appendChild(fileref) 
} 
function getRelPath() { 
    for (var t = "", n = 0, n = 0; n < document.location.pathname.split("/").length - 3; n++) t += "../"; 
    return (t) 
} 

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js"); 
loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js"); 
loadjscssfile(getRelPath() + "DataValidationFunctions2.js"); 

Теперь, когда мы имеем это в месте, мы спорадически получить «Jquery не определен» ошибки, как правило, приходят из JQuery .formatCurrency.js. Когда мы не получаем эту ошибку, jQuery отлично работает, когда мы это делаем, это не работает вообще. Это спорадически из одного браузера (IE10) один момент к другому. Поскольку динамический код загружает как jquery-1.10.1.js ~, так и ~ jquery.formatCurrency.js в правильном порядке, я бы подумал, что код должен был бы успешно загрузить первый до последнего.

Мы также обновили IIS, чтобы отключить как динамическое, так и статическое сжатие содержимого в папке JavaScript, где jQuery живет, когда я где-то читал, что может вызвать эту проблему. Я очистил весь кеш и все еще имею проблему.

+0

Необходимо использовать обратные вызовы. Вы загружаете скрипты асинхронно, поэтому нет гарантии, что они будут загружаться в требуемом порядке. –

+0

Спасибо Kevin, Как мне использовать обратные вызовы? Можете ли вы привести пример? –

ответ

0

Вы загружаете скрипты асинхронно, поэтому нет никакой гарантии, что они будут загружаться в требуемом порядке. Поэтому вы должны добавить функцию обратного вызова, чтобы вы могли убедиться, что сценарий завершил загрузку до начала следующего.

function loadjscssfile(filename, callback) { 
    var fileref = document.createElement('script'); 
    fileref.onreadystatechange = fileref.onload = function() { 

     var state = fileref.readyState; 

     if (!callback.done && (!state || /loaded|complete/.test(state))) { 
      callback.done = true; 
      callback(); 
     } 
    }; 
    fileref.setAttribute("type", "text/javascript"); 
    fileref.setAttribute("src", filename); 

    if (typeof fileref != "undefined") document.getElementsByTagName("head")[0].appendChild(fileref); 

} 

function getRelPath() { 
    for (var t = "", n = 0, n = 0; n < document.location.pathname.split("/").length - 3; n++) t += "../"; 
    return (t) 
} 

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js",function(){ 
    loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js",function(){   
     loadjscssfile(getRelPath() + "DataValidationFunctions2.js"); 
    }); 
}); 
+0

Ах, я понял! Спасибо, Кевин. Я буду работать над исправлением этого сейчас. :) –

+0

Это отлично поработало с одной настройкой: 'if (callback! = Undefined &&! Callback.done && (! State || /loaded|complete/.test(state)))' Большое вам спасибо - это было вождение меня орехи. Я бы проголосовал за вас, но, видимо, у меня пока нет достаточной репутации. ;) –

+0

Рад, что я мог помочь. –

0

Почему бы не просто подождать, пока вы точно не знаете, загружается jQuery, например.

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js"); 

setTimeout(function() {  
    if (jQuery === undefined) { 
     console.log("jQuery not loaded. Checking again.") 
     setTimeout(arguments.callee, 40); 
     return; 
    } 

    console.log("jQuery is loaded. Continue"); 
    // Code that depends on jQuery 
    loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js"); 
    loadjscssfile(getRelPath() + "DataValidationFunctions2.js");  
}, 40); 
Смежные вопросы