Réagissez: La balise de script ne fonctionne pas lorsqu'elle est insérée avec dangerouslySetInnerHTML
Je suis en train de définir html envoyé à partir de mon serveur pour afficher dans une div à l'aide de dangerouslySetInnerHTML propriété de Réagir. J'ai également balise de script à l'intérieur et à utiliser les fonctions définies dans les même à l'intérieur de que html. J'ai fait l'exemple de l'erreur dans JSFiddle ici.
C'est le code de test:
var x = '<html><scr'+'ipt>alert("this.is.sparta");function pClicked() {console.log("p is clicked");}</scr'+'ipt><body><p onClick="pClicked()">Hello</p></body></html>';
var Hello = React.createClass({
displayName: 'Hello',
render: function() {
return (<div dangerouslySetInnerHTML={{__html: x}} />);
}
});
J'ai vérifié et la balise script est ajouté à DOM, mais ne peut pas appeler les fonctions définies à l'intérieur de cette balise de script. Si ce n'est pas la bonne manière est-il un autre moyen par lequel je peux injecter le script contenu de la balise.
source d'informationauteur meteors
Vous devez vous connecter pour publier un commentaire.
Voici un peu d'une sale façon de le faire ,
Un peu d'explications sur ce qui se passe ici , on extrait le contenu du script via une regex , et seulement de rendu html à l'aide de réagir , puis une fois que le composant est monté le contenu dans la balise script est exécuté sur une portée mondiale.
Je ne pense pas que vous devez utiliser la concaténation (
+
) ici.Je pense que vous pouvez le faire:
Depuis qu'il est passé à
dangerouslySetInnerHTML
de toute façon.Mais revenons à la question. Vous n'avez pas besoin d'utiliser des regex pour accéder au script du contenu de la balise. Si vous ajoutez
id
attribut, par exemple<script id="myId">...</script>
vous pouvez facilement accéder à l'élément.Nous allons voir un exemple de cette mise en œuvre.
Si vous avez plusieurs scripts, vous pouvez ajouter un attribut de données
[data-my-script]
par exemple, puis accéder à l'aide de jQuery:Dans tous les cas, il est toujours bon d'éviter d'utiliser
eval
donc, une autre option est d'obtenir le texte et ajouter une nouvelle balise script avec l'original du contenu du script au lieu d'appelereval
. Cette réponse suggère une telle approcheune petite extension pour Dasith de réponse pour l'avenir de points de vue...
J'ai eu un problème similaire, mais dans mon cas, j'ai obtenu le code HTML côté serveur et il a fallu un certain temps (une partie de la solution de reporting où backend rendra rapport à html)
donc ce que j'ai fait était très semblables que j'ai manipulé le script qui s'exécute dans le componentWillMount() fonction:
espère que c'est utile...