2011-01-24 5 views
12

특정 스크립트가 열리는 창을 열어 볼 수있는 방법을 보았지만 그렇지 않은 경우 어떻게해야합니까?창이 자바 스크립트에 있는지 어떻게 알 수 있습니까?

나는 큰 창을로드하기 위해 클릭하는 버튼이있는 작은 창이 있습니다. 큰 하나를 닫을 때, 작은 하나가 닫히면 특정 onUnload 또는 onBeforeUnload을 발생시키고 싶습니다. 아직 열리면 그 절차는 시작되지 않습니다. 나는 엄청난 두뇌 방귀를 가지고 있을지도 모르지만 나는 다른 창이 열려 있는지 확인하는 방법을 알아낼 수 없다. 큰 것은 열지 않기 때문에 핸들을 열지 못하게 기록 할 수는 없습니다.

짧은 용어로 : 창 A가 창 B를 열었 으면 창 A가 여전히 존재하는지 어떻게 확인할 수 있습니까? 당신이 창을 펑하고 (스크립트 또는 사용자) 닫힌 경우

답변

19
if(window.opener && !window.opener.closed) 
    alert('Yup, still there.'); 
+0

오. 글쎄, 그건 간단했다. 그렇지만 후속 질문이 있습니다. B가 A와는 별개로 열리면 A가 있는지 확인할 수있는 방법이 있습니까? A라는 특정 이름/목표와 모든 것을 가졌 으면 A가 의미하는 바를 신성하게하려고하는 것과는 다르다. A. A가 의미하는 바를 알고있다. – Andrew

+0

window.parent? 프레임을위한 것이지 팝업을위한 것이 아닙니다 –

+0

오, 이런. 고마워, 후안. 그래, 나는 부모님이 아니라 오프너를 의미했다. Andrew : 관련 키는 window.open에 대한 windowName 인수가 될 것입니다. 그러나 꽤 파괴적인'window.open'에 대한 다른 호출 이외의 방법을 사용하는 방법을 알지 못합니다. – chaos

17

window.closed true로 설정됩니다. 그것을 열린 창은 창으로 처리하기

window.opener.closed를 사용하여 열려있는 경우 확인할 수있는 팝업 창에서

:

var win = window.open('...')'; 
if (win.closed) 

귀하의 경우는 다음과 같은 것 같다 이름으로

나는 주석의 이름으로 창 핸들을 얻는 방법이 없다고 언급했다. 그러나, 나는 약간 연구를하고 FF/IE/크롬에있는 뒤에 오는 일 발견했다; 해킹 일 뿐이므로 예상되는 행동으로 어디에서나 언급되는 것을 보지 못했습니다. 너무 많이 의지하지는 않겠지 만 작동하는 것이 재미있었습니다! 필자의 코드에서는 필자가 필요한 핸들을 전달하는 것을 확인했다.

//opened a window without storing a handle, but gave it a name 
window.open('/some/url', 'xxx'); 

// now I need to get a reference to that window 
// Calling open without setting a url gets you 
// a reference and doesn't reload the window 
var win = window.open('', 'xxx') 
+0

감사합니다. 원래 자바 스크립트가 아닌 다른 방법으로 열 수 있다면 어떨까요? (예 : C가 B를 열었 으면 A가 열려 있는지 B가 볼 수 있습니까?) – Andrew

+0

아니요, 핸들을 창에 적용 할 수 없습니다. 이름으로 Windows의 글로벌 레지스트리가 없습니다. 귀하의 예에서, C가 A를 만들었습니까? 만약 그렇다면, 당신은 그 핸들을 저장해야한다. A = window.open(); B = window.open(); B.A = A''. 그러면 B가'if (! A. Closed)'를 확인할 수 있습니다. –

+0

해킹에 감사드립니다. 실제로 이것을 사용하는 것을 고려해 볼 수도 있지만 지금은 더 깨끗하게 만들고 완전히 백 엔드 솔루션을 만들려고 노력하고 있습니다. – Andrew

1

try {} 및 catch (err) {}을 사용하십시오.

try{ 
window.opener.document.body.getElementById('#elementId'); // do some action with window. opener 
} 
catch(err){ 
// if we are here then probably there is no window.opener 
window.close(); // closing this window or whatever you want 
} 
+0

글쎄, "아마도 window.opener가 없다"는 정확한 해결책은 아닙니다.이 질문은 2 세이며 인정 된 답변이 있습니다. 앞으로는 새로운 질문이나 대답이없는 질문에 노력을 기울이십시오.) – Mifeet

+1

@Mifeet이 대답은 저를 만족시키지 못했습니다. 나는 나와 같은 누군가가 여기 올 때 대안과 아마도 더 좋은 해결책을 추가하기를 원했다. 그리고 "아마"에 대해서는 재미있는 것이 없습니다. catch는 window.opener가 존재하지 않지만 window.opener를 다루는 코드가 유효하지 않은 경우에만 트리거 될 수 있기 때문입니다. – Audrius

+1

확인해 주셔서 감사합니다. try-catch를 사용하는 것은 권장 된 방법은 아니지만 예외는 정상적인 실행 흐름이 아닌 예외 상태에 사용해야합니다. 'window.opener'가 설정되어 있는지 테스트하는 것이 더 좋은 해결책입니다. – Mifeet

관련 문제