4 votes

Empêcher l'exécution de script au chargement (ou à l'analyse) en jQuery

Je dispose d'un "moteur ajax" basé sur jQuery. Et après avoir reçu la réponse, je dois manipuler la réponse avant de l'insérer dans la page. Mais j'ai besoin que la réponse soit un objet jQuery. Je fais cela avec :

tmpActualResult = $( '' ).html( actualResult );

Mais à ce moment-là, jQuery (ou le navigateur lui-même ?) exécute les scripts inclus dans la réponse - et cela ne devrait pas se produire. Je vais exécuter les scripts manuellement plus tard.

En particulier, je vais :

  1. analyser la réponse (accéder aux balises/éléments inclus)
  2. insérer les éléments dans la page (manipulation du DOM)
  3. exécuter les scripts éventuels (qui sont reçus)

je vous remercie

Éditer : Si quelqu'un est également intéressé, j'ai créé une solution plus générale en étendant la fonction jQuery.domManip, comme suggéré dans la première réponse.

(function($, oldDomManip) {
// Remplacer la fonction core domManip
$.fn.domManip = function() {

    function evalScript(i, elem) {
        jQuery.globalEval(elem.text || elem.textContent || elem.innerHTML || "");
    }

    var scripts = [];
    // laissez jQuery construire les fragments
    var results = jQuery.buildFragment(arguments[0], this, scripts);
    // changer le paramètre pour les fragments créés
    arguments[0] = results.fragment.childNodes;
    // faire ce que jQuery fera - sans scripts
    oldDomManip.apply(this, arguments);
    if (scripts.length) {
        // si la connexion est active
        if (jQuery.active != 0) {
            $(this).bind("ajaxStop.scriptCache", function() {
                $.each(scripts, evalScript);
                $(this).unbind("ajaxStop.scriptCache");
            });
        } else
            $.each(scripts, evalScript);
    }
    return this;
};
})(jQuery, jQuery.fn.domManip);

il n'exécutera pas les scripts avant que la requête ajax soit terminée. ça a marché pour moi.

4voto

Gísli Konráð Points 1966

Vous ne pouvez pas empêcher l'exécution de scripts qui font partie d'une chaîne de balisage que vous essayez d'ajouter en utilisant .html() ou .append(). Du moins pas sans étendre la fonction domManip de jQuery. Elle extrait tous les scripts dans le balisage html que vous essayez d'ajouter en utilisant .html() ou .append() et les évalue.

Cependant, vous pouvez extraire les balises de script avec leur texte interne (js) de la chaîne vous-même, ajouter seulement le balisage via .html() ou .append() puis évaluer les scripts vous-même quand vous en avez besoin.

1voto

jscheel Points 873

Essayez ceci :

var container = document.createElement('div');
container.innerHTML = " je suis du HTML avec une balise de script alert('Script exécuté');fin"
$(container).doSomething()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X