Bookmarklet attendez jusqu'à ce que Javascript soit chargé

J'ai un bookmarklet qui charge jQuery et d'autres bibliothèques js.

Comment puis-je:

  • Attendez jusqu'à ce que la bibliothèque javascript que j'utilise soit disponible / chargée. Si j'essaie d'utiliser le script avant de terminer le chargement, comme en utilisant la fonction $ avec jQuery avant d'être chargée, une exception indéfinie est lancée.
  • Assurez-vous que le bookmarklet que je charge ne sera pas mis en cache (sans utiliser un en-tête de serveur, ou, évidemment, étant qu'il s'agit d'un fichier javascript: une metatag )

Est-ce que quelqu'un est conscient que si oncharge des javascript ajoutés dynamiquement fonctionne dans IE? (Pour contredire cette publication )

Quelle est la solution la plus simple, la résolution la plus propre à ces problèmes?

    Cela dépend de la façon dont vous chargez réellement jQuery. Si vous ajoutez un élément de script à la page, vous pouvez utiliser la même technique que jQuery utilise pour charger dynamiquement un script.

    EDIT : J'ai fait mes devoirs et j'ai effectivement extrait une fonction loadScript à partir du code jQuery à utiliser dans votre bookmarklet. Il pourrait en fait être utile pour beaucoup (y compris moi).

    function loadScript(url, callback) { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.src = url; // Attach handlers for all browsers var done = false; script.onload = script.onreadystatechange = function() { if( !done && ( !this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) { done = true; // Continue your code callback(); // Handle memory leak in IE script.onload = script.onreadystatechange = null; head.removeChild( script ); } }; head.appendChild(script); } // Usage: // This code loads jQuery and executes some code when jQuery is loaded loadScript("https://code.jquery.com/jquery-latest.js", function() { $('my_element').hide(); }); 

    Pour répondre à votre première question: Javascript est interprété séquentiellement, de sorte que tout code de bookmarklet suivant ne sera exécuté que lorsque la bibliothèque sera chargée (en supposant que la bibliothèque a été interprétée avec succès – pas d'erreurs de syntaxe).

    Pour éviter que les fichiers ne soient mis en cache, vous pouvez ajouter une chaîne de requête sans signification …

     url = 'jquery.js?x=' + new Date().getTime(); 

    J'ai noté que, dans Chrome, l'ordre des scripts chargés est indéterminé lorsque vous utilisez la technique @Vincent Robert. Dans ce cas, une petite modification aide:

     (function() { var callback = function() { // Do you work }; // check for our library existence if (typeof (MyLib) == 'undefined') { var sources = [ 'http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js', 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js', 'http://myhost.com/javascripts/mylib.min.js']; var loadNextScript = function() { if (sources.length > 0) { var script = document.createElement('script'); script.src = sources.shift(); document.body.appendChild(script); var done = false; script.onload = script.onreadystatechange = function() { if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) { done = true; // Handle memory leak in IE script.onload = script.onreadystatechange = null; loadNextScript(); } } } else { callback(); } } loadNextScript(); } else { callback(); } })(); 

    Je me rapproche un peu de cela , mais pas complètement. Il serait bon d'avoir un exemple discret d'un bookmarklet qui a démontré comment éviter la mise en cache.