2010-12-13 1 views
7

Я построил виджет JavaScript, который должен быть внедрен на любой сторонний сайт в любой среде. Виджет использует jQuery и jQuery UI. Я выполнил шаги в How to embed Javascript widget that depends on jQuery into an unknown environment, чтобы добавить jQuery ответственным образом - отлично работает для встраивания jQuery. Но когда я пытаюсь добавить jQuery UI, он терпит неудачу. Вот код:Почему интерфейс jQuery не отображается jQuery?

(function(window, document, version, callback) { 
    var j, d; 
    var loaded = false; 
    if (!(j = window.jQuery) || version > j.fn.jquery || callback(j, loaded)) { 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"; 
    script.onload = script.onreadystatechange = function() { 
     if (!loaded && (!(d = this.readyState) || d == "loaded" || d == "complete")) { 
      callback((j = window.jQuery).noConflict(1), loaded = true); 
      j(script).remove(); 
     } 
    }; 
    document.documentElement.childNodes[0].appendChild(script) 
    } 
})(window, document, "1.3.2", function($, jquery_loaded) { 
    $.getScript('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.js', function(){ 
     console.log('loaded'); 
    }); 
}); 

Когда я запускаю это, я получаю «загружено», а затем электронное письмо ошибки, говоря, что «$ неопределенен» в строке 15 Jquery-ui.js. Но как можно $ undefined, когда я использую $ .getScript() для загрузки jQuery UI? И почему я вижу сообщение «загружено», прежде чем я получу ошибку? Согласно документации jQuery, getScript не должен выполнять обратный вызов, пока скрипт не будет загружен и не запущен.

Можно ли использовать эту инфраструктуру для включения пользовательского интерфейса jQuery, или мне нужно использовать загрузчик сценариев, например RequireJS, для загрузки всего, обеспечения зависимостей и т. Д.?

ответ

7

По телефону .noConflict(1), то же, что и .noConflict(true), вы удаляете jQuery, просто удалите 1. Аргумент true для .noConflict() сообщает jQuery удалить не только $, но и window.jQuery, который пользовательский интерфейс jQuery пытается использовать, когда его загрузок.

You can test it here, см. Ошибки в консоли.

+0

бах! Вот и все. Хорошая загрузка в FF/Chrome/Safari. – venutip

+0

+1 за то, что он прав :) – alex

+0

+ за то, что он был Nick Craver. –