سؤال

لديّ نص Greasemonkey يعمل بشكل جيد في Firefox و Opera. أنا أواجه مع العمل في كروم ، ومع ذلك. تكمن المشكلة في حقن وظيفة في الصفحة التي يمكن استدعاؤها بواسطة رمز من الصفحة. هذا ما أفعله حتى الآن:

أولاً ، أحصل على إشارة مساعد إلى Unsafewindow ل Firefox. هذا يتيح لي أن يكون لدي نفس الكود لـ FF و Opera (والكروم ، اعتقدت).

var uw = (this.unsafeWindow) ? this.unsafeWindow : window;

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

uw.setConfigOption = function(newValue) {
    setTimeout(setConfigOption, 0, newValue);
}

ثم ، هناك الوظيفة المقابلة في البرنامج النصي:

setConfigOption = function(newValue) {
    // do something with it, e.g. store in localStorage
}

أخيرًا ، حقن بعض HTML في الصفحة مع رابط لاستدعاء الوظيفة.

var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);

لتلخيص: في Firefox ، عندما ينقر المستخدم على الرابط الذي تم حقنه ، فإنه سيقوم بتنفيذ استدعاء الوظيفة على Uncafewindow ، والذي يؤدي بعد ذلك إلى مهلة تستدعي الوظيفة المقابلة في سياق البرنامج النصي GM الخاص بي ، والذي يقوم بعد ذلك بالمعالجة الفعلية. (صححني إذا كنت مخطئًا هنا.)

في Chrome ، أحصل على خطأ "مرجعية غير معروفة: لم يتم تعريف setConfigoption". وبالفعل ، فإن إدخال "window.setConfigOption" في وحدة التحكم ينتج عنه "غير محدد". في Firebug و Console Opera Developer ، الوظيفة موجودة.

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

ألقيت نظرة سريعة على بدائل لـ Unsafewindow على Greasemonkey Wiki ، لكنها جميعها تبدو قبيحة للغاية. هل أنا تماما على المسار الخطأ هنا أم يجب أن أنظر عن كثب في هذه؟

الدقة: تتبعت ماكس س. النصيحة وهو يعمل في كل من Firefox و Chrome الآن. نظرًا لأن الوظائف التي كنت بحاجة إلى أن أكون متاحًا للصفحة اضطرت إلى الاتصال مرة أخرى إلى الوظائف العادية ، فقد نقلت البرنامج النصي بالكامل إلى الصفحة ، أي أنه ملفوف تمامًا في الوظيفة التي أطلق عليها "Main ()".

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

ما زلت لم أتمكن من الحصول على عداء نطاق المحتوى من عمل Greasemonkey Wiki. يجب أن تفعل الشيء نفسه ويبدو أنه ينفذ على ما يرام ، لكن وظائفي لا يمكن الوصول إليها أبدًا <a> عناصر من الصفحة ، على سبيل المثال. لم أحسب بعد سبب ذلك.

هل كانت مفيدة؟

المحلول

الطريقة الوحيدة للتواصل مع الكود الذي يعمل على الصفحة في Chrome هو من خلال DOM ، لذلك عليك استخدام اختراق مثل إدراج أ <script> علامة مع الكود الخاص بك. لاحظ أن هذا قد يثبت عربات التي تجرها الدواب إذا احتاج البرنامج النصي إلى تشغيله قبل كل شيء آخر على الصفحة.

تعديل: إليك الطريقة امتداد التنبيه الجميل هل هذا:

function main () {
  // ...
  window.alert = function() {/* ... */};
  // ...
}

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);

نصائح أخرى

لدي هذا :

contentscript.js:

function injectJs(link) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.src=link;
document.getElementsByTagName('head')[0].appendChild(scr)
//document.body.appendChild(scr);
}

injectJs(chrome.extension.getURL('injected.js'));

enjected.js:

function main() {
     alert('Hello World!');
}

main();

ألقيت نظرة سريعة على بدائل لـ Unsafewindow على Greasemonkey Wiki ، لكنها جميعها تبدو قبيحة للغاية. هل أنا تماما على المسار الخطأ هنا أم يجب أن أنظر عن كثب في هذه؟

يجب أن تنظر ، لأنه خيار متاح فقط. أفضل استخدام موقع الاختراق.

myscript.user.js:

function myFunc(){
  alert('Hello World!');
}

location.href="javascript:(function(){" + myFunc + "})()"

example.com/mypage.html

<script>
myFunc() // Hello World!
</script>

بالتأكيد ، إنه قبيح. لكنه يعمل بشكل جيد.


طريقة عداء نطاق المحتوى ، التي ذكرها Max S. أفضل من Hack Hack ، لأنه أسهل في التصحيح.

الإجابات الأخرى إما تجبرك على استخدامها تعبيرات الوظيفة, ، استيراد ملف إضافي خارجي أو استخدم اختراق طويل مرقح.

ستضيف هذه الإجابة JavaScript إلى الصفحة مباشرة من رمز المصدر الخاص بك. سوف تستخدم ECMASCRIPT 6 (ES6) قالب حرفي للحصول على سلسلة JavaScript متعددة الخطوط على الصفحة.

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = ` 
   function test() {
      alert(1);
   }
`;
document.getElementsByTagName('head')[0].appendChild(script);

يرجى ملاحظة backticks `` التي تحدد بداية ونهاية سلسلة متعددة الخطوط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top