Проблема с вставкой нескольких функций JavaScript с помощью Greasemonkey с использованием unsafeWindow - PullRequest
0 голосов
/ 19 мая 2011

Проблема в том, что функции не могут видеть друг друга.

Например:

unsafeWindow.helloworld = function() {

    alert('Hello world!');

    helloworld2();//fails with error saying it does not exist
}

unsafeWindow.helloworld2 = function() {

    alert('Hello world!2');

    helloworld();//fails with error saying it does not exist
}

insert("helloworld();"); //appends a script element to the body

Обе функции можно вызывать с помощью консоли вставки или firebug, но онине знаете друг о друге внутренне?В чем здесь проблема?

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Есть несколько проблем.

  1. Поскольку функции определяются в области действия unsafeWindow, они должны вызываться таким образом, в скрипте Greasemonkey.
    Вот так:

    unsafeWindow.helloworld = function () {
    
        alert ('Hello world!');
        unsafeWindow.helloworld2 ();
    }
    
    unsafeWindow.helloworld2 = function () {
    
        alert ('Hello world!2');
        unsafeWindow.helloworld ();
    }
    


  2. Откуда insert() откуда ?! Для вызова этих функций вы должны использовать:

    // WARNING this will launch an infinite loop!!
    unsafeWindow.helloworld2 ();
    


  3. Не делай этого! Единственная причина определить функцию таким способом - переопределить / перезаписать функцию, которая уже была на целевой странице. В тех редких случаях, когда вы хотите переопределить JavaScript веб-сайта, наилучший метод зависит от деталей.

    Вы можете использовать множество unsafeWindow экранирования (как показано на рисунке) или массово переписывать функции , но лучшим подходом часто является просто удаление функции страницы:
    (unsafeWindow.badFunc = function () {})
    и замените / добавьте измененные функции в области действия сценария GM.


  4. Но для вопроса, поскольку он в настоящее время размещен, вам не нужно ничего делать. Исходя из того, что показано, сценарий будет выглядеть так:

    helloworld = function () {
    
        alert ('Hello world!');
        helloworld2 ();
    }
    
    helloworld2 = function () {
    
        alert ('Hello world!2');
        helloworld ();
    }
    
    // WARNING this will launch an infinite loop!!
    helloworld2 ();
    
1 голос
/ 19 мая 2011

Это очень поможет, если вы отформатируете свой код:

> unsafeWindow.helloworld = function() {
> 
>     alert('Hello world!');
> 
>     // fails with error saying it does not exist
>     helloworld2(); 
> }
> 
> unsafeWindow.helloworld2 = function() {
> 
>     alert('Hello world!2');
> 
>     //fails with error saying it does not exist
>     helloworld();
> 
> }

Вы имеете бесконечно рекурсивную функцию - helloworld звонки helloworld2 , который вызывает helloworld и т. д. до бесконечности .

Но в любом случае вы устанавливаете свойство unsafeWindow:

unsafeWindow.helloworld = function() {

, но затем пытаетесь вызвать его с помощьюнеквалифицированный идентификатор, который разрешается в цепочке областей действия:

[... later, in helloword2 ...]

      helloworld();

Таким образом, идентификатор helloworld разрешается в цепочке scope объекта выполнения / переменной, созданного, когда unsafeWindow.helloworld2call.

Таким образом, helloworld устанавливается как свойство из unsafeWindow.Когда вызывается функция, идентификатор helloworld2 будет разрешен с использованием цепочки функции scope .

В браузерах объект window / global находится в цепочке областей действия, поэтому имена переменныхможет быть найден там (то есть переменные могут преобразовываться в свойства глобального объекта, если они не найдены раньше в цепочке областей действия), но я подозреваю, что когда вызывается unsafeWindow.helloworld, его цепочка областей действия заканчивается глобальным объектом документа, а не unsafeWindow.В противном случае вызовы функций в документе также будут иметь unsafeWindow в их цепочке областей действия, что мне не кажется правильным.

Или я могу быть совершенно неправ в этом.: -)

...