2010-12-13 20 views
7

Zbudowałem widżet JavaScript, który musi być umieszczony w dowolnej witrynie strony trzeciej, w dowolnym środowisku. Widżet opiera się na jQuery i jQuery UI. Postępowałem zgodnie z instrukcjami w How to embed Javascript widget that depends on jQuery into an unknown environment, aby dodać jQuery w odpowiedzialny sposób - działa świetnie na osadzanie jQuery. Ale kiedy próbuję dodać interfejs użytkownika jQuery, nie działa. Oto kod:Dlaczego interfejs jQuery nie wyświetla 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'); 
    }); 
}); 

Gdy uruchomię to pojawia się „załadowany” mesage, a następnie błąd mówiąc, że „$ jest niezdefiniowana” na linii 15 jQuery ui.js. Ale w jaki sposób $ może być niezdefiniowane, gdy używam $ .getScript() do załadowania interfejsu użytkownika jQuery? I dlaczego widzę komunikat "załadowany" zanim otrzymam błąd? Zgodnie z dokumentacją jQuery, getScript nie powinien wykonywać wywołania zwrotnego, dopóki skrypt nie zostanie załadowany i wykonany.

Czy istnieje sposób, w jaki mogę użyć tej struktury do włączenia interfejsu jQuery, czy też muszę użyć programu ładującego skrypt, takiego jak RequireJS, aby załadować wszystko, wymusić zależności, itp.?

Odpowiedz

7

Dzwoniąc pod numer .noConflict(1), taki sam jak .noConflict(true), usuwasz jQuery, po prostu usuń 1. Argument true dla .noConflict() mówi jQuery, aby usunąć nie tylko $, ale window.jQuery, który jQuery UI próbuje później użyć, gdy ładuje się.

You can test it here, patrz brak błędów w konsoli.

+0

bah! To było to. Ładuje się ładnie w FF/Chrome/Safari. – venutip

+0

+1 za bycie prawym :) – alex

+0

+ za bycie Nickiem Craverem. –

Powiązane problemy