¿Cuál es la mejor forma de compartir datos entre pestañas abiertas en un navegador?Javascript: compartir datos entre pestañas
Respuesta
Para una solución más moderna echa un vistazo a https://stackoverflow.com/a/12514384/270274
Cita:
me quedo con la solución local de datos compartida mencionada en la pregunta usando
localStorage
. Parece ser la mejor solución en términos de confiabilidad, eficiencia y compatibilidad del navegador.
localStorage
se implementa en todos los navegadores modernos.El evento
storage
se activa cuando otras pestañas realiza cambios enlocalStorage
. Esto es bastante útil para fines de comunicación.Referencia:
http://dev.w3.org/html5/webstorage/
http://dev.w3.org/html5/webstorage/#the-storage-event
Para el alcance de clave almacenada en [localStorage vs sessionStorage] (https://stackoverflow.com/a/9784994/465053) – RBT
La única forma en que puedo pensar: constante comunicación ajax con el servidor para informar cualquier acción del usuario en las otras pestañas.
Dado que estas pestañas están abiertas con el mismo sitio, puede considerar crear un script ajax que informe las acciones del usuario al servidor y acoplarlo con otro script ajax que lea esos informes y los refleje en la ventana actual.
¿Quiere decir hacer una llamada ajax al servidor para comprobar si algo ha cambiado cada menos de un segundo? ese no es el camino ... – vsync
Si necesita que las cosas sucedan en vivo, esto requeriría hacer un montón de solicitudes todo el tiempo. Sin embargo, esto puede resolverse haciendo que el servidor mantenga la solicitud durante un período de tiempo más largo hasta que haya datos (o hasta que se exceda el tiempo de espera). Ver también [Comet (wikipedia)] (http://en.wikipedia.org/wiki/Comet_ (programming% 29) y mi respuesta. Esta es también la forma en que funcionan el EtherPad y el Chat de Facebook. – Krinkle
Una forma de hacer esto es no permitir que la ventana de chat dependa de las pestañas. Cargue las pestañas como componentes separados de AJAX que, al volver a cargar, no afectan al componente de chat.
Puede utilizar AJAX (como todos los demás sugieren) o cookies si los datos son pequeños. Consulte http://www.quirksmode.org/js/cookies.html para divertirse con las cookies.
Según los requisitos, también puede utilizar cookies/sesiones. Sin embargo, esto significa que solo se podrá acceder a los datos en la primera página cargada de cada pestaña.
Si ya tiene dos pestañas abiertas, cambiar algo en una no cambiará la otra a menos que use algo de AJAX.
No es cierto, la cookie se puede sondear al igual que un servicio AJAX. –
¿Qué tal utilizar una cookie para almacenar datos en una sola pestaña y sondearla en otra pestaña? no sé todavía si una cookie es compartida entre las pestañas, pero sólo una idea ... ahora
Sí, las cookies solo están vinculadas a dominios, por lo tanto, se comparten entre pestañas. Sin embargo, uno debe sondear la cookie de forma continua, no puede escuchar los cambios de cookies. – sibidiba
Si la primera pestaña se abre la segunda pestaña automágicamente, se puede hacer algo como esto:
primera ficha:
//open the first tab
var child_window = window.open(...params...);
Segunda pestaña:
// get reference to first tab
var parent_window = window.opener;
A continuación, puede llamar a las funciones y hacer todo tipo de cosas por las fichas:
// 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')
No creo que funcione en situaciones donde el usuario abre una página en una pestaña separada. –
Acabo de echar un vistazo a cómo lo hace el Facebook Chat y mantienen una solicitud al servidor abierta por un poco menos de un minuto. Si los datos vuelven al servidor, el servidor devuelve el mensaje a cada solicitud abierta. Si no hay datos regresan en un minuto, vuelve a solicitar y continúa haciendo esto (durante cuánto tiempo, no estoy seguro).
Sí, este método se conoce como "cometa". Desde el lado del cliente, no es diferente al simple sondeo AJAX (por ejemplo, realizar una solicitud AJAX, procesar la respuesta y realizar otra solicitud). Sin embargo, el servidor es atípico en comparación con el AJAX tradicional. El servidor no lo devolverá inmediatamente después de haberlo hecho, sino que lo mantendrá abierto (por ejemplo, solicitud de PHP) y hará un while() como bucle hasta que haya nueva información (o cuando n se excede el tiempo de espera, es decir, 50 segundos). Lea más: http://en.wikipedia.org/wiki/Comet_(programming%29. No es una tecnología de empuje real, pero lo más cerca posible. – Krinkle
¿Por qué no solo usa conectores? –
Esto no se acerca a responder la pregunta: ¿por qué se aceptó? La pregunta era cómo comunicarse entre las pestañas del navegador, no entre el servidor y el navegador –
Consulte también otro hilo StackOverflow: Javascript communication between browser tabs/windows.
En mi opinión, hay dos buenos métodos. Uno puede satisfacerlo mejor dependiendo de lo que necesite.
Si cualquiera de estos: Usted
- no se puede almacenar en el servidor de información
- no puede hacer muchas peticiones HTTP
- desea almacenar solamente un poco de la información [1]
- quieren ser puro JavaScript del lado del cliente/
- sólo necesita que funcione entre las pestañas/ventanas en el mismo navegador
-> use cookies (setCookie para enviar, getCookie/setTimeout para recibir). Una buena biblioteca que hace esto es http://theprivateland.com/bncconnector/index.htm
Si cualquiera de estos: Usted
- desea almacenar en el servidor de información
- desea almacenar una gran cantidad de información o almacenarla en un asunto relacionado (es decir, tablas o matrices multidimensionales [2])
- también lo necesitan en diferentes navegadores (no solo entre pestañas/ventanas en el mismo navegador) o incluso diferentes computadoras/usuarios.
-> use Comet (la solicitud HTTP de larga duración permite a un servidor web, básicamente, enviar datos a un navegador) para recibir datos. Y cortas solicitudes POST para enviar datos.
Etherpad y Facebook Chat también usan la técnica Comet.
[1] Cuando se utiliza localStorage más datos se pueden almacenar obviamente, pero desde que le repliegue de las cookies no pueden confiar en esto todavía. A menos que su aplicación sea para navegadores modernos solo en cuyo caso esto está bien.
[2] Los datos complicados también pueden almacenarse en cookies (codificación JSON), pero no es muy limpio (y necesita métodos alternativos para navegadores sin JSON.stringify/JSON.parse) y puede fallar en escenarios que implican concurrencia . No es posible actualizar una propiedad de un valor de cookie JSON. Tienes que analizarlo, cambiar una propiedad y sobrescribir el valor. Esto significa que otra edición podría deshacerse teóricamente. De nuevo, cuando se usa localStorage esto es menos problemático.
- 1. Compartir datos entre AppDomains
- 2. Compartir datos entre páginas html
- 3. ¿Compartir un elemento entre las pestañas de jQuery UI?
- 4. ¿Compartir variables entre módulos en Javascript/node.js?
- 5. Compartir datos entre controles de usuario
- 6. compartir datos entre dos aplicaciones de iphone
- 7. Compartir datos entre procesos en Python
- 8. Compartir datos de iCloud entre dos aplicaciones
- 9. Compartir datos entre actividades y servicios
- 10. Compartir datos entre aplicaciones en un iDevice
- 11. ¿Recomendaciones para compartir reglas de validación entre Javascript y PHP?
- 12. SOA Style - Compartir datos
- 13. compartir una base de datos entre el trenzado y Django
- 14. Cómo compartir datos entre diferentes hilos En C# usando AOP?
- 15. Cómo compartir datos entre clases separadas en Java
- 16. Cómo compartir datos de llavero entre aplicaciones de iOS
- 17. Compartir base de datos entre 2 aplicaciones en Heroku
- 18. Prisma: ¿Compartir datos entre ViewModels cargados en una región?
- 19. Compartir bases de datos sqlite entre múltiples actividades de Android
- 20. Cómo compartir los mismos datos entre múltiples actividades
- 21. Cómo compartir datos entre las peticiones de Tornado Web
- 22. Patrón para compartir datos entre objetos en C++
- 23. ¿Cómo compartir datos entre la actividad y el widget?
- 24. C++, cómo compartir datos entre procesos o subprocesos
- 25. NSPrivateQueueConcurrencyType de Datos Básicos y compartir objetos entre hilos
- 26. Compartir datos entre archivos en una extensión de Firefox
- 27. En SpecFlow ¿cómo puedo compartir datos entre pasos/características?
- 28. Compartir un objeto entre actividades
- 29. punteros inteligentes en C++: compartir punteros vs. compartir datos
- 30. Compartir historial entre paneles/ventanas
Obtenga usted mismo fiddler [http://www.fiddler2.com/fiddler2/] y mire la magia – epascarello
Consulte la pregunta similar http://stackoverflow.com/questions/2236828/javascript-make-two-tabs-windows- comunique – brillout
Busqué en Google casi exactamente esta pregunta. No estoy seguro de por qué está cerrado porque no es una pregunta real ... – Felix