2010-10-19 6 views
22

Ich möchte die Ausführung einer einzelnen Zeile von einer Website stoppen, so dass die ganze Seite vom Browser mit Ausnahme dieser einzelnen Zeile gelesen wird. Oder der Browser kann einfach die Ausführung dieser Javascript-Funktion überspringen.Stoppen Sie die Ausführung der Javascript-Funktion (Client-Seite) oder zwicken Sie es

ODER

Gibt es so, wie ich irgendwie die Javascript zwicken kann, so dass die Zufallszahl-Funktion in Javascript zu erzeugen keine Zufallszahl erzeugen, aber die Zahlen, die ich will ...

I dont haben Zugriff auf Die Site, auf der das Skript gehostet wird, muss also auf der Client-Seite ausgeführt werden.

+1

Können Sie uns den Code zeigen und auf die Linie zeigen, die Sie deaktivieren möchten? – hookedonwinter

+2

Sie könnten einfach die JS herunterladen, lokal ändern und dort ausführen? – Rudu

+0

Ich habe hier eine Lösung geschrieben: http: // stackoverflow.com/a/9699686/6355 Da es etwas mehr als ein Link hier ist, geht es wieder: http://userscripts.org/scripts/show/125936 – Sarien

Antwort

0

Sie können ein so genanntes Bookmarklet verwenden.

Erstellen Sie die js Datei, die Sie auf der anderen Seite ausführen möchten: your.js

Machen Sie eine HTML-Seite mit dem folgenden Code:

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

ersetzen /url/to/your.js mit dem Pfad der JS-Datei.

Laden Sie diese kleine Seite in Ihren Browser und ziehen Sie den Link auf Ihre Lesezeichenleiste.

Gehen Sie zu der Website, die Sie hacken möchten, und klicken Sie auf das Lesezeichen, das Sie gerade erstellt haben.
Dies wird your.js auf der Seite laden und den Code ausführen.

Hinweis: Der ?'+(Math.random()) Teil ist Ihre js zwischengespeichert zu werden zu vermeiden, ist dies nicht obligatorisch, aber es ist hilfreich, wenn Sie your.js

7

entwickeln Die Antwort auf Details abhängt, die nicht zur Verfügung gestellt wurde (die exakte Seite und Zeile Code wäre am besten), aber hier ist, wie Sie es in der Regel tun:

  1. Wenn der säumige JS-Code nicht sofort Feuer (Fires nach DOMContentLoaded), dann können Sie G verwenden reasemonkey um den fehlerhaften Code zu ersetzen. ZB:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.textContent = "Your JS code here"; 
    document.head.appendChild (scriptNode); 
    

    Erledigt.

  2. Wenn der JS-Code sofort auslöst, wird es komplizierter.
    Entnehmen Sie zunächst eine Kopie des Skripts und nehmen Sie die gewünschte Änderung vor. Speichere dies lokal.

  3. Ist das fehlerhafte Skript in einer Datei oder ist es in der Hauptseite HTML (<script src="Some File> gegenüber <script>Mess O' Code</script>)?

  4. Wenn sich das Skript in einer Datei befindet, installieren Sie Adblock Plus und verwenden Sie es, um das Laden dieses Skripts zu blockieren. Dann benutze Greasemonkey, um deinen modifizierten Code der Seite hinzuzufügen. Beispiel:

    var scriptNode   = document.createElement ("script"); 
    scriptNode.setAttribute ("src", "Point to your modified JS file here."); 
    document.head.appendChild (scriptNode); 
    
  5. Wenn das Skript in der Haupt-HTML-Seite ist, dann installieren entweder NoScript (am besten) oder YesScript und es verwendet, JavaScript von dieser Seite zu blockieren.
    Dies bedeutet, dass Sie dann Greasemonkey verwenden müssen, um alle Skripts von dieser Site zu ersetzen, die Sie ausführen möchten.

32

Firefox unterstützt derzeit the beforescriptexecute event (Stand Version 4, released on March 22, 2011) .

Mit diesem Ereignis und the // @run-at document-start directive scheinen Firefox und Greasemonkey nun einen guten Job zu tun, bestimmte spezifische <script>-Tags abzufangen.

Dies ist immer noch nicht möglich für Chrome + Tampermonkey. Für alles andere als Firefox + Greasemonkey müssen Sie Techniken wie in den anderen Antworten unten beschrieben verwenden, um eine vollständige Browsererweiterung zu schreiben.

The checkForBadJavascripts function kapselt dies ein. Beispiel: Angenommen, die Seite ein <script> Tag wie so hatte:

checkForBadJavascripts ([ 
    [ false, 
     /Sorry, Sucka/, 
     function() { 
      addJS_Node ('alert ("Hooray, you\'re a millionaire.");'); 
     } 
    ] 
]); 

bekommen eine viel schönere Nachricht:

<script> 
    alert ("Sorry, Sucka! You've got no money left."); 
</script> 

Sie checkForBadJavascripts wie so nutzen könnten. (^_^)
Weitere Informationen finden Sie in der Inline-Dokumentation unter checkForBadJavascripts.


Um eine Demonstration in einem vollständigen Skript, ersten Besuch this page at jsBin zu sehen. Sie sehen 3 Textzeilen, von denen zwei von JS hinzugefügt wurden.

Jetzt install this script (View source; es ist auch unten.) Und besuchen Sie die Seite erneut. Sie werden sehen, dass das GM-Skript ein schlechtes Tag gelöscht und ein anderes mit unserem "guten" JS ersetzt hat.


Beachten Sie, dass nur Firefox das beforescriptexecute Ereignis unterstützt. Und es wurde aus der HTML5-Spezifikation entfernt, ohne dass eine entsprechende Funktion angegeben wurde.



komplettes GM-Skript Beispiel (Das gleiche wie die bei GitHub und jsBin):

Vor diesem 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> 


verwendet Greasemonkey-Skript:

// ==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); 
} 
+1

vor/afterscriptexecute wurden aus dem HTML5-Standard im April 2016 entfernt, da FF der einzige ist Anbieter zu implementieren, leider. – imoatama

1

Verwenden von TamperMonkey? Alles, was Sie unter dem // @grant im TamperMonkey-Header hinzufügen müssen, ist // @require http://urlofyoursite.com/myfile.js. Zum Beispiel, hier ist die Spitze meiner TamperMonkey-Sache:

// ==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== 
Verwandte Themen