2009-06-10 62 views
1

我有通過插入<script>標籤,像這樣運行大部分在非特權上下文代碼的Greasemonkey的userscript:如何爲我的頁面的Javascript提供Greasemonkey的GM_xmlhttpRequest的有限接口?

function code { 
    ... 
} 

var script = document.createElement("script"); 
script.type = "application/javascript"; 
script.innerHTML = "(" + code + ")();"; 
document.body.appendChild(script); 

這避免了需要做危險的事情與unsafeWindow

但是,我的代碼需要從另一個不支持JSONP的域上的API獲取信息。 GM_xmlhttpRequest可以訪問其他域,但僅在特權Greasemonkey上下文中可用。

我想寫一個函數,它提供了一個有限的接口,並使用GM_xmlhttpRequest完成我需要的API調用,然後將這個(理論上安全的)函數暴露給正常的頁面上下文。我在第一次嘗試是這樣的:

unsafeWindow.foo = function() { 
    console.log("Foo!"); 
    console.log(GM_xmlhttpRequest.toString()); 
    GM_xmlhttpRequest({ 
    method: "GET", 
    url: "http://www.example.net/", 
    headers: { 
     "User-Agent": navigator.userAgent, 
     "Accept": "text/html" 
    }, 
    onload: function(response) { 
     console.log(response); 
     unsafeWindow.console.log(response); 
     alert(response); 
     unsafeWindow.alert(response); 
    } 
    }); 
    console.log("Bar!"); 
}; 

有趣的是,當我打電話foo()從頁面上下文中,我看到的,字符串化GM_xmlhttpRequest和「Foo!」「吧!」在控制檯日誌中。但是,我從來沒有在控制檯或警報中獲得響應。如果我在GM上下文中自行創建GM_xmlhttpRequest,則會同時收到警報和日誌消息。

問題是:我試圖做甚至可能嗎?還是有另一種方式來完成同樣的事情?

+0

爲什麼你要在一個無特權的環境中運行你的代碼? – rampion 2009-06-10 20:04:59

回答

1

啊哈!答案已發佈到similar question

的Greasemonkey做到這一點非常有意,並提供0.7.20080121.0 compatibility頁面上簡單的解決方法:

unsafeWindow.foo = function() { 
    window.setTimeout(GM_xmlhttpRequest, 0, { 
    // ... 
    }); 
}; 

工程。

相關問題