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.

22
demandé sur Yousuf 2010-10-19 23:38:28

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);
}
33
répondu Brock Adams 2017-02-01 21:55:33

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:

  1. 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.

  2. 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.

  3. Est la délinquance script dans un fichier ou dans la page HTML (<script src="Some File> contre <script>Mess O' Code</script>)?

  4. 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);
    
  5. 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.

7
répondu Brock Adams 2010-10-20 04:15:55

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==
0
répondu 2017-02-07 20:44:01

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

-1
répondu Mic 2010-10-19 21:58:12