javascript function教學 - UserScripts&Greasemonkey:調用網站的JavaScript函數




1 Answers

背景

不是Greasemonkey已經註入我的擴展JavaScript嗎? 請允許有人為我澄清這一點。

Greasemonkey在sandbox執行您的腳本, sandbox是一個受限制的環境,無法直接訪問頁面中的JavaScript。 早期版本的Greasemonkey將腳本直接注入頁面,但這引入了嚴重的安全漏洞。 在舊模型中,腳本使用瀏覽器chrome的提升權限運行,這允許遠程頁面使用一些聰明的JavaScript訪問Greasemonkey的內置函數。 這很糟糕:

Greasemonkey腳本包含它們自己的GM_xmlhttprequest對象,與普通的xmlttprequest對像不同,它可以訪問任何本地文件,或者對任意站點發出任意請求,而不考慮通常適用於xmlhttprequest的相同源策略。 (source)

今天從Greasemonkey腳本訪問window對象時,得到的是一個間接引用實際window屬性的包裝器對象 。 此包裝器對象可以安全地修改,但具有重要的局限性unsafeWindowwindow.wrappedJSObject簡寫)提供了對實際窗口對象的訪問。 使用unsafeWindow重新打開Greasemonkey的所有原始安全問題,但在Chrome中不可用。 應盡可能避免。

好消息:至少有兩種方法可以安全地使用Greasemonkey的新安全模型。

腳本注入

既然Greasemonkey腳本可以安全地訪問DOM,那麼<script>標記註入目標文檔的<head>是很簡單的。 創建一個這樣的函數:

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

它使用簡單:

exec(function() {
    return Grooveshark.playNextSong();
});

位置黑客

在某些情況下,腳本注入可能過度,特別是當您需要的是修改頁面中變量的值或執行單個函數時。 Location Hack利用javascript: URL訪問文檔內容中的代碼。 這很像在Greasemonkey腳本中運行bookmarklet。

location.assign("javascript:Grooveshark.playNextSong();void(0)");

獎金腳本

這是一個完整的Greasemonkey腳本,演示了上面的例子。 您可以在此頁面上運行它。

// ==UserScript==
// @name           Content Function Test
// @namespace      lwburk
// @include        http://stackoverflow.com/questions/5006460/userscripts-greasemonkey-calling-a-websites-javascript-functions
// ==/UserScript==

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

window.addEventListener("load", function() {
    // script injection
    exec(function() {
        // alerts true if you're registered with Stack Overflow
        alert('registered? ' + isRegistered);
    });
    // location hack
    location.assign("javascript:alert('registered? ' + isRegistered);void(0)");
}, false);
javascript介紹 $符號

我正在為Firefox和Chrome創建一個UserScript擴展,我正在嘗試使用網站JavaScript中的一些代碼,例如:

function: myFunction(){
    return  Grooveshark.playNextSong();
}

問題是當我測試這段代碼時, Grooveshark是一個空引用。

我知道還有其他人做過:

見BetterGrooveshark

但我不知道為什麼我的簡單擴展無法調用Grooveshark的JavaScript函數。

我是否需要將我的腳本“追加”到文檔才能使其正常工作?: document.document.body.appendChild(script);

不是Greasemonkey已經註入我的擴展JavaScript嗎? 請允許有人為我澄清這一點。

謝謝。




Related

javascript google-chrome-extension greasemonkey userscripts