2011-12-29 2 views
0

, 하나는 윈도우 개체를 반복 할 수 -반복 정상 JS에서

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

그러나 그리스 몽키의 '창'보유하지 않는 기능, 당신은 GM 스크립트에 정의에도 기능 :

// ==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에 그리스 몽키 설명서 페이지에서 : 필수 @unwrap 메타 데이터는 사용자 스크립트 헤더에 존재하지 않는

, 전체 스크립트는 현재 식별자와 충돌하지 않는 스크립트의 식별자를 보장하기 위해, 익명 함수 내부에 싸여있다 Mozilla JavaScript 샌드 박스에서. 이 함수 래퍼는 함수 정의를 캡처하고 변수 선언을 var (예 : var i = 5;) 함수의 로컬 범위로 만듭니다. 그러나 var없이 만들어진 선언은 스크립트의 this 개체에서 끝납니다.이 개체는 Greasemonkey에서 일반 개체인데 반해 일반 브라우저 개체 모델에서는 window 개체가이 기능을 채 웁니다.

주름

은 당신이 당신의 기능을 글로벌 스크립트 (전역 변수 풀기없이 this를 통해 액세스 할 수 있습니다)에 추가하기위한 스크립트를 unwrap 필요가있다. @unwrap은 변수와 함수가 샌드 박스 변수와 함수가 동일한 이름을 가진 경우 충돌하게되므로 디버깅 용으로 만 사용하는 것이 좋습니다.

대안은 전역 객체 대신 사용할 자신의 개체를 만드는 것입니다 : 당신에게 두 세계의 최악을 줄 것이다

var global = {}; 

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

명시 적으로 글로벌 스크립트에 대한 방법 등의 기능을 추가 할 수 있지만, : 샌드 박스 속성과의 충돌이며 자동이 아닙니다.

+0

답장을 보내 주셔서 감사합니다.하지만 '이'에는 기능이 없습니다. 지금 내 소식을 업데이트했습니다. –