2016-07-13 14 views
0

Ich versuche herauszufinden, wie man einen Event-Emitter von meinem Skript "greasemonkey" hört, aber ich bekomme immer Zugriffsverletzungsfehler (Permission denied to access object).Ich höre auf ein Ereignis von meinem Skript "greasemonkey"

Seite
Die Seite enthält ein einfaches Ereignis-Emitter:

var emitter = function(){ 
    this.events = {}; 
} 

emitter.prototype.on = function(eventName, closure){ 
    this.events[eventName] = this.events[eventName] || []; 
    this.events[eventName].push(closure); 
}; 

emitter.prototype.emit = function(eventName, data){ 
    if(this.events[eventName]){ 
     this.events[eventName].forEach(function(fn){ 
      return fn(data); 
     }); 
    } 
} 

var test = new emitter(); 
test.emit('test', {data:'test'}); 

Script
Dieser eine Zugriffsverletzung Fehler führt (dies verwendet vor einer Weile zu arbeiten, aber ich denke, es gepatcht wurde oder etwas):

unsafeWindow.test.on('test', function(data){ 
    console.log(data); 
}); 
+1

Haben Sie '// @grant unsafeWindow' im Benutzermetablock? – wOxxOm

+0

@wOxxOm Ja. unsafeWindow funktioniert gut. – Rai

+1

Versuchen Sie, die Funktion in einen unsicheren Kontext zu exportieren: 'unsafeWindow.test.on ('test', exportFunction (function (data) {....}))' – wOxxOm

Antwort

2

Ich schaffte es zu arbeiten. Die Lösung war die Callback-Funktion in unsicheren Kontext sollte wie folgt aussehen über exportFunction(myFunction, unsafeWindow)

Das Skript Teil zu exportieren:

unsafeWindow.test.on('test', exportFunction(function(data){ 
    console.log(data); 
}, unsafeWindow)); 

Big dank wOxxOm für diesen Hinweis.