Une idée pourquoi le morceau de code ci-dessous n'ajoute pas l'élément de script au DOM?
var code = "<script></script>";
$("#someElement").append(code);
javascript
jquery
Dan Burzo
la source
la source
Réponses:
J'ai vu des problèmes où certains navigateurs ne respectent pas certaines modifications lorsque vous les faites directement (j'entends par là la création du HTML à partir de texte comme vous essayez avec la balise script), mais lorsque vous les faites avec des commandes intégrées les choses vont mieux. Essaye ça:
De: JSON pour jQuery
la source
script.type
est inutile.$("#someElement")[0].appendChild( script );
La bonne nouvelle c'est:
Il fonctionne à 100%.
Ajoutez simplement quelque chose à l'intérieur de la balise de script tel que
alert('voila!');
. La bonne question que vous voudrez peut-être vous poser, "Pourquoi ne l'ai-je pas vue dans le DOM?" .Karl Swedberg a fait une belle explication au commentaire du visiteur dans le site de l'API jQuery . Je
neveux répéter ses mots, vous pouvez lire directementlà - basici (je l' ai trouvé difficile de naviguer à travers les commentaires là - bas) .La prochaine chose est, je vais résumer quelles sont les mauvaises nouvelles en utilisant la
.append()
fonction pour ajouter un script.Et la mauvaise nouvelle est ..
Vous ne pouvez pas déboguer votre code.
Je ne plaisante pas, même si vous ajoutez un
debugger;
mot-clé entre la ligne que vous souhaitez définir comme point d'arrêt, vous finirez par n'obtenir que la pile d'appels de l'objet sans voir le point d'arrêt sur le code source, (sans oublier que cela mot-clé ne fonctionne que dans le navigateur webkit, tous les autres principaux navigateurs semblent omettre ce mot-clé) .Si vous comprenez parfaitement ce que fait votre code, ce sera un inconvénient mineur. Mais si vous ne le faites pas, vous finirez par ajouter un
debugger;
mot - clé partout pour découvrir ce qui ne va pas avec votre (ou mon) code. Quoi qu'il en soit, il existe une alternative, n'oubliez pas que javascript peut manipuler nativement HTML DOM.Solution de contournement.
Utilisez javascript (pas jQuery) pour manipuler HTML DOM
Si vous ne voulez pas perdre la capacité de débogage, vous pouvez utiliser la manipulation DOM HTML natif javascript. Considérez cet exemple:
Ça y est, tout comme le bon vieux temps n'est-ce pas. Et n'oubliez pas de nettoyer les choses que ce soit dans le DOM ou dans la mémoire pour tous les objets référencés et qui ne sont plus nécessaires pour éviter les fuites de mémoire. Vous pouvez considérer ce code pour nettoyer les choses:
L'inconvénient de cette solution de contournement est que vous pouvez accidentellement ajouter un script en double, et c'est mauvais. De là, vous pouvez légèrement imiter la
.append()
fonction en ajoutant une vérification d'objet avant d'ajouter et en supprimant le script du DOM juste après son ajout. Considérez cet exemple:De cette façon, vous pouvez ajouter un script avec une capacité de débogage tout en étant à l'abri de la duplicité du script. Ce n'est qu'un prototype, vous pouvez développer ce que vous voulez. J'utilise cette approche et j'en suis assez satisfait. Effectivement, je n'utiliserai jamais jQuery
.append()
pour ajouter un script.la source
$.getScript
est intégré à jQuery.Il est possible de charger dynamiquement un fichier JavaScript à l'aide de la fonction jQuery
getScript
Maintenant, le script externe sera appelé et s'il ne peut pas être chargé, il se dégradera avec élégance.
la source
eval()
.Que voulez-vous dire "ne fonctionne pas"?
jQuery détecte que vous essayez de créer un élément SCRIPT et exécutera automatiquement le contenu de l'élément dans le contexte global. Êtes-vous en train de me dire que cela ne fonctionne pas pour vous? -
Edit: Si vous ne voyez pas l'élément SCRIPT dans le DOM (dans Firebug par exemple) après avoir exécuté la commande, c'est parce que jQuery, comme je l'ai dit, exécutera le code puis supprimera l'élément SCRIPT - je crois que les éléments SCRIPT sont toujours ajoutés au corps ... mais de toute façon - le placement n'a absolument aucune incidence sur l'exécution du code dans cette situation.
la source
Cela marche:
Il semble que jQuery fasse quelque chose d'intelligent avec les scripts, vous devez donc ajouter l'élément html plutôt que l'objet jQuery.
la source
Essayez ceci peut être utile:
la source
Je veux faire la même chose mais ajouter une balise de script dans un autre cadre!
la source
Le
</script>
littéral dans la chaîne termine le script entier, pour éviter qu'il"</scr" + "ipt>"
puisse être utilisé à la place.la source
"\x3cscript\x3e\x3c/script\x3e"
. En XHTML, il vous suffit de mettre un bloc CDATA commenté.</
qui n'est pas autorisé. Voir stackoverflow.com/questions/236073/…L'ajout de l'URL source dans le fichier de script a aidé comme mentionné dans cette page: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
la source
Votre script est en cours d'exécution, vous ne pouvez tout simplement pas l'utiliser
document.write
. Utilisez une alerte pour le tester et éviter de l'utiliserdocument.write
. Les instructions de votre fichier jsdocument.write
ne seront pas exécutées et le reste de la fonction sera exécuté.la source
C'est ce que je pense être la meilleure solution. Google Analytics est injecté de cette façon.
la source
Vous n'avez pas besoin de jQuery pour créer un élément DOM de script . Cela peut être fait avec vanilla ES6 comme ceci:
Il n'a pas besoin d'être enveloppé dans un
Promise
, mais cela vous permet de résoudre la promesse lorsque le script se charge, ce qui permet d'éviter les conditions de concurrence pour les scripts de longue durée.la source
Ajoutez le script au corps:
la source
Vous pouvez également le faire si vous souhaitez ajouter du code en utilisant la
document.createElement
méthode, mais en utilisant à la.innerHTML
place de.src
.la source
J'ai essayé celui- ci et fonctionne très bien. Remplacez simplement le
<
symbole par cela\x3C
.ou
Vous pouvez tester le code ici .
la source
Peut essayer comme ça
La seule raison pour laquelle vous ne pouvez pas le faire
"<script></script>"
est que la chaîne n'est pas autorisée dans javascript car la couche DOM ne peut pas analyser ce qui est js et ce qui est HTML.la source
J'ai écrit un
npm
package qui vous permet de prendre une chaîne HTML, y compris des balises de script et de l'ajouter à un conteneur lors de l' exécution des scriptsExemple:
Trouvez-le ici: https://www.npmjs.com/package/appendhtml
la source
Créez simplement un élément en l'analysant avec jQuery.
Exemple de travail: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz
la source