سؤال

لدي علامة مرساة التالية ، والتي تحتوي على حجج تم إنشاؤها ديناميكيًا 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");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top