2009-07-08 2 views
22

HTML5에 window.postMessage()이 있다고 들었지만 메시지를 게시하는 창 (또는이 탭에서 다루는 핸들)이 필요합니다. 열려있는 모든 창에 브로드 캐스트하려면 어떻게해야합니까? 이것이 가능한가?자바 스크립트를 사용하여 열려있는 모든 창/탭에 메시지 보내기

(사용자가 다른 창에 영향을 미치는 한 창에서 서버 라운드 트립을하지 않으면 다른 창에 경고가 표시되어 콘텐츠를 업데이트 할 수 있습니다. 그러나 일부 창이 표시 될 수 있음) 기존의 것들을 열어서 참조를 가로 채서 저장할 수있게 해줌 - 새로운 창을 사용자가 수동으로 열고 북마크를 선택하거나 URL을 입력하면 열 수 있음.이 경우에는 가로 채기 및 저장 참조)

+0

https://dueljs.readthedocs.org/en/latest/이 사용 사례에 따라가, 혜성 (또는 기타 유사한 "HyBi"mecanism)이 더 나은 선택이 될 수있다; 예를 들어 통보가 브라우저 간 (즉, 사용자가 IE와 Firefox를 열었을 때, IE에서 변경을 가하고 Firefox가 통보 될 것으로 예상 함) 통보를 원하면 또한 모든 브라우저의 작동 방식을 정확하게 알지 못합니다 (Firefox의 경우 -no-remote 명령 줄 인수와 같은 기본 동작을 변경하는 구성 가능한 옵션이있을 수 있음). 그러나 동일한 브라우저의 경우에도 모든 창을 사용할 수 없을 수도 있습니다. Comet-style/server-driven 통신없이 통신 할 수 있습니다. –

+0

고마워요.하지만 이미 서버 측 폴백이 있습니다 ... 가능할 때 더욱 효율적으로 느껴지 길 원했습니다. – Kev

+0

이 질문은 왜 복제 된 것으로 간주 될까요? 6 년 후에 복제 된 것으로 보입니까? – Kev

답변

19

IMO postMessage를 사용할 수 없습니다. 사용 방법에 대해 sessionStorage localStorage? 여기에 쓰는 것은 동일한 세션 저장소를 공유하는 모든 창에 전달되어야하는 저장 이벤트를 생성해야합니다.

+0

또는 쿠키 (동일한 도메인에있는 경우) –

+3

쿠키가 해결책이 될 수도 있지만 저장소의 장점은 작업을 수행 할 때 이벤트를 생성한다는 것입니다. 쿠키를 사용할 때마다 새 쿠키에 대해 X 초 (setInterval)마다 확인해야하며 다른 문제는 쿠키를 제거 할 때입니다. – Rafael

+0

세션 이벤트에 대해 몰랐습니다. MDC의 sessionStorage 문서는 약간 혼란 스럽습니다. 리드 주셔서 감사합니다! – Kev

26

intercom.js (설명한 이유와 동일한 이유로).

현재 모든 윈도우에 알림을 브로드 캐스팅하기 위해 서버에 대한 소켓 연결을 유지해야하는 창이 하나만 있습니다. 다른 사람들은 제안한 것처럼 localStorage API를 사용합니다.

사용법은 정말 간단하다 :

var intercom = Intercom.getInstance(); 

$('a').on('click', function() { 
    intercom.emit('notice', {message: 'Something just happened!'); 
}); 

메시지를 잡기 위해

intercom.on('notice', function(notice) { 
    console.log(notice.message); 
}); 

인터페이스가 socket.io을 모방하도록 설계되었습니다. http://dueljs.studentivan.ru 및 문서 :

+0

이것은 꽤 멋지게 보입니다. 멍청한 질문이지만 다른 도메인간에이 작업을 수행합니까? 나는 그들 자신의'localStorage'를 가질 것이기 때문에'Storage' 이벤트가 다른 도메인의 윈도우에서 작동하는 것을 기대하지 않을 것입니다. 나는 그것을 테스트 할 수 있다는 것을 알고 있지만, 나는 방금 – Ian

+1

과 같은 도메인에 있어야한다고 생각했다./당신이 정말로 * 미쳐지기를 원한다면, iframe과 postMessage + Intercom으로 뭔가를 얻을 수있다. 도메인 간 작업. – brianreavis

+0

이 기능은 공유 된 웹 작업자의 대체로 효과적입니까? 나는 데이터가 탭 사이에서 공유되는 웹 워커를 설정하려고합니다. 서버 대신에 worker와 통신한다는 점을 제외하면 socket.io에 대한 바인딩과 다르지 않습니다. 작업자가있는 탭이 닫힌 경우 다른 탭에서 다시 실행해야합니다. –

관련 문제