J'ai une question étrange dans laquelle j'ai besoin d'injecter du JavaScript dans une autre fonction JavaScript. J'utilise un cadre qui est verrouillé afin que je ne puisse pas changer la fonction existante. P>
Qu'est-ce que j'ai, c'est quelque chose comme ça p> Fonction DOSOMODIAT () { ... }
... *** p>
Je peux manipuler le *** (ci-dessus), mais je ne peux pas changer la fonction dosomething ... Au lieu de cela, j'ai besoin d'une manière ou d'une autre injecter quelques lignes de code à la fin du code dosage. P>
La raison pour laquelle je dois faire cela est que le framework personnalisé appelle DOSOMOD () et il en résulte un ID étant renvoyé du serveur que j'ai besoin d'extraire. Cet identifiant est uniquement référencé à l'intérieur de la fonction DOSOMPHOIGHT afin que je ne puisse pas l'attraper à moins que je n'injecte du code à cette fonction (sauf si vous avez manqué quelque chose). p>
Y a-t-il un moyen de faire cela? P>
7 Réponses :
Les fonctions sont des valeurs de première classe dans JavaScript, ce qui signifie que vous pouvez les stocker dans des variables (et, en fait, déclarer une fonction nommée attribue essentiellement une fonction anonyme à une variable).
Vous devriez pouvoir faire quelque chose Comme ceci: p> (mais je pourrais avoir tort. Mon javascript est un peu rouillé.;)) p> p>
Si j'avais la question à savoir, cela ne vous aidera pas ici, car le problème est d'extraire la valeur d'une variable locale qui est uniquement référencée à l'intérieur dossomique code>. Et la nouvelle version de
Dosomething code> ne peut pas faire référence aux variables à l'intérieur de l'ancien.
alias IT.
var oldDoSomething = doSomething; doSomething = function() { // Do what you need to do. return oldDoSomething.apply(oldDoSomething, arguments); }
Il a besoin d'accès à une variable qui est scopée à la fonction d'origine
Mauvaise réponse. Nécessite un cas par utilisation de cas.
Je ne peux pas changer la fonction dosomething ... Au lieu de cela, j'ai besoin d'une manière ou d'une autre injecter quelques lignes de code à la fin du code dosage p> blockQuote>
injecter quelques lignes à la fin du
Dosomething code> Le code sonne comme modifiant le
Dosomethant code> Fonction, à moi. Je pense que malheureusement que vous êtes foutu. P>
(Je suis un peu brumeux sur tout cela, mais je pense que les fonctions sont de la manière dont les personnes qui se soucient de telles choses mettent en œuvre des informations se cachent dans JavaScript, précisément parce que vous ne pouvez pas accéder à leur portée de l'extérieur.) p>
function doSomething(){ document.write('Test'); return 45; } var code = 'myDoSomething = ' + doSomething + '; function doSomething() { var id = myDoSomething(); document.write("Test 2"); return id; }'; eval(code) doSomething();
Je ne suis pas sûr de ce que vous entendez par "verrouillé" - JavaScript est interprété par votre navigateur. Même s'il a été minifié ou codé, vous pouvez toujours copier la source de cette fonction de la source de la page du script. À ce stade, vous réaffectez la fonction d'origine à l'une de vos propres conceptions, qui contient le code copié plus le vôtre.
var id; var myFunction = function() { // code copied from their source, which contains the variable needed // insert your own code, such as for copying the needed value id = theirIDvalue; // return the value as originally designed by the function return theirValue; }; theirObject.theirFunction = myFunction;
Merci pour tous vos commentaires. Chaque réponse m'a donné un indice et en tant que tel, j'ai proposé la solution suivante.
<body> <script type="text/javascript"> var val; function doSomething(item1, item2) { var id = 3; } function merge() { var oScript = document.createElement("script"); var oldDoSomething = doSomething.toString(); oScript.language = "javascript"; oScript.type = "text/javascript"; var args = oldDoSomething.substring(oldDoSomething.indexOf("(") + 1, oldDoSomething.indexOf(")")); var scr = oldDoSomething.substring(oldDoSomething.indexOf("{") + 1, oldDoSomething.lastIndexOf("}") - 1); var newScript = "function doSomething(" + args + "){" + scr + " val = id; }"; oScript.text = newScript; document.getElementsByTagName('BODY').item(0).appendChild(oScript); } merge(); </script> <input type="button" onclick="doSomething();alert(val);" value="xx" />
Une meilleure solution (ne nécessite pas de manipulation DOM, est pur JavaScript): Stackoverflow.com/a/9134757/39722
@Bernhardhofmann qui ne résout pas le problème. La question était spécifiquement avantageuse
Modifier la fonction en travaillant avec les chaînes de code source peut être assez simple. Pour le faire pour une instance spécifique, essayez:
... function alter(func, replacer) { var newFunc = replacer(eval('window.' + funcName).toString()); eval.call(window, newFunc); } ... function Foo() {} Foo.prototype.bar = function () { var secret=0x09F91102; } ... after('Foo.prototype.bar', 'return secret;');
Cela ne fonctionnera pas dans le cas général car la fonction peut exécuter un retour à tout moment plus tôt afin que ce soit peut ne pas atteindre le code injecté.
@ Tonyo'hagan: merci; Cela devrait être résolu maintenant par l'utilisation de essayer ... enfin code>.
Comment la fonction est-elle "verrouillée"?
Duplicaillier possible de Y a-t-il un moyen de Enveloppez toutes les méthodes JavaScript avec une fonction?