JavaScript: вызов встроенной функции из сценария GM - PullRequest
2 голосов
/ 15 июля 2010

На веб-странице есть

<script>
  function fn982734()
  {
     // some code
  }
</script>

В моем скрипте Greasemonkey у меня есть следующий код:

var fn = fields[5].getElementsByTagName("a")[0].getAttribute('onclick').substr(7,11);
console.log(fn); // outputs fn982734 to the firebug console
window[fn]();

Этот код не работает и порождает ошибку в консоли ошибок: окно [fn] не является функцией. Однако, набрав прямо в firebug:

var fn = 'fn982734';
window[fn]();

работает отлично. Что происходит?

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Скрипт Greasemonkey находится внутри песочницы, а Firebug - нет.Смотрите: «Избегайте распространенных ошибок» (в Greasemonkey) .

Ваш скрипт GM будет обращаться к этой функции через unsafeWindow.Вот так:

unsafeWindow.fn982734();

.
В качестве альтернативы

var fn = 'fn982734';
unsafeWindow[fn]();

Также работает - изнутри скрипта Greasemonkey.

0 голосов
/ 02 июля 2011

Я понимаю, что немного опоздал на этот вопрос, но, пожалуйста, не поощряйте использование unsafeWindow - оно называется unsafe по причине.

Правильной альтернативой было бы использование «взлома местоположения», как описано на Greasemonkey's Greasepot Wiki . Этот код должен правильно вызывать функцию, описанную в оригинальном сообщении:

location.href = "javascript:void(fn982734())";
...