Comment puis-je changer une variable JavaScript en utilisant Greasemonkey?

C'est la page que j'essaie de modifier, je veux contourner le compte à rebours, comment puis-je écrire le script? Est-ce que je peux modifier la variable document.licenseform.btnSubmit.disabled to yes using Greasemonkey?

 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>dsfsdf</title> </head> <body> <form name="licenseform" method="post" action=""> <input name="btnSubmit" type="button" value="我同意"> </form> <SCRIPT language=javascript type=text/javascript> <!-- var secs = 9; var wait = secs * 1000; document.licenseform.btnSubmit.value = "我同意 [" + secs + "]"; document.licenseform.btnSubmit.disabled = true; for(i = 1; i <= secs; i++) { window.setTimeout("Update(" + i + ")", i * 1000); //这一句很关键,记得参数写法为("update("+i+")",i*1000) } window.setTimeout("Timer()", wait); function Update(num) { if(num != secs) { printnr = (wait / 1000) - num; document.licenseform.btnSubmit.value = "我同意 [" + printnr + "]"; } } function Timer() { document.licenseform.btnSubmit.disabled = false; document.licenseform.btnSubmit.value = " 我同意 "; } --> </SCRIPT> </td> <!--网页中部中栏代码结束--> </body> </html> 

Une alternative plus sûre à l'utilisation de unsafeWindow est d'injecter du code dans le document. Le code que vous injectez s'exécutera dans le même contexte que le code de la page, de sorte qu'il aura un accès direct à toutes les variables là-bas. Mais il n'aura pas accès à des variables ou à des fonctions dans d'autres parties de votre code de script utilisateur.

Un autre avantage de l'injection de code est qu'un script utilisateur écrit de cette façon fonctionnera aussi bien dans Chrome que dans Firefox. Chrome ne supporte pas unsafeWindow à fait unsafeWindow .

Ma façon préférée d'injecter un code est d'écrire une fonction, puis d'utiliser ce code réutilisable pour récupérer le code source de la fonction:

 // Inject function so that in will run in the same context as other // scripts on the page. function inject(func) { var source = func.toString(); var script = document.createElement('script'); // Put parenthesis after source so that it will be invoked. script.innerHTML = "("+ source +")()"; document.body.appendChild(script); } 

Pour basculer btnSubmit vous pouvez écrire un script comme ceci:

 function enableBtnSubmit() { document.licenseform.btnSubmit.disabled = false; document.licenseform.btnSubmit.value = " 我同意 "; // Or just invoke Timer() } function inject(func) { var source = func.toString(); var script = document.createElement('script'); script.innerHTML = "("+ source +")()"; document.body.appendChild(script); } inject(enableBtnSubmit); 

Rappelez-vous que lorsque vous utilisez la forme sérialisée d'une fonction de cette façon, la portée de fermeture normale ne fonctionnera pas. La fonction que vous injectez n'aura pas accès aux variables dans votre script à moins qu'elles ne soient définies à l'intérieur de cette fonction.

Essayez d'appeler la fonction Timer () puisque c'est ce que vous voulez que cela se produise de toute façon:

 unsafeWindow.Timer(); 

Pendant que vous l'êtes, modifiez la fonction Mise à jour pour ne rien faire:

 unsafeWindow.update = function(){} 

C'est possible. La réponse courte est que vous pouvez utiliser l'objet unsafeWindow , par exemple

 unsafeWindow.document.licenseform.btnSubmit.disabled = true; 

Cependant, il n'est pas recommandé de le faire, car il n'est pas sûr. Plus d'informations à ce sujet ici: http://wiki.greasespot.net/UnsafeWindow

Ignorer tout ce qui a été dit à propos de «insécurité», car l'exécution de script-> écriture est parfaitement sécurisée.

 unsafeWindow.document.licenseform.btnSubmit.disabled = false; 

(Utilisez la méthode de mkoryak pour supprimer le délai d'expiration) Ce formulaire donné contient uniquement un délai d'expiration, donc vous pourriez vouloir le contourner complètement:

 // this example is INSECURE unsafeWindow.document.licenseform.submit(); 

Voir?