2018 편집 :이 목적으로 BroadcastChannel을 더 잘 사용할 수 있습니다. 아래 다른 답변을 참조하십시오. 그러나 탭 간 통신에 여전히 로컬 저장소를 사용하려면 다음과 같이하십시오.
탭이 다른 탭으로 메시지를 보낼 때 알림을 받으려면 'storage'이벤트를 바인딩하면됩니다. 모든 탭에서 다음을 수행하십시오.
$(window).on('storage', message_receive);
message_receive
다른 탭에서 localStorage 값을 설정할 때마다이 함수 가 호출됩니다. 이벤트 리스너에는 localStorage로 새로 설정된 데이터도 포함되므로 localStorage 객체 자체를 구문 분석 할 필요조차 없습니다. 트레이스를 효과적으로 정리하기 위해 설정 직후에 값을 재설정 할 수 있기 때문에 매우 편리합니다. 메시징 기능은 다음과 같습니다.
// use local storage for messaging. Set message in local storage and clear it right away
// This is a safe way how to communicate with other tabs while not leaving any traces
//
function message_broadcast(message)
{
localStorage.setItem('message',JSON.stringify(message));
localStorage.removeItem('message');
}
// receive message
//
function message_receive(ev)
{
if (ev.originalEvent.key!='message') return; // ignore other keys
var message=JSON.parse(ev.originalEvent.newValue);
if (!message) return; // ignore empty msg or msg reset
// here you act on messages.
// you can send objects like { 'command': 'doit', 'data': 'abcd' }
if (message.command == 'doit') alert(message.data);
// etc.
}
이제 탭이 onstorage 이벤트에서 바인드되고이 두 기능이 구현되면 다음과 같이 다른 탭 호출로 메시지를 브로드 캐스트 할 수 있습니다.
message_broadcast({'command':'reset'})
정확히 동일한 메시지를 두 번 보내는 것은 한 번만 전파되므로 메시지를 반복해야하는 경우 다음과 같은 고유 식별자를 추가하십시오.
message_broadcast({'command':'reset', 'uid': (new Date).getTime()+Math.random()})
또한 메시지를 브로드 캐스트하는 현재 탭은 실제로 메시지를 수신하지 않고 동일한 도메인의 다른 탭이나 창만 수신한다는 점을 기억하십시오.
removeItem () 전에 setItem () 호출 직후에 사용자가 다른 웹 페이지를로드하거나 탭을 닫으면 어떻게되는지 묻습니다. 글쎄, 내 자신의 테스트에서 브라우저는 전체 기능 message_broadcast()
이 완료 될 때까지 언로드를 보류합니다 . 나는 매우 긴 for () 사이클을 넣는 것을 테스트했지만 사이클이 끝나기 전에 기다렸다가 닫습니다. 사용자가 그 사이에서 탭을 죽이면 브라우저에 메시지를 디스크에 저장할 시간이 충분하지 않으므로이 방법은 흔적없이 메시지를 보내는 안전한 방법과 같습니다. 의견 환영합니다.