2014-07-17 4 views
2

와 파이어 폭스 (30)의 unsafeWindow의 이벤트에 바인딩과 파이어 폭스 (30), 나는 그리스 몽키 스크립트를 유지하고있어 그리스 몽키 2.0

내 스크립트가 실행 페이지에서 몇 가지 문제로 인해 Mozilla's change to the unsafeWindow API있어 이벤트를 트리거 "myEvent가 "그리고 저의 대본은 그 사건에 관심이 있습니다.

행사는 전

jQuery를 1.6.4을 사용하여 해고,이 이벤트에 훅이 코드를 사용 :

var jQuery = unsafeWindow.jQuery; 
jQuery(unsafeWindow.document) 
    .bind("MyEvent", function() { 
     console.log("MyEvent Triggered!"); 
    }); 

그러나 모질라의 변화로 인해이 더 이상 작동하지 않습니다.

충돌없는 모드로 내 jQuery를 삽입하려고 시도했지만 다른 jQuery 인스턴스에 의해 트리거되는 이벤트에 액세스 할 수 있다고 생각하지 않습니다.

어떻게하면이 이벤트에 연결할 수 있습니까?

답변

2

자신의 jQuery를을 당신이 어떤 GM_ 기능 필요하지 않습니다 당신이하지 @require경우이, 을 수행하는 신속하고 더러운 방법은, @grant none 모드를 사용하는 것입니다. 이 작품 : 당신이 GM_ 기능을 필요 않은 경우가 종종 the new exportFunction()을 사용할 수 있습니다

// ==UserScript== 
// @name  _unsafeWindow tests 
// @include http://jsbin.com/xaman/* 
// @grant none 
// ==/UserScript== 

var jQuery = window.jQuery; 
jQuery(document).bind ("MyEvent", function() { 
    console.log ("From GM script: MyEvent caught!"); 
}); 

.
불행히도 jQuery 및 jQuery 이벤트 처리는 특별한 경우입니다. 권한이 재산 '핸들러'
또는
CloneNonReflectorsWrite 오류에 액세스 할 거부

은 단순히이 작업을 수행 할 수있는 방법을 발견했습니다 당신이 무엇을하려고에 따라 같은 당신은 오류 메시지를 얻을 것이다 새로운 unsafeWindow 기능 중 하나를 사용하십시오. 당신의 유일한 의지는 코드를 삽입하는 것입니다. 그래서 같이 :

// ==UserScript== 
// @name  _unsafeWindow tests 
// @include http://jsbin.com/xaman/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js 
// @grant GM_addStyle 
// ==/UserScript== 
/*- The @grant directive is needed to work around a design change 
    introduced in GM 1.0. It restores the sandbox. 
*/ 
function myEventHandler (zEvent) { 
    console.log (
     'From GM script: "' + zEvent.type + '" triggered on ', zEvent.target 
    ); 
} 

function bindMyEvent() { 
    //-- Gets "jQuery is not defined" if GM script does not also use jQuery. 
    jQuery(document).bind ("MyEvent", myEventHandler); 
    console.log ("The jQuery version being used is: ", jQuery.fn.jquery); 
} 

//-- Create A COPY OF myEventHandler in the target page scope: 
addJS_Node (myEventHandler); 
//-- Create A COPY OF bindMyEvent in the target page scope and immediately run it. 
addJS_Node (null, null, bindMyEvent); 

function addJS_Node (text, s_URL, funcToRun, runOnLoad) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    if (runOnLoad) { 
     scriptNode.addEventListener ("load", runOnLoad, false); 
    } 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

당신은 this jsBin page에 대해 이러한 스크립트를 모두 테스트 할 수 있습니다.

당신이/실행 주입 된 이벤트 핸들러 (들) 내에서 GM_ 함수를 호출해야하는 경우

은, 사용 기술은 "How to call Greasemonkey's GM_ functions from code that must run in the target page scope?"에 표시된.

+0

OP가 GreaseMonkey에 대해 정말로 이야기하고 있는지 확신하지 못합니다. 블로그 게시물 링크는 애드온 SDK의 콘텐츠 스크립트에 관한 것입니다. –

+0

@WladimirPalant, Greasemonkey 2.0이 SDK 변경 사항을 복사하고 해결 방법에 대한 SDK 블로그 게시물을 참조했기 때문입니다. [The Greasemonkey 2.0 발표] (http://www.greasespot.net/2014/06/greasemonkey-20-release.html)를보십시오. 대부분의 GM 사용자는 이전의 GM 버전으로 되돌아 감으로써 일시적으로 이러한 unsafeWindow 문제를 해결할 수 있습니다 - 적어도 FF 30의 경우. –

+0

OP가 GreaseMonkey에 대해 이야기하고 있습니다! @BrockAdams 굉장한! 두 번째로 잘리는 것은 일종의 괴물이지만 여기에서 유지해야하는이 스크립트도 있습니다. 매력처럼 작동합니다. 고마워요! – Reini

1

그냥, unsafeWindow에 이벤트 처리기를 바인딩하지 않는 대신 일반 window 객체를 사용

window.document.addEventListener("MyEvent", function() { 
    console.log("MyEvent Triggered!"); 
}, false, true); 

주 네 번째 매개 변수 (wantsUntrusted를) addEventListener에 -이 하나의 이벤트 핸들러가 신뢰할 수없는 이벤트를받을 수 있습니다.

+0

jQuery에 의해 트리거 된 사용자 정의 이벤트에서는 작동하지 않습니다. [jsbin.com/xaman/1](http://jsbin.com/xaman/1)]에 대해 테스트하십시오. 또한,'wantsUntrusted' 매개 변수는 Greasemonkey 스크립트에/필요하지 않습니다. –

+0

@BrockAdams : 네 말이 맞아, jQuery는 "대안"이벤트 발송 메커니즘을 구현합니다. 거대한 WTF는 잊었습니다. 당연히 제대로 이벤트를 파견해야합니다. –

+0

예, OP는 대상 페이지 또는 jQuery가 이벤트를 전달하는 방법을 제어 할 수 없습니다. –

관련 문제