Greasemonkey: لا يمكن الوصول إلى المتغيرات المحددة في<script>tags on the actual page.</script>

تم إنشاؤها على ١٨ نوفمبر ٢٠١٧  ·  14تعليقات  ·  مصدر: greasemonkey/greasemonkey

مع التحديث إلى Greasemonkey 4 ، يبدو أن العديد من نصوص المستخدمين التي تستخدم jQuery قد تم كسرها. في الإصدارات السابقة ، ستعمل الشفرة التالية على صفحة تستخدم jQuery في علامة <script> :

// ==UserScript==
// <strong i="7">@name</strong>        Variable access test
// <strong i="8">@namespace</strong>   example.com
// ==/UserScript==

$.ready(document, function() {
    console.log("Accessed jQuery successfully.")
});

ومع ذلك ، هذا لم يعد يعمل - بدلاً من ذلك ، يمكنك فقط الحصول على $ is not defined كلاسيكي. هذا يخبرني أن Greasemonkey ربما يقوم بتشغيل usercript قبل تحميل علامة <script> . هذا غريب ، مع ذلك ، نظرًا لأن النص لا يزال يعمل عندما يكون document.readyState interactive !

للتأكد من ذلك ، حاولت الوصول إلى jQuery بعد window.addEventListener('load', ...) . وها ، ما يلي يُظهر خطأ مختلفًا:

// ==UserScript==
// <strong i="19">@name</strong>        Variable access test
// <strong i="20">@namespace</strong>   example.com
// ==/UserScript==

window.addEventListener('load', function() {
    console.log("Before accessing jQuery")
    $;
    console.log("Accessed jQuery successfully!")
});

لا يتم تشغيله ولا يؤدي إلى حدوث خطأ - بدلاً من ذلك ، يتجمد عند محاولة الوصول إلى $ . يتم تشغيل البرنامج النصي ببساطة حتى هذا السطر وليس أكثر.


جربه على أي صفحة تستخدم jQuery ويجب أن تحصل على نفس النتيجة. لا يعد استخدام @require حلاً لهذه المشكلة - فبالنسبة لبعض التطبيقات ، تحتاج إلى الوصول إلى نفس مثيل jQuery مثل الصفحة. يؤثر هذا على الأرجح على البرامج النصية بخلاف jQuery أيضًا.

duplicate

التعليق الأكثر فائدة

لقد جربت هذا النهج الآن (في تكوينات مختلفة) ، وما زلت أتلقى أخطاء الأذونات مهما فعلت. إنه حقًا لا يستحق العناء في هذه المرحلة.

يبدو الأمر قاسيًا ، لكنني أعتقد أنني سأوصي الناس باستخدام Tampermonkey حتى ينتهي الأمر. نصوص المحتوى ، في تجسيدها الحالي ، لا تتناسب مع حالة استخدام المستخدم بشكل جيد على الإطلاق.

ال 14 كومينتر

ليست مشكلة Greasemonkey حقًا ، إنها مشكلة نصية لمحتوى Firefox.
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#Accessing_page_script_objects_from_content_scripts

إما أن تقوم بتعيين window.wrappedJSObject الخاص بك أو استخدام unsafeWindow حيث قام Greasemonkey بتعيين الكائن المغلف بالفعل.

Sxderp أنا لا أعرف "ليست مشكلة Greasemonkey حقًا" - يتعامل كل من Tampermonkey و Violentmonkey مع هذه الحالة بالذات دون مشاكل. ليس هذا فقط ، ولكن هذا تغيير جذري لم يرد ذكره في أي من مشاركات المدونة.

من أجل العمل كما هو متوقع مع نصوص المستخدمين الحالية ولأن تكون متوافقة مع مديري نصوص المستخدمين الشائعة الأخرى ، ألا يجب إصلاح ذلك؟

أيضا ... هل هذا حقا يفسر المشكلة؟ لماذا يتجمد النص وليس مجرد عملية بحث فاشلة؟

لست متأكدا بشأن التجميد. نسخ الكود الخاص بك ولا يتجمد من أجلي.

تحرير: آسف ، أساء فهم تعليق "التجميد". اعتقدت أنك تقصد أن Greasemonkey لا يعمل بعد الآن. إنه "يتجمد" (يتوقف عن التنفيذ) عند هذا السطر لأن جافا سكريبت تصل إلى استخدام قبل خطأ التصريح. متأكد أن هذا يعتبر "قاتلة". كما هو الحال في ، لا تستمر في تنفيذ التعليمات البرمجية.


وبإلقاء نظرة سريعة على كود Violentmonkey، يبدو أنها لضخ البرامج النصية من خلال خلق <script> العناصر . بدلاً من استخدام طريقة tabs.executeScripts() API.

استخدام ذلك له عيوبه أيضًا ، بالطبع.

إذن ... عندما يصطدم Firefox بهذا الخط ، فإنه يتوقف بصمت عن التنفيذ؟ بدون أي رسالة خطأ؟ يا له من شيء غريب بشكل لا يصدق.

على أي حال ، أليس الهدف هو الحفاظ على التوافق مع نصوص المستخدمين الموجودة؟ هذه ليست ميزة متخصصة ، بعد كل شيء - التفاعل مع JavaScript الخاص بالصفحة أمر شائع جدًا للقيام به.

على أي حال ، أليس الهدف هو الحفاظ على التوافق مع نصوص المستخدمين الموجودة؟

بالطبع هو كذلك. نحن لسنا مثاليين ، وهذا مشروع مجاني مفتوح المصدر أنشأه متطوعون مع الكثير من وقت الفراغ فقط.

في هذه المرحلة ، لديّ خطة لكيفية تحسين ذلك ، لكنني في انتظار Mozilla لتنفيذ ميزة تجعل من الممكن القيام بها بشكل آمن. # 2549

