Вопрос

У меня есть следующий якорный тег, который содержит динамически генерируемые аргументы arg1,...,arg5 к функции JavaScript foo(), который работает на веб-сайте. Есть несколько из этих якорных меток на протяжении рассматриваемой страницы, с уникальными id ценности и argN значения:

<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a>

Я хотел бы программно огонь foo() Функция, зацикливающаяся через все удары для этого элемента, в поисках аргументов и передача этих аргументов Greasemoskey's unsafeWindow.function(args) вызов.

Вот сценарий Greasemonkey, который я написал до сих пор:

function removeAllProperties() {
    var xpath = "//A[@title='foobarbaz']";
    var actionNodes = document.evaluate(
                                    xpath,
                                    document,
                                    null,
                                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                                    null
                                    );
    var total = actionNodes.snapshotLength;

    for (var i=0; i < total; i++) {
        var candidate = actionNodes.snapshotItem(i);
        //alert(candidate.nodeName);                                                                                                                                                                                                                                                      
        if (candidate.nodeName === "A") {
            var onclick_value = candidate.getAttribute('onclick');
            var needle = /javascript:foo\((.*)\);return false\;/;
            onclick_value.match(needle);
            //alert(onclick_value);                                                                                                                                                                                                                                                       
            //alert(RegExp.$1);                                                                                                                                                                                                                                                           
            var script_args = RegExp.$1;
            if (confirm(script_args)) { 
                unsafeWindow.foo(script_args); 
            }
        }
    }
}

removeAllProperties();

Когда я устанавливаю этот скрипт и запустите его, я получаю предупреждение с аргументами arg1,...,arg5. Отказ Если я нажаю кнопку ОК, я получаю следующую ошибку в Google Chrome 5.0.375.125 для OS X:

Uncaught TypeError: Object [object DOMWindow] has no method 'foo'

Веб-страница рассматривается определенно имеет foo() - Если я нажму на blah тогда onclick событие триггеры foo(). Отказ Я просто не могу работать через этот сценарий Greasemonkey.

Я использую unsafeWindow.function(args) Неправильно, или Google Chrome не поддерживает этот метод срабатывания удаленных функций JavaScript?

Есть ли другой способ, которым я должен использовать эту функцию, или я должен использовать другой метод целиком?

Спасибо за совет.

Это было полезно?

Решение

В Chrome вам не разрешено получать доступ к переменным / функциям, определенным страницей контента из контекста пользователя (см. здесь).

Вместо звонка unsafeWindow.foo, вы могли бы просто позвонить candidate.onclick() в вашей петле.

Если это не то, что вы хотите, вы либо должны вводить функцию вызов в DOM, используя что-то вроде

var s = document.createElement("script");
s.innerHTML = "foo("+ script_args + ")";
document.body.appendChild(s);

или назначить JS-URI для location:

location.assign("javascript:foo(" + script_args +");void 0");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top