Чи існують бібліотеки JavaScript з відкритим кодом, які адресують кілька вкладок браузера та стан клієнта для нових браузерів? [зачинено]


11

Існує кілька нових функцій HTML5, які перетворили його на нові веб-переглядачі, які дозволяють ділитися станом між вкладками, вікнами браузера, тим же вікном домену тощо. Тому, мабуть, стало простіше написати веб-додаток, який зберігає багато стану клієнт, а також інтелектуально управляє станом між вкладками та / або вікнами.

В даний час існують такі бібліотеки, як Backbone.js, які допомагають керувати станом в одній вкладці або в одному вікні. Чи є ще щось, що допомагає в декількох вкладках (або вікнах) керувати глобальним станом, специфічним станом на вкладці та подіями перехресних вкладок, не покладаючись на сервер, щоб синхронізувати їх усі?


2
Деякі веб-додатки (наприклад, Trello) обходять це просто, використовуючи WebSockets, щоб синхронізувати всіх клієнтів, в одному веб-переглядачі чи ні. Але це може бути корисним. Якби я писав подібну бібліотеку, я б зробив тонким шаром поверх поліфону для SharedWorkers, оскільки SharedWorkers робить багато чого, що вам потрібно тут, але ще недостатньо підтримується. Злобити цю роботу - це локальні сховища, які відкриваються навіть тоді, коли вкладки були відкриті незалежно.
mahemoff

1
Мене цього навчив викладач коледжу HTTP is great (and beutiful) because it is stateless. З тих пір, як я приєднався до індустрії, я шукаю цю красу, але не можу її знайти. Усі говорять лише про збереження стану, яке ви бачите!
Діпан Мехта

@DipanMehta: якщо ти подивишся на RFC2616, я не впевнений, що ти погодишся зі своїм вчителем щодо "краси" частини :) Хоча я б сказав, що ідея "чисто без громадянства" справді чудова, і я вважаю проблематичною що ми його
розрізаємо

Без громадянства та веб-додатки не так добре йдуть разом. Такі речі, як реєстрація у стані переносу. Чудово, якщо ви просто пропонуєте досить невеликі файли для тих, хто їх запитує, я думаю.
пнр

Я написав крихітну бібліотеку для спілкування між усіма відкритими вкладками вашого веб-сайту за допомогою трюку HTML5.
катамфетамін

Відповіді:


3

Коротка відповідь:

Ви не можете по-справжньому передавати інформацію про стан з однієї вкладки на іншу ...

Довга відповідь:

Ви не можете по-справжньому передавати інформацію про стан з однієї вкладки на іншу, оскільки це буде дуже серйозним порушенням пісочниці та безпеки.

Однак можна побічно передати стан між двома вкладками за допомогою:

Іншим варіантом буде просто спілкуватися за допомогою файлів cookie, щоб передавати інформацію між двома вкладками, але це, швидше за все, спричинить проблеми, бути сильно залежним від браузера і вимагатиме перезавантаження сторінок (і якщо чесно, я ніколи цього не пробував і просто думав про це, але інші зробили це ) .

Отже, оскільки розширення браузера, очевидно, є досить обмежуючим шляхом, ви повинні пройти шлях спілкування клієнт-сервер і розробити систему, яка дозволить клієнтам публікувати події на сервері, а потім повторно розсилає їх (або будь-який інший вид трансляції) іншим клієнтам через обраний протокол зв’язку.


Оновлення 1: Як хтось згадував у коментарі, перш ніж видалити його (не можна давати кредит, оскільки він не відображається у папці "Вхідні", вибачте)

HTML5 представляє window.postMessageAPI.

Для робочого прикладу див. Допис у блозі Джона Ресіга про обмін повідомленнями між вікнами . І що дуже цікаво, якщо ви подивитесь на коментарі до цього допису, ви помітите, що хтось на ім’я Мальте згадує бібліотеку, яку вони написали для використання window.postMessageв сучасних браузерах, або версію на основі файлів cookie для старих браузерів.

Прочитайте їх для отримання більш детальної інформації та прикладів:

Оновлення 2:

Майте на увазі, що як 2012-03-04, специфікація HTML5 все ще є чернетка, тому деякі функції можна буде видалити . Тому використовуйте обережно ...


Я, мабуть, помиляюся, оскільки HTML5 дійсно представляє API window.postMessage.
хайлем

Крім того, якщо ви прочитаєте допис у блозі Джона Ресіга про " Повідомлення між вікнами" та коментарі, ви помітите, що хтось, який називається Мальте, згадує про [бібліотеку] [3], яку вони написали, щоб використовувати це в сучасних браузерах або на основі файлів cookie для старші веб-переглядачі, тому моє печиво не було таким шаленим.
хайлем

3

Нещодавно я відкрив Intercom , який використовує локальний сховище, щоб реалізувати широкомовні повідомлення між вікнами. Місцеве сховище запускає подію ( onstorage), коли дані змінюються, тому опитування не потрібно. Інтерком дозволяє спілкуватися на всіх сторінках домену, незалежно від того, як вони були відкриті.


1

Якщо ваші вікна (сторінки) з одного домену (походження), localStorageїх можна використовувати для обміну даними та для трансляції повідомлень. Варто врахувати, що кожне вікно (сторінка) браузера працює в окремому потоці. Отже, якщо ми говоримо про взаємодію між вікнами, ми також говоримо про багатопотоковість.

Слід також розглянути деякі localStorageпроблеми з IE:

  • Я провів кілька тестів для localStorage в IE8. Після кількох тисяч змін у LocalStorage, вікна з того самого походження перестають отримувати події "зберігання". Навіть більше, тоді ви намагаєтесь читати з того ж елемента localStorage, значення можуть бути різними у різних вікнах. Отже, я б сказав, що IE8 не підтримує localStorage

  • IE9 та IE10 викликають обробник подій "зберігання", навіть якщо в цьому вікні змінено localStorage ( це суперечить специфікації ).

  • Також відомі проблеми з IE11 .

Нещодавно я опублікував міжвіконну бібліотеку зв'язку (усі функції описані в readme). Він забезпечує безпечний для потоків обмін даними, трансляцію подій. Він також вирішує деякі проблеми з IE (IE8, безумовно, не підтримується, помилка IE11 з iframe всередині другого батьківського походження може бути вирішена лише шляхом виправлення IE - очікування оновлення IE11).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.