Existem alguns recursos novos do HTML5 que chegaram aos navegadores recentes que permitem o compartilhamento de estado entre guias, janelas do navegador, mesmas janelas de domínio etc. Por isso, provavelmente ficou um pouco mais fácil escrever um aplicativo da Web que mantenha muito estado no cliente e também gerencia o estado de maneira inteligente entre guias e / ou janelas.
Atualmente, existem bibliotecas como o Backbone.js que podem ajudar a gerenciar o estado em uma única guia ou em uma única janela. Ainda existe alguma coisa lá fora que ajude com várias guias (ou janelas) a gerenciar o estado global, o estado específico da guia e os eventos com guias cruzadas sem depender do servidor para sincronizá-las?
HTTP is great (and beutiful) because it is stateless
. Desde que entrei na indústria, estou em busca desse beuty, mas não consigo encontrá-lo. Todo mundo fala apenas em manter os estados que você vê!Respostas:
Resposta curta:
Você não pode realmente transmitir informações de estado de uma guia para outra ...
Resposta longa:
Você não pode realmente transmitir informações de estado de uma guia para outra, pois isso seria uma violação muito grave do sandbox e da segurança.
No entanto, você pode passar indiretamente o estado entre duas guias por meio de:
Outra opção seria simplesmente se comunicar por meio de cookies para passar informações entre duas guias, mas isso provavelmente causaria problemas, seria altamente dependente do navegador e exigiria recarregamentos de página (e, para ser sincero, nunca tentei isso e pensei apenas nisso, mas outros têm feito isso ) .
Portanto, como as extensões do navegador são obviamente um caminho bastante limitador, você deve seguir o caminho das comunicações cliente-servidor e desenvolver um sistema para permitir que os clientes publiquem eventos em um servidor, que os despache novamente (ou qualquer outro tipo de transmissão) para outros clientes através de um protocolo de comunicação de sua escolha.
Atualização 1: como alguém mencionado em um comentário antes de removê-lo (não pode dar crédito, pois não aparece na caixa de entrada, desculpe)
O HTML5 apresenta a
window.postMessage
API.Para um exemplo de trabalho, consulte a postagem do blog de John Resig sobre Mensagens entre janelas . E muito interessante, se você olhar para os comentários desta postagem, notará alguém chamado Malte mencionando uma biblioteca que eles escreveram para usar
window.postMessage
em navegadores modernos ou uma versão baseada em cookie em navegadores mais antigos.Leia estes para mais detalhes e exemplos:
window.postMessage
página,window.postMessage
window.postMessage
com links adicionais.Atualização 2:
Lembre-se de que, como 04/03/2012, a especificação HTML5 ainda é um rascunho; portanto, alguns recursos podem ser removidos . Portanto, use com cuidado ...
fonte
Descobri recentemente o Intercom , que usa armazenamento local para implementar mensagens de difusão entre janelas. O armazenamento local dispara um evento (
onstorage
) quando os dados são alterados, portanto, nenhuma pesquisa é necessária. O interfone permite que todas as páginas em um domínio se comuniquem, independentemente de como foram abertas.fonte
Se suas janelas (páginas) forem do mesmo domínio (origem),
localStorage
poderão ser usadas para compartilhar dados e transmitir mensagens. Uma coisa que você deve considerar é que cada janela (página) do navegador funciona em um thread separado. Portanto, se estamos falando sobre comunicação entre janelas, também estamos falando sobre multithreading.Você também deve considerar alguns
localStorage
problemas com o IE:Eu realizei alguns testes para localStorage no IE8. Após vários milhares de alterações no localStorage, janelas da mesma origem param de receber eventos de 'armazenamento'. Ainda mais, se você tentar ler do mesmo item localStorage, os valores poderão ser diferentes em janelas diferentes. Então, eu diria que o IE8 não suporta localStorage
O IE9 e o IE10 chamam o manipulador de eventos 'storage', mesmo que localStorage seja alterado nessa janela ( isso é contra a especificação ).
Também há problemas conhecidos com o IE11 .
Publiquei recentemente a biblioteca de comunicação entre janelas (todos os recursos são descritos em leia-me). Ele fornece compartilhamento de dados seguros para threads, transmissão de eventos. Ele também resolve alguns problemas do IE (o IE8 definitivamente não é suportado, o bug do IE11 com iframe dentro de pai de origem diferente pode ser resolvido apenas pela correção do IE - aguardando atualização do IE11).
fonte