2016-07-28 15 views
0

Die geladene Seite html umfassen eine js Funktion:Beliebiger Weg ersetzen Dokument js Funktion, wenn das Dokument geladen abgeschlossen?

<html> 
.... 
<body> 
    <script> 
    function test(){ 
    alert("I'm master"); 
    //here is the page original funciton 
    } 
    </script> 
</body> 
</html> 

Und ich möchte, dass meine customize js eine Chrome-Erweiterung laden Datei Funktion test(), zum Beispiel js die aktuelle Seite ersetzen schreiben:

new function name => 
function test() { 
    alert("I'm a new function come my chrome extension "); 
} 

was soll ich tun?

Antwort

2

Inline-Skripte werden sofort von Chrome ausgeführt, Sie können sie nicht mehr ausführen. Und wir können HTML nicht ändern, bevor es geparst wird: chrome extension - modifying HTTP response.

Ihre einzige Chance ist, dass die Funktion nur deklariert wird, aber nicht sofort vom Seitenskript aufgerufen wird. In diesem Fall existiert eine funktionierende Lösung.

ein Content-Skript erklären, dass <script> Element mit der neuen Funktionsdeklaration injizieren:

  • manifest.json

    "content_scripts": [{ 
        "matches": ["http://somedomain.com/blabla*"], 
        "js": ["content.js"] 
    }], 
    
  • content.js

    document.body.appendChild(document.createElement('script')).text = 
        getFunctionCode(function() { 
         function test() { 
          alert("I'm a new function from my chrome extension"); 
         } 
        }); 
    
    function getFunctionCode(fn) { 
        return fn.toString().match(/\{([\s\S]*?)\}$/)[1]; 
    } 
    

Siehe auch: a great answer about injecting page-level scripts.