7
votes

charger jQuery de la source externe si elle n'est pas chargée

charger jQuery de la source

Ce que j'aime faire, c'est laisser tomber mon jquery.js local et avoir Il a hébergé ailleurs. Mais si Google est en panne? Alors Consultons une baisse qui utilise une autre source si jQuery est "toujours" non chargé ...

J'ai fait ce cas de test mais il ne semble pas fonctionner, peut-être Quelqu'un peut m'aider à sortir:

http://jsfiddle.net/rbz4n


3 commentaires

Pouvez-vous s'il vous plaît être un peu plus explicite avec ce que vous voulez faire?


Google étant down entraînerait l'implication Internet. Pas de soucis.


Un CDN tel que Google est très peu probable de descendre. Le codage autour d'un événement aussi improbable va probablement simplement polluer votre code :(


5 Réponses :


1
votes

Le problème

Si vous utilisez Firebug et voyez où JQuery est chargé, vous pouvez voir que Taht Google le chargé avec succès avec succès. Pourquoi cela ne semble pas fonctionner? Parce que les demandes sont asynchrones et que votre script fonctionne de manière synchrone, il exécute toutes les étapes avant que le premier script ne soit chargé.

SO:

  1. jQuery pas présent.
  2. Ajouter un élément de script à charger à partir de Google (navigateur envoie une demande et poursuit l'exécution du script)
  3. jQuery non présent ajoutez une autre source
  4. ...

    etc etc.

    Solution

    Ce que vous devriez faire est de joindre à surcharger événement de vos éléments de chargement de script et vérifiez que jQuery après avoir chargé.

    script exécute un éclair rapide par rapport à l'envoi d'une demande sur un serveur sur Internet et de récupérer les résultats pour le traitement.

    Notes supplémentaires

    Comme je l'ai lu, vous allez avoir des problèmes de détection 404 à l'aide de cette technique. La manière suggérée serait d'utiliser Ajax (XHR), puis de joindre un élément de script et d'ajouter du contenu reçu. Ce serait le moyen le plus fiable de le faire pour tous les navigateurs.


1 commentaires

Donc, un paramétrage avant de vérifier si JQuery est chargé peut aider?



2
votes

Le problème avec votre script est que vous n'attendez pas que le script se charge avant de tester si JQuery a été chargé. Utilisez quelque chose comme ça à la place:

function loadScript(src, callback) {
    var head=document.getElementsByTagName('head')[0];
    var script= document.createElement('script');
    script.type= 'text/javascript';
    script.onreadystatechange = function () {
        if (this.readyState == 'complete' || this.readyState == 'loaded') {
            callback();
        }
    }
    script.onload = callback;
    script.src = src;
    head.appendChild(script);
}

function isjQueryLoaded() {
    return (typeof jQuery !== 'undefined');
}

function tryLoadChain() {
    var chain = arguments;
    if (!isjQueryLoaded()) {
        if (chain.length) {
            loadScript(
                chain[0],
                function() {
                    tryLoadChain.apply(this, Array.prototype.slice.call(chain, 1));
                }
            );
        } else {
            alert('not loaded!');
        }
    } else {
        alert('loaded!');
    }
}

tryLoadChain(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js',
    'http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.4.min.js',
    'mine.js');


2 commentaires

MHHH - Je peux même supprimer les sources de TryDoadchain et votre script toujours alerte: chargé ... ne fonctionne pas pour moi


non ça ne le fait pas. Changez la première URL afin que vous obtiendrez un 404. Il va simplement arrêter d'exécuter. Au moins cela m'a fait pour moi.



7
votes

Cela fonctionne assez bien (de HTML5 Boider ):

<!-- Grab Google CDN's jQuery. fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="js/libs/jquery-1.4.2.js"%3E%3C/script%3E'))</script>


1 commentaires

C'est une cadeau! Merci beaucoup! C'est exactement ce que je cherchais!



4
votes

Voici une solution JavaScript pure qui commence par détecter si JQuery est disponible. Sinon, il essaie la version CDN. Si cela n'est pas disponible, il essaie la version locale. Gère 404 erreurs. J'utilise cela dans une solution qui ne sait pas si le site Web a inclus JQuery.

<script>
if (typeof jQuery === "undefined") {
  loadjQuery("//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js", verifyJQueryCdnLoaded);
} else 
  main();

function verifyJQueryCdnLoaded() {
  if (typeof jQuery === "undefined")
    loadjQuery("script/jquery-1.6.1.js", main);
  else
    main();
}

function loadjQuery(url, callback) {
  var script_tag = document.createElement('script');
  script_tag.setAttribute("src", url)
  script_tag.onload = callback; // Run callback once jQuery has loaded
  script_tag.onreadystatechange = function () { // Same thing but for IE
    if (this.readyState == 'complete' || this.readyState == 'loaded') callback();
  }
  script_tag.onerror = function() {
    loadjQuery("script/jquery-1.6.1.js", main);
  }
  document.getElementsByTagName("head")[0].appendChild(script_tag);
}

function main() {
  if (typeof jQuery === "undefined")
    alert("jQuery not loaded.");

  $(document).ready(function () {
    // Rest of your code here...
  });

}

</script>


2 commentaires

J'ai essayé d'utiliser quelque chose comme ça en écrivant un signet pour être utilisé avec Jira. Le test "type de jQuery ===" non défini "" a toujours échoué. Il s'est avéré que Jira utilisait des scripts qui utilisaient JQuery, comme Fancybox, qui a provoqué la définition de "jQuery" comme fonction, mais "$" n'a toujours pas été défini. J'ai changé le test dans la condition et JQuery serait chargé correctement.


Wow. Je n'ai jamais vu autant de code utilisé pour résoudre un problème aussi simple. Vous devez aimer taper ... :)



0
votes

La réponse de Roger est ridicule. Ici, utilisez cela à la place, ses 2 lignes.

<script>window.jQuery || document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"><\/script>')</script> 
<script>window.jQuery || document.write('<script src="Content/Scripts/jquery-1.9.1.min.js"><\/script>')</script>


4 commentaires

Il y a beaucoup de bonnes façons d'ajouter un nœud de script à la DOM. document.write n'est pas parmi eux.


@editor - soins à expliquer? Parce que presque toutes les réponses postées ici s'appuient sur Document.Write () et cela semble être le moyen standard de le faire.


Stackoverflow.com/ Questions / 802854 / ... En bref, car cela vous donne la possibilité d'écrire directement sur la page, il est très facilement maltraité, et s'il est malabusé, potentiellement un trou de sécurité. Il a été évité ici car il y a généralement des moyens plus agréables de faire la même chose. En tant que note latérale, pour un grand projet, examinez le chargement de style AMD, éventuellement avec quelque chose comme besoin.js.


@RobertChrist - Au fait, dans ce poste lui-même, il est dit que c'est l'une des utilisations légitimes du document.write ..