جافا سكريبت؛ التواصل بين علامات التبويب / النوافذ بنفس الأصل [مكررة

StackOverflow https://stackoverflow.com/questions/2236828

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لدي اثنين من النوافذ: نافذة A والنافذة B.

  • نافذة A ونافذة B لديها نفس المجال
  • نافذة A و Window B لا تملك أي نافذة الأصل.

أسئلة:

  1. هل من الممكن للنافذة الحصول على مرجع النافذة ب؟
  2. ما هي الطريقة الأكثر أناقة لإنشاء نوافذ إخطار لشيء ما للإطار ب؟
    (بما في ذلك مواصفات HTML5 الجديدة)

طريقتان أدرك القيام بذلك:

  • المراسلة عن طريق الخادم: حيث يسأل النافذة B النظامية الخادم إذا أبلغت الإطار A شيئا ما
  • المراسلة عن طريق البيانات المحلية (HTML5): عندما تريد النافذة أن تخطر شيئا يغير البيانات المحلية، يتحقق الكتابية النافذة B البيانات المحلية لأي تغييرات.

لكن الاتجاهين ليست أنيقة جدا.
على سبيل المثال، سيكون من الرائع الحصول على مرجع النافذة B واستخدام window.postmessage () (HTML5)

الهدف النهائي هو جعل شيء مثل Facebook حيث إذا قمت بفتح علامة تبويب في Facebook ودردشة في علامة تبويب واحدة، فستكون المحادثة محدثة في كل علامة تبويب في الفيسبوك، وهو أنيق!

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

المحلول

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

localStorage يتم تنفيذها في جميع المتصفحات الحديثة.

ال storage حرائق الحدث عندما آخر علامات التبويب يجعل التغييرات localStorage. وبعد هذا مفيد للغاية لأغراض الاتصال.

يمكن العثور على المراجع هنا:
Webstorage.
Webstorage - حدث تخزين

نصائح أخرى

يتيح قيادة BroadClannel القيام بذلك. الآن يتم تنفيذها في فايرفوكس والكروم (هل بإمكاني استخدم, MDN.):

// tab 1
var ch = new BroadcastChannel('test');
ch.postMessage('some data');

// tab 2
var ch = new BroadcastChannel('test');
ch.addEventListener('message', function (e) {
    console.log('Message:', e.data);
});

SharedWorker هو المواصفات Whatwg / HTML5 لعملية مشتركة يمكن أن تتواصل بين علامات التبويب.

قلت لديك:

الهدف Utluate هو جعل شيء مثل Facebook حيث إذا قمت بفتح علامات تبويب Facebook 4، والدردشة في علامة تبويب واحدة، فإن الدردشة تتحقق في كل علامة تبويب في الفيسبوك، Wich هي أنيق!

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

منذ سنوات وجدت أنه إذا فعلت window.open باستخدام اسم نافذة موجودة وعنوان URL فارغ، حصلت على مرجع إلى النافذة الموجودة (هذا السلوك حتى موثقة على MDC. وتعليق على مستندات MSDN. يقترح أنه يعمل في IE أيضا). لكن ذلك كان منذ سنوات، لا أعرف كم هو عالمي دعمه في عالم اليوم، وبالطبع لن يكون لديك اسم نافذة للبحث عنه إلا إذا كان كل النوافذ الخاصة بك يتضمن اسمه iframe للتواصل، اسمه بشكل فريد عبر رمز جانب الخادم، ثم يتم إرساله إلى النوافذ الأخرى عن طريق رمز جانب الخادم ... (الفكر المخيف: قد يكون ذلك في الواقع ممكنا. تخزين أسماء النوافذ الحالية "المتعلقة بتسجيل الدخول في حساب في جدول، قم بإعطاء القائمة إلى أي نافذة جديدة تم إنشاؤها التي تقوم بتسجيل الدخول إلى هذا الحساب، والإدخالات غير النشطة القديمة Cull. ولكن إذا كانت القائمة قديمة قليلا، فسوف تفتح نوافذ جديدة عند البحث عن الآخرين ... وأنا دعم الرهان هو IFFY من المتصفح إلى المتصفح.)

إلى جانب القادمة مشاركتها, ، تستطيع ايضا استخذام المراسلة عبر المستندات, ، وهذا هو أكثر من ذلك بكثير أيد. وبعد في هذا السيناريو، يجب أن تكون هناك نافذة رئيسية مسؤولة عن فتح جميع النوافذ الأخرى window.open. وبعد يمكن أن تستخدم النوافذ الطفل بعد ذلك بعد الاكتسم على هم window.opener.

إذا كان استخدام Flash هو خيار لك، فهناك أيضا أكبر سنا localconnection. مدعومة تقريبا على أي عميل مع مثبت فلاش (مثال رمز).

طرق الاحتياطات الأخرى:
البرنامج المساعد PostMessage ل JQUERY مع Window.Location.Href Fallback for المتصفحات القديمة
الحل القائم على ملفات تعريف الارتباط للاتصال غير الفوري

AFAIK، من المستحيل التواصل عبر النوافذ إذا لم يكن لديهم نفس الوالدين.

إذا تم فتح كلاهما من نافذة أحد الوالدين، يجب أن تكون قادرا على الحصول على المراجع المتغيرة الأصل.

في الوالد، افتح Windows مثل هذا:

childA = window.open(...);
childB = window.open(...)

في الطفل، الوصول إلى الطفل مثل هذا:

childB = window.opener.childA

لدي طريقة أنيقة للقيام بهذه الخدعة، ولكن مع القيود: يجب أن تسمح بالنافذ النوافذ المنبثقة لنطاقك وستحصل على صفحة واحدة مفتوحة دائما (كعلامة تبويب أو منبثق) والتي ستنفذ الاتصالات بين Windows.

إليك مثال:http://test.gwpanel.org/test/page_one.html.(تحديث الصفحة بعد تمكين النوافذ المنبثقة للمجال)

يتم فتح الميزة الرئيسية لهذه الخدعة - المنبثقة مع شظية URL '#' في النهاية، هذا متصفح القوة لا يغير موقع النافذة وتخزين جميع البيانات. ونافذة.PostMessage تفعل الباقي.

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