2012-03-28 12 views
4

Ist es möglich, eine Javascript-Datei in das DOM zu injizieren und sofort auszuführen? Ich möchte JavaScript-Funktionen innerhalb der Seite/DOM aufrufen. Ein einzelnes Inhaltsskript funktioniert aufgrund der isolierten Welten nicht. Eine Hintergrundseite wird benötigt, um chrome.tabs.executeScript() zu verwenden.Chrome-Erweiterung: Invoke-Skript durch Injektion aufrufen

Einfaches Beispiel:
DOM javascript

function sayHello(){ 
    alert('Hello World'); 
} 

Javascript-Datei

console.log('Injection complete. Now calling DOM script.'); 
sayHello(); 
+0

möglich Duplikat [Aufbau eines Chrome senden können Extension - Inject Code in einer Seite mit einem Content-Skript] (http://stackoverflow.com/questions/9515704/building-a-chrome-extension-inject-code-in-a-page-using-a-content-script) –

Antwort

5

Hier ist meine zwei Lieblings Wege ...

// Executing an anonymous script 
function exec(fn) { 
    var script = document.createElement('script'); 
    script.setAttribute("type", "application/javascript"); 
    script.textContent = '(' + fn + ')();'; 
    document.documentElement.appendChild(script); // run the script 
    document.documentElement.removeChild(script); // clean up 
} 

script = function() { 
//sayHello(); 
alert('hello'); 
} 

exec(script); 

// Append a script from a file in your extension 
function appendScript(scriptFile) { 
    var script = document.createElement('script'); 
    script.setAttribute("type", "application/javascript"); 
    script.setAttribute("src", chrome.extension.getURL(scriptFile)); 
    document.documentElement.appendChild(script); // run the script 
} 

appendScript('someFile.js'); 

auch zu injizieren chrome.tabs.executeScript() kann aus einem Popup-Fenster mit einer Browser-/Seitenaktion verwendet werden, und der obige Code funktioniert auch in einem Inhaltsskript.

EDIT
Dank Kommentare von @renocor, hier ist eine Variante der ersten Methode, die Sie Argumente an die injizierten Funktion ....

function exec(fn) { 
    var args = ''; 
    if (arguments.length > 1) { 
     for (var i = 1, end = arguments.length - 2; i <= end; i++) { 
      args += typeof arguments[i]=='function' ? arguments[i] : JSON.stringify(arguments[i]) + ', '; 
     } 
     args += typeof arguments[i]=='function' ? arguments[arguments.length - 1] : JSON.stringify(arguments[arguments.length - 1]); 
    } 
    var script = document.createElement('script'); 
    script.setAttribute("type", "application/javascript"); 
    script.textContent = '(' + fn + ')(' + args + ');'; 
    document.documentElement.appendChild(script); // run the script 
    document.documentElement.removeChild(script); // clean up 
} 

script = function(what, huh, nah, yeah) { 
    console.debug(arguments); 
    console.debug('what=', what); 
    console.debug('huh=', huh); 
    console.debug('nah=', nah); 
    console.debug('yeah=', yeah); 
    if (typeof yeah=='function') yeah(); 
} 

exec(script, 'meh', ['bleh'], { 
    a: { 
     b: 0 
    } 
}, function(){ 
    alert('hi'); 
}); 

console.debug('No arguments'); 

exec(script); 
+0

Warum entfernen Sie den Skriptcode/die Datei nach dem Laden? – Kim

+0

Ich entferne nur das Skript auf der anonymen Funktion, weil es nur einmal ausgeführt wird, und so ist es nicht mehr sinnvoll und am besten zu bereinigen ... sonst wirst du jedes Mal Skript-Tags hinzufügen, wenn du es verwendest. – PAEz

+0

In der ersten Möglichkeit, wenn Sie Variablen an die Funktion übergeben wollen: function exec (fn, opts) { wenn (! Opts) var opts = {}; var script = document.createElement ('Skript'); script.setAttribute ("type", "application/javascript"); script.textContent = '(funktion() {var opts =' + JSON.stringify (opts) + '; (' + fn + ')();})();'; ... } Nützlich ... für mich zumindest. – Parziphal