2011-12-29 80 views
0

在正常的JS,一個可以遍歷window對象 -迭代的「窗口」全局

<html><head><script> 
function one(){ 
} 
function two(){ 
    for (var i in window) { 
    if (i=='one') { 
     alert(i);//.......................shows 'one' 
    } 
    } 
} 
two(); 
</script></head></html> 

但在Greasemonkey的的「窗口」不保持功能,即使你在通用腳本定義的函數:

// ==UserScript== 
// @name   Page 3 
// @namespace  http://xxxxxxxxxxxxxxxx 
// @include  http://xxxxxxxxx.net/3.html 
// ==/UserScript== 
// 
function one(){ 
} 
function two(){ 
    for (var i in window) { 
    if (i=='one') { 
     alert(i);//.........shows nothing, only iterates native window props 
    } 
    } 
} 
two(); 

是的,我想迭代我自己的函數,而不是unsafeWindow中的函數。請注意,以下的作品,我不想做的事:

window.one=function one(){ 
} 
function two(){ 
    for (var i in window) { 
    if (i=='one') { 
     alert(i);//...........ta-da! 'one' 
    } 
    } 
} 
two(); 

那麼,什麼是這個全球性空間的名字,我怎麼重複它,究竟是什麼異常的意圖和最佳做法?謝謝。

更新:「這個」不訪問功能或者 -

// ==UserScript== 
// @name   Page 3 
// @namespace  http://xxxxxxx.net 
// @include  http://xxxx.com/* 
// ==/UserScript== 


function do_fixes(){ 
    var s=''; 
    for (var i in this) { 
    if (i=='do_fixes') { 
     alert('yes'); 
    } 
    } 
    if (window!=this) { 
    alert('window!=this'); 
    } 
} 

do_fixes(); 
alert('this script ran!'); 

回答

1

全局對象應在全球範圍內免費功能this訪問。從上Greasemonkey Environment的Greasemonkey的手冊頁:

除非@Unwrap元當務之急是存在於用戶的腳本標頭,整個腳本被包裹的匿名函數內部,爲保證腳本的標識符不與現有標識符碰撞在Mozilla JavaScript沙箱中。此函數包裝函數將所有函數定義和var變量聲明(例如var i = 5;)捕獲到函數的本地作用域中。但是,在沒有var的情況下發出的聲明最終會在腳本的this對象上完成,該對象在Greasemonkey中是全局對象,與普通的瀏覽器對象模型相反,window對象填充此函數。

皺紋是,你需要unwrap腳本爲您的功能被添加到腳本全球(注意全局變量通過this是訪問,無需展開)。請注意,@unwrap建議只用於調試,因爲如果變量和函數具有相同的名稱,它們將與沙箱變量和函數發生衝突。

另一種方法是創建您自己的對象來代替全局對象的使用方法:

var global = {}; 

global.one = function() {...}; 
global.two = function (target) { 
    for (p in global) { 
     if (p == target) { 
      GM_log("found " +target); 
     } 
    } 
}; 
two('one'); 

雖然你可以明確地添加用作該腳本全局方法,那會給你最糟糕的兩個世界:與沙箱屬性衝突,並且不是自動的。

+0

感謝您的回覆,但「此」不包含這些功能 - 我已更新我的帖子以顯示該功能。 – 2011-12-29 17:19:54