L'appel d'une fonction JavaScript retourné à partir d'une réponse Ajax
J'ai un système où j'ai envoyer une requête Ajax commande, qui renvoie un bloc de script avec une fonction en elle. Après ces données est correctement inséré dans le DIV, je veux être en mesure d'appeler cette fonction pour effectuer les actions requises.
Est-ce possible?
Vous devez vous connecter pour publier un commentaire.
Je pense que pour interpréter correctement à votre question sous cette forme: "OK, j'ai déjà fait avec de l'Ajax choses; je souhaite juste savoir si la fonction JavaScript de mon Ajax rappel inséré dans le DIV est dénonçable à tout moment à partir de ce moment, qui est, je ne veux pas l'appeler contextuellement à la fonction de rappel de retour".
OK, si tu veux dire quelque chose comme cela, la réponse est oui, vous pouvez appeler votre nouveau code en ce moment, à n'importe quel moment pendant la page de la persistance dans le navigateur, dans les conditions suivantes:
1) l'option JavaScript de Votre code renvoyé par Ajax fonction de rappel doit être syntaxiquement CORRECTE;
2) Même si votre déclaration de fonction est insérée dans un
<script>
bloc à l'intérieur d'un<div>
élément, le navigateur ne sais pas la nouvelle fonction existe, comme le code de déclaration n'a jamais été exécuté. Ainsi, vous devez vouseval()
votre déclaration code renvoyé par l'Ajax de rappel, afin de bien déclarer votre nouvelle fonction et qu'il soit disponible pendant toute la page, de la durée de vie.Même si tout à fait factice, ce code explique l'idée:
Je n'ai pas utiliser Ajax, mais le concept est le même (même si l'exemple que j'ai choisi n'est pas très intelligent 🙂
De façon générale, je ne remets pas en cause votre conception de la solution, c'est à dire s'il est plus ou moins approprié à extérioriser + généraliser la fonction dans un autre .fichier js et autres, mais veuillez prendre note qu'une telle solution pourrait soulever plus de problèmes, surtout si votre Ajax invocations de répétition, c'est à dire si le cadre de la même fonction, doit changer ou, dans le cas de la fonction déclarée persistance doit être concerné, donc peut-être que vous devriez sérieusement envisager de changer votre conception de l'un de ces exemples dans ce fil.
Enfin, si j'ai mal compris votre question, et vous parlez contextuelle invocation de la fonction lors de votre Ajax callback retourne, puis mon sentiment est de proposer le Prototype approche décrit par krosenvold, comme il est cross-browser, testé et entièrement fonctionnel, et cela peut vous donner une meilleure feuille de route pour les futures implémentations.
À l'intérieur de l'retourné HTML/Ajax/JavaScript fichier, vous aurez une balise JavaScript. Donner un ID, comme runscript. Il est rare d'ajouter un id à ces balises, mais il est nécessaire de faire référence spécifiquement.
Dans la fenêtre principale, puis d'appeler la fonction eval en évaluant seulement que le NOUVEAU bloc de code JavaScript (dans ce cas, il est appelé runscript):
Et ça marche, au moins dans Internet Explorer 9 et Google Chrome.
<script id="my-secure-id">
tag. Je ne vois pas de sécurité supplémentaire en utilisant cette solution. En fait, il ne vous donne que le faux sentiment de sécurité, ce qui est encore plus dangereux. Mais 6 ans plus tard, le HTTPS est maintenant beaucoup plus courant. Je crois qu'une attaque sur la fonction eval() ne devrait pas être possible sécurisée via HTTPS. Je me trompe en supposant que?Il est tout à fait possible, et il y en a même assez légitime en cas d'utilisation de ce. À l'aide de la Prototype cadre, il est fait comme suit.
Voir la documentation de l'Ajax programme de mise à jour. Les options sont dans le commune des options de jeu. Comme d'habitude, il y a quelques mises en garde à propos de lorsque "cela" points de, afin de lire les petits caractères.
Le code JavaScript sera évalué lors du chargement. Si le contenu contient la fonction
myFunc(),
on pourrait juste dire
myFunc()
par la suite. Peut-être comme suit.Celui-ci vérifie si la fonction existe. Peut-être que quelqu'un a une meilleure manière de croix-navigateur de faire ce qui fonctionne dans Internet Explorer 6.
if (myFunc) myFunc()
Qui semble plutôt étrange conception de votre code, il fait généralement plus de sens d'avoir de vos fonctions appelées directement à partir d'un .js fichiers, et ensuite seulement de récupérer des données avec l'appel Ajax.
Cependant, je crois qu'il devrait travailler en appelant eval() sur la réponse fournie, il est syntaxiquement correct du code JavaScript.
Avec jQuery, je le ferais à l'aide de getScript
Rappelez-vous juste, si vous créez une fonction de la façon ci-dessous par le biais de l'ajax...
...et de l'exécuter via eval, vous aurez probablement un contexte de problème.
Prenez ce que votre fonction de rappel:
Vous serez la déclaration d'une fonction à l'intérieur d'une fonction, de sorte que cette nouvelle fonction sera accessible uniquement sur cette portée.
Si vous souhaitez créer une fonction globale dans ce scénario, vous pouvez déclarer cette façon:
Mais, je pense aussi que vous ne devriez pas faire ça...
Désolé pour toute erreur ici...
Je voudrais ajouter qu'il y a une fonction eval en jQuery vous permettant de eval le code à l'échelle mondiale qui devrait vous permettre de vous débarrasser de toutes les contextuelle des problèmes. La fonction est appelée globalEval() et il a travaillé beaucoup pour mes fins. Sa documentation peut être trouvée ici.
C'est l'exemple de code fourni par le jQuery documentation de l'API:
Cette fonction est extrêmement utile quand il s'agit de chargement de scripts externes de façon dynamique qui vous ont apparemment été d'essayer de faire.
Une liste de contrôle pour faire une telle chose:
func_name = function() {...}
Mieux encore, l'utilisation des cadres qui les manipule comme dans Prototype. Vous avez
Ajax.updater
.PHP code côté
Nom de fichier class.sendCode.php
Maintenant à partir de votre page Html, vous devez déclencher la fonction ajax pour envoyer les données.
Maintenant à notre local script.js nous allons définir l'ajax
Ce n'est pas une bonne idée.
Vous devriez abstraction de la fonction à inclure dans le reste de votre code JavaScript à partir des données retournées par les méthodes Ajax.
Pour ce que ça vaut, cependant, (et je ne comprends pas pourquoi vous êtes l'insertion d'un bloc de script dans un div?) même script en ligne méthodes écrites dans un bloc de script sera accessible.
Mon habitude ajax qui appelle la fonction:
Quelques explications:
targetId
est un (généralement div) ID de l'élément où l'ajax résultat de l'appel de texte va.url
ajax est l'appel de l'url.busyMsg
sera temporaire de texte dans l'élément cible.finishCB
sera appelée lorsque l'ajax opération terminée avec succès.Comme vous le voyez dans le
xhr.onreadystatechange = function() {...}
tous les<script>
éléments seront collectées à partir de la réponse ajax et seront exécutés un par un. Il semble fonctionner très bien pour moi. Les deux dernier paramètre est facultatif.Je l'ai testé et ça marche. Quel est le problème? Il suffit de mettre la nouvelle fonction à l'intérieur de votre élément javascript et ensuite l'appeler. Il va travailler.
J'ai essayé toutes les techniques proposées ici, mais enfin, la voie qui a travaillé était simplement pour mettre la fonction JavaScript à l'intérieur de la page /fichier où il est censé se produire et l'appeler à partir de la réponse de la partie de l'Ajax simplement comme une fonction:
Cette Travaillé sur la première tentative, j'ai donc décidé de partager.
Ce code de travail ainsi, au lieu eval le html, je vais ajouter le script à la tête
J'ai résolu ce problème aujourd'hui, en mettant mon code JavaScript au bas de la réponse HTML.
J'ai eu une requête AJAX qui a renvoyé un tas de code HTML qui est affiché dans une superposition. J'avais besoin de joindre un événement click d'un bouton dans la réponse renvoyée HTML/overlay. Sur une page normale, je tourne mon JavaScript dans une "fenêtre.onload" ou "$(document).prêt" de sorte qu'il serait de fixer le gestionnaire d'événement à l'objet DOM après le DOM pour le nouveau revêtement a été rendue, mais parce que c'était une réponse AJAX et pas un nouveau chargement de la page, que l'événement n'est jamais arrivé, le navigateur jamais exécuté mon JavaScript, mon gestionnaire d'événement ne l'ai jamais attaché à l'élément DOM, et mon nouveau morceau de fonctionnalité ne fonctionne pas. Encore une fois, j'ai résolu mon "en cours d'exécution de JavaScript dans un AJAX réponse problème" ne pas utiliser "$(document).ready" dans l'en-tête du document, mais en plaçant mon JavaScript à la fin du document et de l'avoir à courir après le HTML/DOM avait été rendu.
Si votre script AJAX prend que quelques millisecondes pour exécuter, la fonction eval() fonctionnera toujours de l'avant et d'évaluer le vide d'un élément de réponse avant AJAX remplit avec le script que vous essayez d'exécuter.
Plutôt que de cacher les mains autour du cadencement et de la fonction eval(), voici une jolie solution simple qui devrait fonctionner dans la plupart des situations et est probablement un peu plus sécurisé. À l'aide de la fonction eval() est généralement mal vu car les caractères de l'être évalué que le code peut facilement être manipulé côté client.
Concept
Exemple
Dans cet exemple, je veux joindre une dynamique à partir de la liste de saisie semi-jquery-ui bibliothèque AJAX élément APRÈS l'élément a été ajouté à la page. Facile, droit?
start.php
ajaxRequest.php
Federico Zancan réponse est correct, mais vous n'avez pas à donner votre script d'un IDENTIFIANT et d'eval tous de votre script. Juste eval votre nom de la fonction et il peut être appelé.
Pour atteindre cet objectif dans notre projet, nous avons écrit un proxy de la fonction à appeler la fonction renvoyée à l'intérieur de l'Ajax réponse.