2010-12-13 13 views
7

Ho creato un widget JavaScript che deve essere incorporato in qualsiasi sito di terze parti, in qualsiasi ambiente. Il widget si basa su jQuery e jQuery UI. Ho seguito i passaggi in How to embed Javascript widget that depends on jQuery into an unknown environment per aggiungere jQuery in modo responsabile: funziona perfettamente per l'integrazione di jQuery. Ma quando provo ad aggiungere l'interfaccia utente di jQuery, fallisce. Ecco il codice:Perché l'interfaccia utente di jQuery non visualizza 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'); 
    }); 
}); 

Quando eseguo questo, ho la mesage 'caricato', seguito da un errore dicendo che "$ non è definito" on line 15 di jQuery-ui.js. Ma come posso $ essere indefinito quando sto usando $ .getScript() per caricare l'interfaccia utente di jQuery? E perché vedo il messaggio "caricato" prima di ricevere l'errore? Secondo la documentazione di jQuery, getScript non dovrebbe eseguire il callback fino a quando lo script non è stato caricato ed eseguito.

C'è un modo per utilizzare questo framework per includere l'interfaccia utente di jQuery o devo utilizzare un caricatore di script come RequireJS per caricare tutto, applicare le dipendenze, ecc.?

risposta

7

Chiamando .noConflict(1), lo stesso di .noConflict(true), si sta eliminando jQuery, è sufficiente rimuovere il 1. L'argomento true a .noConflict() dice a jQuery di rimuovere non solo $, ma window.jQuery, che l'interfaccia utente di jQuery sta cercando di utilizzare in seguito, quando i carichi di sono.

You can test it here, vedere non ci sono errori nella console.

+0

bah! Era così. Caricamento piacevole in FF/Chrome/Safari. – venutip

+0

+1 per avere ragione :) – alex

+0

+ per essere Nick Craver. –

Problemi correlati