Javascript-связь между вкладками браузера/окнами
Какой самый надежный способ обмена Javascript между вкладками/окнами одного и того же браузера? Например, когда Tab 2 запускает воспроизведение звука, Tab 1 как-то знает об этом и может приостановить его проигрыватель.
Я создаю сайт с музыкальным плеером... поэтому на данный момент, если вы откроете две вкладки на сайте, вы можете начать музыку на обоих.
Это явно плохо, поэтому я пытаюсь найти решение.
Любые идеи?
Спасибо
Ответы
Ответ 1
Это старый ответ, я предлагаю использовать современную версию, описанную здесь:
Javascript; связь между вкладками/окнами с одинаковым происхождением
Вы можете общаться между окнами браузера (и вкладками тоже), используя куки.
Вот пример отправителя и получателя:
sender.html
<h1>Sender</h1>
<p>Type into the text box below and watch the text
appear automatically in the receiver.</p>
<form name="sender">
<input type="text" name="message" size="30" value="">
<input type="reset" value="Clean">
</form>
<script type="text/javascript"><!--
function setCookie(value) {
document.cookie = "cookie-msg-test=" + value + "; path=/";
return true;
}
function updateMessage() {
var t = document.forms['sender'].elements['message'];
setCookie(t.value);
setTimeout(updateMessage, 100);
}
updateMessage();
//--></script>
receiver.html:
<h1>Receiver</h1>
<p>Watch the text appear in the text box below as you type it in the sender.</p>
<form name="receiver">
<input type="text" name="message" size="30" value="" readonly disabled>
</form>
<script type="text/javascript"><!--
function getCookie() {
var cname = "cookie-msg-test=";
var ca = document.cookie.split(';');
for (var i=0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(cname) == 0) {
return c.substring(cname.length, c.length);
}
}
return null;
}
function updateMessage() {
var text = getCookie();
document.forms['receiver'].elements['message'].value = text;
setTimeout(updateMessage, 100);
}
updateMessage();
//--></script>
Ответ 2
Для более современного решения проверьте fooobar.com/questions/44592/...
Цитата:
Я придерживаюсь общего решения локальных данных, упомянутого в вопросе, используя localStorage
. Это лучшее решение с точки зрения надежности, производительности и совместимости с браузером.
localStorage
реализован во всех современных браузерах.
Событие storage
срабатывает, когда другие вкладки вносят изменения в localStorage
. Это очень удобно для коммуникационных целей.
Справка:
http://dev.w3.org/html5/webstorage/
http://dev.w3.org/html5/webstorage/#the-storage-event
Ответ 3
Я не думаю, что вам нужны куки. Каждый код js документа может обращаться к другим элементам документа. Поэтому вы можете использовать их напрямую для обмена данными.
Ваше первое окно w1 открывает w2 и сохраняет ссылку
var w2 = window.open(...)
В w2 вы можете получить доступ к w1, используя свойство открывателя окна.
Ответ 4
Вы можете сделать это через локальный API хранения. Обратите внимание, что это работает только между двумя вкладками. вы не можете поместить обоих отправителей и получателей на одну и ту же страницу:
На странице отправителя:
localStorage.setItem("someKey", "someValue");
На странице получателя
$(document).ready(function () {
window.addEventListener('storage', storageEventHandler, false);
function storageEventHandler(evt) {
alert("storage event called key: " + evt.key);
}
});
Ответ 5
Вы можете связываться между окнами (с вкладками или нет), если у них есть отношения между родителями и родителями.
Создайте и обновите дочернее окно:
<html>
<head>
<title>Cross window test script</title>
<script>
var i = 0;
function open_and_run() {
var w2 = window.open("", "winCounter");
var myVar=setInterval(function(){myTimer(w2)},1000);
}
function myTimer(w2) {
i++;
w2.document.body.innerHTML="<center><h1>" + i + "</h1><p></center>";
}
</script>
</head>
<body>
Click to open a new window
<button onclick="open_and_run();">Test This!</button>
</body>
</html>
дочерние окна могут использовать объект parent
для связи с родителем, который породил его, поэтому вы можете управлять музыкальным проигрывателем из любого окна.
Смотрите здесь: https://jsbin.com/cokipotajo/edit?html,js,output
Ответ 6
Ниже окна (w1) открывается другое окно (w2). Любое окно может отправлять/получать сообщения в/из другого окна. Поэтому мы должны в идеале убедиться, что сообщение возникло из окна (w2), которое мы открыли.
В w1
var w2 = window.open("abc.do");
window.addEventListener("message", function(event){
console.log(event.data);
});
В w2 (abc.do)
window.opener.postMessage("Hi! I'm w2", "*");
Ответ 7
Существует также экспериментальная технология Broadcast Channel API
, которая специально разработана для связи между различными контекстами браузера с одинаковым источником. Вы можете отправлять сообщения и получать сообщения из другого контекста браузера без ссылки на него:
var channel = new BroadcastChannel("foo");
channel.onmessage = function( e ) {
// Process messages from other contexts.
};
// Send message to other listening contexts.
channel.postMessage({ value: 42, type: "bar"});
Очевидно, что это экспериментальная технология и пока не поддерживается всеми браузерами.
Ответ 8
Общение между различным контекстом выполнения JavaScript поддерживалось даже до HTML5, если документы были одного источника. Если нет или у вас нет ссылки на другой объект Window
, вы можете использовать новый postMessage API, представленный с HTML5. Я подробно остановился на обоих подходах в этом fooobar.com/questions/44598/....
Ответ 9
Нашел другой способ, используя HTML5 localstorage, я создал библиотеку с такими событиями, как API:
sysend.on('foo', function(message) {
console.log(message);
});
var input = document.getElementsByTagName('input')[0];
document.getElementsByTagName('button')[0].onclick = function() {
sysend.broadcast('foo', {message: input.value});
};
он отправит сообщения на все другие страницы, но не для текущего.
Ответ 10
изменить:
С помощью Flash вы можете общаться между любыми окнами, ЛЮБЫМ браузером (да, от FF до IE во время выполнения). Форма формы INNA для вспышки (ShockWave/activeX)