2009-10-25 69 views
6

我現在只是在用chrome來擺弄用戶腳本,所以請忍受我潛在的無知/愚蠢。如何在Chrome中模擬Greasemonkey/Firefox的unsafeWindow功能?

在頁面我正在寫腳本,有一個<script>元素聲明變量x。 這是否意味着,在我的用戶腳本中,我可以從全局命名空間訪問x

例如,如果我的腳本中唯一的行是alert(x);,應該如預期那樣工作(假設x是一個String)?我知道鉻不支持unsafewindow,但由於某種原因,我發現不可能弄清楚如何模仿功能。它甚至有可能嗎?

回答

9

contentWindow在Chrome 3中可用,但在removed in Chrome 4中可用。僅適用於Chrome 4的可能的解決方案:

location.href="javascript:(function(){ alert('Hello'); })()" 
0

確定繼承人的想法,你可以使用地址欄注入腳本...

javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm); 

那麼你可以用你的JavaScript運行任何你想要的窗口

+0

哦,如果變量是全球性的頁面,你應該能夠閱讀它的javascript – 2009-10-29 20:33:55

13

這會給你到窗口對象的引用(如p):

var p = unsafeWindow; 

if(window.navigator.vendor.match(/Google/)) { 
    var div = document.createElement("div"); 
    div.setAttribute("onclick", "return window;"); 
    p = div.onclick(); 
}; 
+0

謝謝謝謝謝謝 – ysth 2011-03-09 07:52:54

+6

不需要「供應商嗅探」,你可以做這樣的事情:https://gist.github.com/1143845 – 2011-08-13 13:31:41

+7

這似乎不再適用於最新的Chrome的版本。 – 2013-04-18 00:17:37

1

若y你想與頁面JavaScript交互,你將不得不在頁面中插入一個腳本。 (當然,除非你想使用本頁面建議的任何黑客技巧)。我已經爲我自己的腳本編寫了一個函數,我會在這裏發佈它,以防任何人想使用它。

/* 
    @description This function will insert the given code as a <script> or <style> block into a page. 
    @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS). 
    @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'. 
    @return The HTML element that was inserted, or FALSE on failure 
*/ 
function insert(z,t){ 
    var j,f,x,c,i,n,d 
    d=document 
    c=d.createElement 
    i=d.head.appendChild 
    a=d.createTextNode 
    if(typeof z==='function') j=!0,f=!0; 
    if((t=='js'||!t)&&!f){j=!0,f=!1} 
    if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')} 
    if(j){x=c('script');x.setAttribute('type','text/javascript')} 
    if(f) n=a('('+z+')()');else n=a(z) 
    x.appendChild(n) 

    if(x){return i(x)}else{return !1} 
} 

了幾個例子來闡明:

//Inserting a JavaScript function 
var func=function(){ 
    stopAds(); 
    startFileDownload(); 
} 

insert(func); 


//Inserting JavaScript as a string 
var strJS="prompt(\"Copy:\",someVariableAtThePage);"; 

insert(strJS); 
//Or with an OPTIONAL 2nd parameter: 
insert(strJS,'js'); 


//Inserting CSS 
var strCSS=".ad{display:none !important} #downloadButton{display:block}"; 

insert(strCSS,'css');//Specifying 2nd parameter as "css" is required. 
11

更新:
onclick利用在最新的Chrome瀏覽器發佈不再起作用。

要在Chrome中獲得unsafeWindow的功能,最好的方法是安裝和使用Tampermonkey - 無論如何,您都可以做出明智的選擇。 Tampermonkey完全支持Greasemonkey API並且更簡單的腳本管理。

Greasemonkey腳本和Tampermonkey腳本幾乎總是完全兼容,這對於普通的Chrome用戶腳本來說並非如此。

放棄Tampermonkey,仍然有效的唯一替代方法是使用某種形式的script injection



以下是現在已經過時:

Chrome now defines unsafeWindow for userscripts/content-scripts,但Chrome的unsafeWindow仍然不允許訪問由目標頁面創建的JS對象。

下面是如何提供正確不安全,unsafeWindow - 在使用Feature Detection (good) versus Browser Sniffing (Bad)一個跨瀏覽器的方式:

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist 
    (Chrome, mainly). 
    Chrome now defines unsafeWindow, but does not give it the same access to 
    a page's javascript that a properly unsafe, unsafeWindow has. 
    This code remedies that. 
*/ 
var bGreasemonkeyServiceDefined  = false; 

try { 
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") { 
     bGreasemonkeyServiceDefined = true; 
    } 
} 
catch (err) { 
    //Ignore. 
} 

if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) { 
    unsafeWindow = (function() { 
     var dummyElem = document.createElement('p'); 
     dummyElem.setAttribute ('onclick', 'return window;'); 
     return dummyElem.onclick(); 
    })(); 
} 
+0

這是否仍然有效?我試着用chrome來覆蓋XHR發送,但它似乎沒有做任何事情。我剛剛添加:'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function(){console.log(「XHR更新通知」); oldSend.apply(this,arguments); ''但在請求期間我沒有輸出。如果我將它注入頁面,此代碼確實會生成輸出。 – mix 2012-06-18 23:20:38

+0

@Mix,是的,我剛剛證實,它仍然適用於Chrome版本18和版本19(19.0.1084.56米)。爲您的問題打開一個新問題。 – 2012-06-19 00:48:44

+0

不適用於Chrome瀏覽器 – user280109 2013-12-12 07:23:24