Greasemonkey, chrome и unsafewindow.foo ()
-
25-09-2019 - |
Вопрос
У меня есть следующий якорный тег, который содержит динамически генерируемые аргументы 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");