Saya sedang mencari cara bagaimana berkomunikasi antara banyak tab atau jendela di browser (pada domain yang sama, bukan CORS) tanpa meninggalkan jejak. Ada beberapa solusi:
Yang pertama mungkin adalah solusi terburuk - Anda perlu membuka jendela dari jendela Anda saat ini dan kemudian Anda dapat berkomunikasi hanya selama Anda tetap membuka jendela. Jika Anda memuat ulang halaman di salah satu jendela, kemungkinan besar Anda kehilangan komunikasi.
Pendekatan kedua, menggunakan postMessage, mungkin memungkinkan komunikasi lintas asal, tetapi mengalami masalah yang sama dengan pendekatan pertama. Anda perlu mempertahankan objek jendela.
Cara ketiga, menggunakan cookie, menyimpan beberapa data di browser, yang secara efektif dapat terlihat seperti mengirim pesan ke semua jendela di domain yang sama, tetapi masalahnya adalah Anda tidak akan pernah tahu apakah semua tab membaca "pesan" sudah atau belum sebelumnya membersihkan. Anda harus menerapkan semacam batas waktu untuk membaca cookie secara berkala. Selain itu, Anda dibatasi oleh panjang cookie maksimum, yaitu 4KB.
Solusi keempat, menggunakan localStorage, tampaknya mengatasi keterbatasan cookie, dan bahkan dapat mendengarkan-menggunakan acara. Cara menggunakannya dijelaskan dalam jawaban yang diterima.
Sunting 2018: jawaban yang diterima masih berfungsi, tetapi ada solusi yang lebih baru untuk peramban modern, untuk menggunakan BroadcastChannel. Lihat jawaban lain untuk contoh sederhana yang menjelaskan cara mudah mengirim pesan antar tab dengan menggunakan BroadcastChannel.
sumber
Jawaban:
Sunting 2018: Anda sebaiknya menggunakan BroadcastChannel untuk tujuan ini, lihat jawaban lain di bawah ini. Namun jika Anda masih lebih suka menggunakan penyimpanan lokal untuk komunikasi antar tab, lakukan seperti ini:
Untuk mendapat pemberitahuan saat tab mengirim pesan ke tab lain, Anda hanya perlu mengikat acara 'penyimpanan'. Di semua tab, lakukan ini:
Fungsi
message_receive
akan dipanggil setiap kali Anda menetapkan nilai localStorage di tab lain. Pendengar acara juga berisi data yang baru saja disetel ke localStorage, jadi Anda bahkan tidak perlu menguraikan objek localStorage itu sendiri. Ini sangat berguna karena Anda dapat mengatur ulang nilai tepat setelah ditetapkan, untuk membersihkan jejak secara efektif. Berikut adalah fungsi untuk olahpesan:Jadi sekarang setelah tab Anda mengikat acara onstorage, dan Anda memiliki dua fungsi ini diimplementasikan, Anda dapat dengan mudah menyiarkan pesan ke panggilan tab lain, misalnya:
Ingatlah bahwa mengirim pesan yang sama persis dua kali akan diperbanyak hanya sekali, jadi jika Anda perlu mengulangi pesan, tambahkan beberapa pengidentifikasi unik kepadanya, seperti
Juga ingat bahwa tab saat ini yang menyiarkan pesan tidak benar-benar menerimanya, hanya tab atau jendela lain di domain yang sama.
Anda dapat bertanya apa yang terjadi jika pengguna memuat halaman web yang berbeda atau menutup tabnya tepat setelah panggilan setItem () sebelum removeItem (). Nah, dari pengujian saya sendiri browser menahan bongkar sampai seluruh fungsi
message_broadcast()
selesai. Saya diuji untuk menaruh beberapa siklus yang sangat lama untuk () dan masih menunggu sampai siklus selesai sebelum ditutup. Jika pengguna membunuh tab hanya di antara, maka browser tidak akan punya cukup waktu untuk menyimpan pesan ke disk, sehingga pendekatan ini bagi saya seperti cara aman mengirim pesan tanpa jejak. Komentar diterima.sumber
Ada API modern yang didedikasikan untuk tujuan ini - Saluran Siaran
Semudah:
Mungkin, terlepas dari kebersihan API, ini adalah manfaat utama API ini - tidak ada pengerasan objek.
Saat ini hanya didukung di Chrome dan Firefox, tetapi Anda dapat menemukan polyfill yang menggunakan localStorage.
sumber
Bagi mereka yang mencari solusi yang tidak berdasarkan jQuery, ini adalah versi JavaScript sederhana dari solusi yang disediakan oleh Thomas M:
sumber
Checkout AcrossTabs - Komunikasi yang mudah antara tab browser lintas asal. Itu menggunakan kombinasi postMessage dan sessionStorage API untuk membuat komunikasi lebih mudah dan dapat diandalkan.
Ada pendekatan yang berbeda dan masing-masing memiliki kelebihan dan kekurangan. Mari kita bahas masing-masing:
Penyimpanan lokal
Pro :
Cons :
Kue
Pro:
Cons:
Data dikirim kembali ke server untuk setiap permintaan HTTP (HTML, gambar, JavaScript, CSS, dll) - meningkatkan jumlah lalu lintas antara klien dan server.
Biasanya, yang berikut ini diizinkan:
sessionStorage
Pro:
localStorage
.Cons:
localStorage
, ini bekerja pada kebijakan asal-sama . Jadi, data yang disimpan hanya akan tersedia pada sumber yang sama.PostMessage
Pro:
Cons:
targetOrigin
dan memeriksa kewarasan untuk data yang diteruskan ke pendengar pesan.Kombinasi dari PostMessage + SessionStorage
Menggunakan postMessage untuk berkomunikasi antara banyak tab dan sekaligus menggunakan sessionStorage di semua tab / jendela yang baru dibuka untuk mempertahankan data yang sedang lewat. Data akan tetap ada selama tab / windows tetap dibuka. Jadi, bahkan jika tab / jendela pembuka ditutup, tab / jendela yang dibuka akan memiliki seluruh data bahkan setelah disegarkan.
Saya telah menulis pustaka JavaScript untuk ini, bernama AcrossTabs yang menggunakan postMessage API untuk berkomunikasi antara tab asal / jendela dan sessionStorage untuk tetap membuka tab / identitas jendela yang dibuka selama masih hidup.
sumber
AcrossTabs
, apakah mungkin untuk membuka situs web yang berbeda di tab lain, dan mendapatkan data dari itu ke tab induk? Saya akan memiliki detail otentikasi untuk situs web lain.Metode lain yang harus dipertimbangkan orang untuk digunakan adalah Pekerja Bersama. Saya tahu ini adalah konsep yang mutakhir, tetapi Anda dapat membuat relay pada Pekerja Bersama yang JAUH lebih cepat daripada penyimpanan lokal, dan tidak memerlukan hubungan antara jendela induk / anak, asalkan Anda menggunakan asal yang sama.
Lihat jawaban saya di sini untuk beberapa diskusi yang saya buat tentang ini.
sumber
Ada komponen open-source kecil untuk menyinkronkan / berkomunikasi antara tab / windows dengan asal yang sama (penafian - saya salah satu kontributor!) Yang berbasis di sekitar
localStorage
.https://github.com/jitbit/TabUtils
PS Saya mengambil kebebasan untuk merekomendasikannya di sini karena sebagian besar komponen "kunci / mutex / sinkronisasi" gagal pada koneksi websocket ketika peristiwa terjadi hampir secara bersamaan
sumber
Saya telah membuat perpustakaan sysend.js , ini sangat kecil, Anda dapat memeriksa kode sumbernya. Perpustakaan tidak memiliki dependensi eksternal.
Anda dapat menggunakannya untuk komunikasi antara tab / windows di browser dan domain yang sama. Perpustakaan menggunakan BroadcastChannel, jika didukung, atau acara penyimpanan dari localStorage.
API sangat sederhana:
ketika browser Anda mendukung BroadcastChannel, ia mengirim objek literal (tetapi sebenarnya serial-otomatis oleh browser) dan jika tidak serial ke JSON pertama dan deserialized di ujung lainnya.
Versi terbaru juga memiliki helper API untuk membuat proxy untuk komunikasi Cross-Domain. (memerlukan file html tunggal pada domain target).
Ini demo .
EDIT :
Versi baru juga mendukung komunikasi Lintas-Domain , jika Anda menyertakan
proxy.html
file khusus pada domain target danproxy
fungsi panggilan dari domain sumber:(proxy.html ini adalah file html yang sangat sederhana, yang hanya memiliki satu tag skrip dengan perpustakaan).
Jika Anda ingin komunikasi dua arah, Anda harus melakukan hal yang sama pada
target.com
domain.CATATAN : Jika Anda akan menerapkan fungsionalitas yang sama menggunakan localStorage, ada masalah di IE. Acara penyimpanan dikirim ke jendela yang sama, yang memicu acara dan untuk browser lain hanya dipanggil untuk tab / jendela lain.
sumber
Saya membuat modul yang bekerja sama dengan Broadcastchannel resmi tetapi memiliki cadangan berdasarkan penyimpanan lokal, indeks dan unix-soket. Ini memastikan itu selalu berfungsi bahkan dengan Webworkers atau NodeJS. Lihat pubkey: BroadcastChannel
sumber
Saya menulis artikel tentang ini di blog saya: http://www.ebenmonney.com/blog/how-to-implement-remember-me-functionality-using-token-based-authentication-and-localstorage-in-a- aplikasi web .
Menggunakan perpustakaan yang saya buat
storageManager
Anda dapat mencapai ini sebagai berikut:Ada metode nyaman lainnya juga untuk menangani skenario lain juga
sumber
Ini adalah
storage
bagian pengembangan dari jawaban Tomas M untuk Chrome. Kita harus menambahkan pendengarMuat / simpan item dalam penyimpanan tidak meruntuhkan acara ini - kami HARUS memicu secara manual oleh
dan sekarang, semua tab terbuka akan menerima acara
sumber