arantius أعتقد أنني قد أكون مجابهة قليلاً ... آسف لذلك.

أعتقد أنه قرار مدروس لإعطاء الأولوية للأمان على سهولة الاستخدام هنا. حتى يتم حل الموقف ، ما الذي يمكننا فعله كحل بديل من جانب مؤلف النص؟ في حالتي المحددة ، جربت كلاً من var $ = window.wrappedJSObject.$; و var $= unsafeWindow.$; في الجزء العلوي من النص البرمجي ، لكن هذا أعطاني خطأ آخر عند محاولة استخدام $(document).ready(...) : Error: Permission denied to access property Symbol.toStringTag .

خطأ: تم رفض الإذن بالوصول إلى الخاصية Symbol.toStringTag

لا أعتقد أن هذه مشكلة تتعلق بـ window.wrappedJSObject.$ ولكن بالأحرى بعض العناصر الأخرى التي قمت بإنشائها في usercript ، إما ككائن حرفي أو باستخدام مُنشئ new ، لم يتم استيراده بشكل صحيح إلى النطاق الذي تحاول الوصول إليه (ربما يكون نطاق نافذة الصفحة).

يوفر الرابط أعلاه تفاصيل حول cloneInto وهو ما ستحتاج إليه.

لا ، أنا متأكد تمامًا من أن المشكلة تكمن في window.wrappedJSObject.$ . فشل ما يلي مع نفس الخطأ نفسه:

// ==UserScript==
// <strong i="7">@name</strong>        Variable access test
// <strong i="8">@namespace</strong>   example.com
// ==/UserScript==

var $ = window.wrappedJSObject.$;

$(document).ready(function() {});

ومع ذلك ، فإن هذا فشل بصمت:

// ==UserScript==
// <strong i="12">@name</strong>        Variable access test
// <strong i="13">@namespace</strong>   example.com
// ==/UserScript==

var $ = window.wrappedJSObject.$;

$.ready(function() {});

لقد حاولت استخدام cloneInto ، لكن ذلك لا يساعد. هل تعتقد أنه يمكنك تقديم مثال قصير على نص مستخدم يستخدم نسخة الصفحة $ ؟

آه ، في هذه الحالة ليس لديك إذن للوصول إلى الوظيفة. ستحتاج بعد ذلك إلى استخدام exportFunction .

// ==UserScript==
// <strong i="7">@name</strong>         ExampleJQuery
// <strong i="8">@version</strong>      1
// <strong i="9">@include</strong>      *
// <strong i="10">@grant</strong>        none
// ==/UserScript==

var unsafeWindow = window.wrappedJSObject;
var $;

// For sanity just return if we don't have the object
if (typeof unsafeWindow.$ === 'undefined') {
  console.log('No jQuery object, returning');
  return;
} else {
  $ = unsafeWindow.$;
}

// Create the function we want to export
function onReady() {
  console.log("I'm ready!");
}
// Export it. Some details on this.
// Argument 1. The function to export
// Argument 2. The scope to export it to. In general this will be window,
//             or some object in the scope. While it is valid to use
//             "window", I prefer to use "unsafeWindow" if I'm exporting
//             into that scope. I find it less confusing.
// Return      This is a reference to exported function. In general you'll
//             assign this to some property of the scope you're exporting
//             into. However, it's not always neccessary. For example, if
//             you're going to use it as a callback (like for .ready())
//             then you don't need to assign it into the exported scope.
//             But if you want it globally (or scopally) accessable then
//             you need to assign it.
let exported_onReady = exportFunction(onReady, unsafeWindow);
// OR
// unsafeWindow.onReady = exportFunction(onReady, unsafeWindow);

$(document).ready(exported_onReady);
// OR
// $(document).ready(unsafeWindow.onReady);

لقد جربت هذا النهج الآن (في تكوينات مختلفة) ، وما زلت أتلقى أخطاء الأذونات مهما فعلت. إنه حقًا لا يستحق العناء في هذه المرحلة.

يبدو الأمر قاسيًا ، لكنني أعتقد أنني سأوصي الناس باستخدام Tampermonkey حتى ينتهي الأمر. نصوص المحتوى ، في تجسيدها الحالي ، لا تتناسب مع حالة استخدام المستخدم بشكل جيد على الإطلاق.

أتفق مع obskyr ، فقط أوصي شعبي لاستخدام tampermonkey

+1 ، التي تم نقلها إلى Tampermonkey (https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/) ، يبدو أن جميع نصوصي تعمل هناك.

+1 ، التي تم نقلها إلى Tampermonkey (https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/) ، يبدو أن جميع نصوصي تعمل هناك.

قد يعمل هذا على المدى القصير ، ويعمل بشكل جيد للحفاظ على تشغيل البرامج النصية ، ولكن على المدى الطويل ، قد يكون قرارًا خاطئًا الاعتماد على استبدال كامل. قد يكون النجاح قصير المدى قصير النظر ... ؛-)

أستخدم TM كبديل ، ولكن هناك بعض المشكلات المتعلقة به ، ولا يمكنني إنكارها. بالإضافة إلى ذلك ، قد تكون هناك بعض المشكلات الأمنية مع FF Quantum ، لذا فهي تعمل ، ولكن لا ينبغي للمرء الاعتماد على حل واحد فقط ...

حسنًا ، أحتاج إلى دعم TM في البرامج النصية الخاصة بي على أي حال لأنه لا يستخدم كل شخص Firefox. لذا قبل أن كنت أدعم GM و TM ، أصبح الأمر الآن مجرد TM. لم ألاحظ أي مشاكل حتى الآن.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات