2016-07-13 2 views
0

Я пытаюсь выяснить, как слушать излучателя события из моего сценария greasemonkey, но я продолжаю получать ошибки нарушения доступа (Permission denied to access object).Прослушивание события из моего сценария greasemonkey

Page
страница содержит простой излучатель событий:

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
Это выдает сообщение об ошибке нарушения прав доступа (это используется для работы некоторое время назад, но я предполагаю, что это был исправлен или что-то еще):

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

У вас '// @grant unsafeWindow' в метаблоке пользователя? – wOxxOm

+0

@wOxxOm Да. unsafeWindow работает просто отлично. – Rai

+1

Попробуйте экспортировать функцию в небезопасный контекст: 'unsafeWindow.test.on ('test', exportFunction (функция (данные) {....}))' – wOxxOm

ответ

2

Мне удалось заставить его работать. Решение было экспортировать функцию обратного вызова в небезопасном контексте с помощью exportFunction(myFunction, unsafeWindow)

сценария части должен выглядеть следующим образом:

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

Большое спасибо wOxxOm за указание на это.

Смежные вопросы