Utilisation de jQuery .load rompt les liens avec d’autres ressources de la bibliothèque?

StackOverflow https://stackoverflow.com/questions/303026

  •  08-07-2019
  •  | 
  •  

Question

J'ai une simple page HTML avec un div. J'utilise jQuery pour charger le contenu d'une application aspx dans le "contenu". div. Le code ressemble à ceci:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">
    </script>
    <script type="text/javascript">
        jQuery.noConflict();
    </script>
</head>
<body>
    <div id="content">
        <div id="loading"> 
            <div class="loading-indicator">Loading...</div>
        </div>
    </div>
</body>
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#content").load("default.aspx");
    });
</script>
</html>

Le problème est default.aspx utilise shadowbox et d'autres bibliothèques javascript. Lorsque ce code tente de s'exécuter sur default.aspx, il agit comme si les fichiers source js n'étaient pas chargés. Je vérifie dans firebug et les fichiers js sont là (pas de 404 ou quoi que ce soit). Quelqu'un sait ce que je manque? Comme vous pouvez le constater, j’ai utilisé la fonction jQuery noConflict parce que j’imaginais que l’utilisation de $ pouvait être en conflit avec les autres bibliothèques, mais pas d’aide là-bas ...

Était-ce utile?

La solution

Le code qui ne s’exécute pas est-il rendu en tant que blocs de script? Je comprends les bibliothèques chargées, mais aucun bloc de script ou javascript en ligne ne sera exécuté s’il est chargé de manière dynamique de cette manière. Vous devez trouver une solution qui évaluera les blocs de script renvoyés pour en vérifier la validité. Je verrai si je peux trouver un exemple dans un prototype, je me souviens qu’ils en avaient un.

MISE À JOUR:

Ceci vient directement du prototype ...

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>'

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  }

Bien sûr, vous pouvez simplifier cela pour vos besoins, mais quand une page est renvoyée de manière dynamique, vous devez évaluer manuellement tous les scripts car le navigateur n'évaluera pas le script injecté dans l'élément automatiquement.

Autres conseils

J'ai le code qui fait cela, il sera peut-être plus détaillé que nécessaire, mais les fichiers JS imbriqués ne devraient pas poser de problème.

jQuery.get('default.aspx', null, function(data) {
    $('#default').append(data);
}, 'html');

Ressemble à un problème courant: http://andreineculau.wordpress.com/2006/09/29/ajax-ondemand-javascript-or-dynamic-script-tags/

Je suppose que la sécurité des navigateurs est intégrée pour empêcher une réponse ajax d'exécuter un script arbitraire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top