Arrêter L'exécution de la fonction Javascript (côté client) ou la modifier
je veux arrêter l'exécution d'une seule ligne à partir d'un site, de sorte que toute la page soit lue par le navigateur sauf cette seule ligne. Ou le navigateur peut simplement ignorer l'exécution de cette fonction javascript.
ou
y a-t-il moyen de modifier le javascript d'une façon ou d'une autre pour que la fonction de génération de nombres aléatoires en javascript ne génère pas de nombres aléatoires, mais les nombres que je veux...
je n'ai pas accès au site sur lequel le script est hébergé donc tout cela doit être fait côté client.
4 réponses
Firefox supporte actuellement beforescriptexécute événement (la Version 4, publié le 22 Mars 2011)‡.
Avec cet événement et // @run-at document-start
la directive, et Firefox Greasemonkey semblent maintenant faire un bon travail de l'interception spécifique <script>
balises.
ce n'est toujours pas possible pour Chrome+Tampermonkey. Pour rien, mais Firefox+Greasemonkey, vous aurez besoin d'utiliser des techniques comme indiqué dans les autres réponses, ci-dessous, d'écrire une extension complète du navigateur.
checkForBadJavascripts
function encapsule cette. Par exemple, supposons que la page ait un <script>
balise comme ceci:
<script>
alert ("Sorry, Sucka! You've got no money left.");
</script>
Vous pouvez utiliser checkForBadJavascripts
comme ceci:
checkForBadJavascripts ( [
[ false,
/Sorry, Sucka/,
function () {
addJS_Node ('alert ("Hooray, you\'re a millionaire.");');
}
]
] );
pour obtenir un message beaucoup plus agréable. (^ _ ^)--37--> Voir la documentation en ligne, en checkForBadJavascripts, pour plus.
Pour voir une démonstration dans un script complet, première visite cette page à jsBin. Vous verrez 3 lignes de texte, dont deux ajoutées par JS.
Maintenant, installez ce script (Afficher la source; c'est aussi ci-dessous.) et revisiter la page. Vous verrez que le script GM a supprimé une mauvaise étiquette et en a remplacé une autre avec notre "bon" JS.
‡ notez que seulement Firefox supporte le beforescriptexecute
événement. Et il a été retiré de la spécification HTML5 sans possibilité équivalente spécifiée.
Complet GM exemple de script (Le même que celui sur GitHub et jsBin):
compte tenu de ce code HTML:
<body onload="init()">
<script type="text/javascript" src="http://jsbin.com/evilExternalJS/js"></script>
<script type="text/javascript" language="javascript">
function init () {
var newParagraph = document.createElement ('p');
newParagraph.textContent = "I was added by the old, evil init() function!";
document.body.appendChild (newParagraph);
}
</script>
<p>I'm some initial text.</p>
</body>
Utilisez ce script Greasemonkey:
// ==UserScript==
// @name _Replace evil Javascript
// @include http://jsbin.com/ogudon*
// @run-at document-start
// ==/UserScript==
/****** New "init" function that we will use
instead of the old, bad "init" function.
*/
function init () {
var newParagraph = document.createElement ('p');
newParagraph.textContent = "I was added by the new, good init() function!";
document.body.appendChild (newParagraph);
}
/*--- Check for bad scripts to intercept and specify any actions to take.
*/
checkForBadJavascripts ( [
[false, /old, evil init()/, function () {addJS_Node (init);} ],
[true, /evilExternalJS/i, null ]
] );
function checkForBadJavascripts (controlArray) {
/*--- Note that this is a self-initializing function. The controlArray
parameter is only active for the FIRST call. After that, it is an
event listener.
The control array row is defines like so:
[bSearchSrcAttr, identifyingRegex, callbackFunction]
Where:
bSearchSrcAttr True to search the SRC attribute of a script tag
false to search the TEXT content of a script tag.
identifyingRegex A valid regular expression that should be unique
to that particular script tag.
callbackFunction An optional function to execute when the script is
found. Use null if not needed.
*/
if ( ! controlArray.length) return null;
checkForBadJavascripts = function (zEvent) {
for (var J = controlArray.length - 1; J >= 0; --J) {
var bSearchSrcAttr = controlArray[J][0];
var identifyingRegex = controlArray[J][1];
if (bSearchSrcAttr) {
if (identifyingRegex.test (zEvent.target.src) ) {
stopBadJavascript (J);
return false;
}
}
else {
if (identifyingRegex.test (zEvent.target.textContent) ) {
stopBadJavascript (J);
return false;
}
}
}
function stopBadJavascript (controlIndex) {
zEvent.stopPropagation ();
zEvent.preventDefault ();
var callbackFunction = controlArray[J][2];
if (typeof callbackFunction == "function")
callbackFunction ();
//--- Remove the node just to clear clutter from Firebug inspection.
zEvent.target.parentNode.removeChild (zEvent.target);
//--- Script is intercepted, remove it from the list.
controlArray.splice (J, 1);
if ( ! controlArray.length) {
//--- All done, remove the listener.
window.removeEventListener (
'beforescriptexecute', checkForBadJavascripts, true
);
}
}
}
/*--- Use the "beforescriptexecute" event to monitor scipts as they are loaded.
See https://developer.mozilla.org/en/DOM/element.onbeforescriptexecute
Note that it does not work on acripts that are dynamically created.
*/
window.addEventListener ('beforescriptexecute', checkForBadJavascripts, true);
return checkForBadJavascripts;
}
function addJS_Node (text, s_URL, funcToRun) {
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
//--- Don't error check here. if DOM not available, should throw error.
targ.appendChild (scriptNode);
}
la réponse dépend de détails qui n'ont pas été fournis (la page exacte et la ligne de code seraient mieux), Mais voici comment vous le faites en général:
si l'infraction code JS ne se déclenche pas tout de suite (feux après
DOMContentLoaded
), vous pouvez utiliser Greasemonkey pour remplacer le code incriminé. Par exemple:var scriptNode = document.createElement ("script"); scriptNode.textContent = "Your JS code here"; document.head.appendChild (scriptNode);
fait.
Si le JS code Fire immediately, puis il devient de plus en plus compliqué.
Tout d'abord, prenez une copie du script et procéder à la modification souhaitée. Enregistrer localement.Est la délinquance script dans un fichier ou dans la page HTML (
<script src="Some File>
contre<script>Mess O' Code</script>
)?Si le script est dans un fichier, installer Adblock Plus et l'utiliser pour bloquer le chargement de ce script. Ensuite, utilisez Greasemonkey pour ajouter votre code modifié à la page. Par exemple:
var scriptNode = document.createElement ("script"); scriptNode.setAttribute ("src", "Point to your modified JS file here."); document.head.appendChild (scriptNode);
si le script est dans la page HTML principale, alors installez NoScript (le mieux) ou YesScript et l'utiliser pour bloquer JavaScript à partir de ce site.
Cela signifie que vous aurez alors besoin d'utiliser Greasemonkey pour remplacer tous les scripts, à partir de ce site, que vous voulez lancer.
Utilisant TamperMonkey? Tout ce que vous devez ajouter sous votre // @grant
dans L'en-tête TamperMonkey est // @require http://urlofyoursite.com/myfile.js
. Par exemple, voici le haut de mon truc TamperMonkey:
// ==UserScript==
// @name Project
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://docs.google.com/presentation/*
// @grant none
// @require http://cdnjs.cloudflare.com/ajax/libs/annyang/2.1.0/annyang.min.js
// ==/UserScript==
Vous pouvez utiliser ce qu'on appelle un bookmarklet.
construisez le fichier js que vous voulez lancer sur l'autre site:your.js
créer une page HTML avec le code suivant:
<html>
<body>
<a href="javascript:(function(){var s=document.createElement('SCRIPT');s.src='/url/to/your.js?'+(Math.random());document.getElementsByTagName('head')[0].appendChild(s);})()">
Drag'n Drop this to your bookmarks
</a>
</body>
</html>
Remplacer
chargez cette petite page dans votre navigateur et faites glisser le lien vers votre barre de signet.
Accédez au site web que vous voulez pirater et cliquez sur le signet que vous venez de créer.
cela va charger your.js
dans la page et lancez le code.
Remarque::?'+(Math.random())
partie est d'éviter que votre js soit mis en cache, ce n'est pas obligatoire, mais il est utile lorsque vous développez your.js