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()
وظيفة عن طريق حلقة جميع الزيارات لهذا العنصر ، والبحث عن الحجج ، وتمرير تلك الحجج إلى Greasemonkey'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");