Aucune idée pourquoi le morceau de code ci-dessous n’ajoute pas l’élément script au DOM ?
Réponses
Trop de publicités?La Bonne nouvelle, c'est:
C'est 100% de travail.
Juste ajouter quelque chose à l'intérieur de la balise de script tels que alert('voila!');
. La bonne question que vous pouvez poser, peut-être, "Pourquoi n'ai-je pas le voir dans les DOM?".
Karl Swedberg a fait une belle explication du visiteur commentaire en jQuery API site. Je n'est pas envie de répéter ses mots, vous pouvez lire directement il y a ici (j'ai trouvé difficile de naviguer à travers les commentaires).
Tous jQuery méthodes d'insertion d'utilisation un domManip fonction en interne pour nettoyer/processus d'éléments avant et après ils sont insérés dans le DOM. L'une des choses les domManip la fonction n'est de sortir un script éléments pour être inséré et exécuter grâce à un "evalScript routine" plutôt que de les injecter avec le reste le DOM fragment. Il insère l' les scripts séparément, les évalue,les et puis les supprime de la DOM.
Je crois que l'une des raisons pour jQuery c'est pour éviter "l'Autorisation Refusé" les erreurs qui peuvent se produire dans Internet Explorer lors de l'insertion les scripts dans certaines circonstances. Il évite aussi à plusieurs reprises insertion/évaluation de la même script (ce qui pourrait potentiellement causer les problèmes), si c'est dans un contenant l'élément que vous êtes de l'insertion et de puis en se déplaçant autour de la DOM.
La prochaine chose est, je vais résumer ce qu'est la mauvaise nouvelle en utilisant .append()
fonction pour ajouter un script.
Et La Mauvaise nouvelle, c'est..
Vous ne pouvez pas déboguer votre code.
Je ne plaisante pas, même si vous l'ajoutez debugger;
mot-clé entre la ligne que vous souhaitez définir en tant que point d'arrêt, vous serez en fin de compte seulement de la pile d'appel de l'objet sans le voir le point d'arrêt sur le code source, (pour ne pas mentionner que ce mot-clé ne fonctionne que dans le navigateur webkit, tous les autres grands navigateurs semble omettre ce mot-clé).
Si vous comprenez ce que votre code n', que ce sera un inconvénient mineur. Mais si vous ne le faites pas, vous finirez par l'ajout d'un debugger;
mot clé de tous sur la place juste pour savoir quel est le problème avec votre (ou mon) du code. De toute façon, il y a une alternative, n'oubliez pas que le javascript peut nativement manipuler le DOM HTML.
Solution de contournement.
L'utilisation de javascript (pas de jQuery) pour manipuler le DOM HTML
Si vous ne voulez pas perdre la fonctionnalité de débogage, que vous pouvez utiliser javascript HTML natif de manipulation du DOM. Considérons cet exemple:
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "path/to/your/javascript.js"; // use this for linked script
script.text = "alert('voila!');" // use this for inline script
document.body.appendChild(script);
Ça y est, tout comme les vieux jours, n'est-ce pas. Et n'oubliez pas de nettoyer les choses savoir si, dans les DOM ou dans la mémoire de tous les objets référencés et n'a plus besoin pour éviter les fuites de mémoire. Vous pouvez considérer ce code pour nettoyer les choses:
document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.
L'inconvénient de cette solution est que vous pouvez accidentellement ajouter un script doublon, et que c'est mal. De là, vous pouvez légèrement imiter .append()
de la fonction par l'ajout d'un objet d'une vérification avant l'ajout et la suppression du script à partir de la DOM juste après il a été ajouté. Considérons cet exemple:
function AddScript(url, object){
if (object != null){
// add script
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "path/to/your/javascript.js";
document.body.appendChild(script);
// remove from the dom
document.body.removeChild(document.body.lastChild);
return true;
} else {
return false;
};
};
function DeleteObject(UnusedReferencedObjects) {
delete UnusedReferencedObjects;
}
De cette façon, vous pouvez ajouter un script avec la fonctionnalité de débogage, sûrs de script de la duplicité. C'est juste un prototype, vous pouvez ajouter ce que vous voulez qu'il soit. J'ai été en utilisant cette approche, et très satisfait de cette. Bien sûr je ne vais jamais utiliser jquery .append()
ajouter un script.
Heureux De Codage,
Hendra Uzia.
J’ai noté des problèmes où certains navigateurs ne respectent pas certains changements lorsque vous les faites directement (j’entends par créer le code HTML du texte comme vous essayez avec la balise script), mais lorsque vous les faites avec commandes intégrées, les choses vont mieux. Essayez ceci :
À partir de : http://mg.to/2006/01/25/json-for-jquery
Il est possible de charger dynamiquement un fichier JavaScript à l’aide du fonction jQuery ``
$.getScript('http://www.whatever.com/shareprice/shareprice.js', function() { Display.sharePrice(); }) ;
Maintenant le script externe s’appellera, et s’il ne peut pas être chargé il va se dégrader avec élégance.
Tu veux dire quoi par "pas de travail"?
jQuery détecte que vous êtes en train de créer un élément de SCRIPT et démarre automatiquement le contenu de l'élément dans le contexte mondial. Êtes-vous en train de me dire que cela ne fonctionne pas pour vous? -
$('#someElement').append('<script>alert("WORKING");</script>');
Edit: Si vous ne voyez pas le SCRIPT élément dans le DOM (dans Firebug par exemple) après l'exécution de la commande c'est parce que jQuery, comme je l'ai dit, va exécuter le code et ensuite supprimer l'élément SCRIPT - je crois que les éléments de SCRIPT sont toujours ajoutées au corps... mais de toute façon - le placement n'a absolument aucune incidence sur l'exécution de code dans cette situation.