Подтвердить что ты не робот

Javascript: обмен данными между вкладками

Каков наилучший способ обмена данными между открытыми вкладками в браузере?

4b9b3361

Ответ 1

Для более современного решения проверьте fooobar.com/questions/44592/...

Цитата:

Я придерживаюсь общего решения локальных данных, упомянутого в вопросе, используя localStorage. Это, пожалуй, лучшее решение с точки зрения надежности, эффективности и совместимости с браузерами.

localStorage реализован во всех современных браузерах.

Событие storage срабатывает, когда другие вкладки вносят изменения в localStorage. Это очень удобно для коммуникационных целей.

Справка:
http://dev.w3.org/html5/webstorage/
http://dev.w3.org/html5/webstorage/#the-storage-event

Ответ 2

Если первая вкладка автоматически открывает вторую вкладку, вы можете сделать что-то вроде этого:

Первая вкладка:

//open the first tab
var child_window = window.open( ...params... );

Вторая вкладка:

// get reference to first tab
var parent_window = window.opener;

Затем вы можете вызывать функции и делать всевозможные вещи между вкладками:

// copy var from child window
var var_from_child = child_window.some_var;

// call function in child window
child_window.do_something( 'with', 'these', 'params' )

// copy var from parent window
var var_from_parent = parent_window.some_var;

// call function in child window
parent_window.do_something( 'with', 'these', 'params' )

Ответ 3

Смотрите также другой поток StackOverflow: Javascript-связь между вкладками/окнами браузера.

По-моему, есть два хороших метода. Подойдет вам лучше, в зависимости от того, что вам нужно.

Если любой из них: You

  • не может хранить информацию на стороне сервера.
  • не может сделать много запросов http
  • хочу хранить только немного информации [1]
  • хотите быть чистым javascript/клиентской стороной.
  • требуется только для работы между вкладками/окнами в одном браузере

- > использовать файлы cookie (setCookie для отправки, getCookie/setTimeout для получения). Хорошая библиотека, которая делает это http://theprivateland.com/bncconnector/index.htm

Если любой из них: You

  • хотите сохранить информацию на стороне сервера.
  • хотите хранить много информации или хранить ее в соответствующем вопросе (т.е. таблицы или многомерные массивы [2])
  • также нужно использовать его для разных браузеров (не только между вкладками/окнами в одном браузере) или даже разными компьютерами/пользователями.

- > использовать Comet (длительный HTTP-запрос позволяет веб-серверу в основном передавать данные в браузер) для приема данных. И короткие запросы POST для отправки данных.

Etherpad и Facebook Chat также используют технику Comet.


[1] При использовании localStorage больше данных можно хранить, но, поскольку вы отказываетесь от файлов cookie, на это еще нельзя положиться. Если вы не используете приложение для современных браузеров, то только в этом случае это нормально.

[2] Сложные данные также могут храниться в файлах cookie (JSON-кодированные), но это не очень чисто (и для этого необходимы методы резервного копирования для браузеров без JSON.stringify/JSON.parse) и может быть неудачным в сценариях с участием concurrency. Невозможно обновить одно свойство значения cookie JSON. Вы должны проанализировать его, изменить одно свойство и перезаписать значение. Это означает, что другое редактирование может быть отменено теоретически. Опять же, при использовании localStorage это не проблема.

Ответ 4

Я просто посмотрел, как Facebook Chat это делает, и они оставляют запрос на сервер открытым чуть меньше минуты. Если данные возвращаются на сервер, сервер затем отправляет сообщение каждому открытому запросу. Если никакие данные не возвращаются через минуту, они повторно запрашивают и продолжают делать это (как долго, я не уверен).

Ответ 5

Единственный способ, которым я могу думать: постоянная связь ajax с сервером, чтобы сообщать о любых действиях пользователя на других вкладках.

Ответ 6

Как использовать cookie для хранения данных на одной вкладке и опроса на другой вкладке? я еще не знаю, если cookie делится между вкладками, а только идея сейчас...

Ответ 7

Учитывая, что эти вкладки открыты с одним и тем же сайтом в них, вы можете подумать о создании ajax script, который сообщает о действиях пользователя на сервер и связывает его с другим ajax script, который считывает эти отчеты и отображает их в текущем окне.

Ответ 8

Вы можете использовать AJAX (как говорят все остальные) или файлы cookie, если данные малы. Смотрите http://www.quirksmode.org/js/cookies.html для удовольствия с кукисами.

Ответ 9

Один из способов сделать это - не позволять окну чата зависящим от вкладок. Загрузите вкладки как отдельные компоненты AJAX, когда перезагрузка не влияет на компонент чата.

Ответ 10

В зависимости от требований вы также можете использовать файлы cookie/сеансы. Однако это означает, что данные будут доступны только при загрузке первой страницы каждой вкладки.

Если у вас уже открыты две вкладки, изменение чего-то в одном не изменит другого, если вы не используете какой-либо AJAX.