Greasemonkey: تمرير بيانات سلسلة فريدة إلى علامات التبويب المفتوحة؟

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

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

ال 10 كومينتر

راجع أيضًا https://github.com/greasemonkey/greasemonkey/issues/2134
(تستخدم فقط للسياق)

هذا يؤكد ببساطة أن GM_openInTab ترجع قيمة خالية ، لكنها لا تشير إلى حالة الاستخدام الخاصة بي.

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

لاحظ أن محتوى الويب يمكنه الاستماع / التلاعب بهذه الأنواع من قنوات الاتصال.

سوف أتجنب المراسي لهذا السبب بالذات.

يمكنك استخدام قناة اتصال التسمية GM_info.uuid معها.
نظرًا لأن البرنامج النصي UUID فريد من نوعه لـ script + computer + profile فهو آمن بدرجة كافية.
ملاحظة: لا تنسَ استخدام مجموعة البيانات الوصفية // <strong i="8">@grant</strong> GM_info .

يبدو أن هذا للتواصل بين البرامج النصية المختلفة ، وليس نفس البرنامج النصي الذي يتم تشغيله على صفحة جديدة.

Sasstraliss لماذا تعتقد أنه "للتواصل بين النصوص المختلفة"؟ لا يمكن للبرنامج النصي الحصول على UUID لنص مختلف - فقط UUID من نفس البرنامج.

هذه خدعة تعلمتها من reddit. قدر لا بأس به من الشفرة الكاذبة فيما يتعلق بالمتغيرات ، ولكنها قد تساعد. بافتراض أن النافذة الهدف والنافذة الرئيسية موجودة على المواقع ، فإن البرنامج النصي مخصص لـ ...

var stringData;

var awakener = window.opener || window.parent;
if(awakener && awakener != window)
{
    //Used when a page is launched from a link so that passData can...well...pass data. But we can't use onload from there so instead we're using postMessage here to convey to the "parent" window that this window is ready to recieve data
    awakener.postMessage("Loaded","*");
}

window.addEventListener("message", messageDetected, false);

clickableThing.onclick = function() {
    var newWindow = window.open(this.href,this.target);
    passData(window,newWindow,dataToPass);
    return false;
};

function messageDetected(event)
{
    if(typeof(event.data) == "string" && event.data != "Loaded")
    {
        stringData = event.data;
    }
}

function passData(mainWindow,target,data)
{
    mainWindow.addEventListener("message", passItOn, false);
    function passItOn(event)
    {
        if(event.source == target) target.postMessage(data,"*");
    }
}

DoomTay ، يرجى استخدام علامات الاقتباس الثلاثية للحفاظ على تنسيق المصدر.

@ قال the8472 :

استخدام قنوات البث

للأسف ، هذه تقنية تجريبية متوفرة فقط في Fx38 +. الحل الأكثر ملاءمة هو استخدام واجهة برمجة تطبيقات التخزين المحلي وأحداث التخزين. انظر http://stackoverflow.com/questions/2236828/javascript-communic-between-tabs-windows-with-same-origin/12514384#12514384

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