2013-05-08 2 views
11

나는 setTimeout()을 호출하는 것을 포함하여 다양한 자바 스크립트 코드를 실행하는 페이지를 가지고있다. 사용자가 링크를 클릭하여 다른 페이지로 이동하면 어떤 시점에서이 페이지의 javascript가 실행을 멈추고 setTimeout에 의해 호출 된 코드가 더 이상 호출되지 않습니다. 예 :링크를 클릭 한 후 언제 자바 스크립트가 페이지에서 실행되지 않습니까?

  • 즉시 링크 (I이 잘못 알고있는) 클릭으로
  • 브라우저가 새 페이지
  • 다른 점을 수신 시작?

다른 주요 브라우저에 따라 다른 점은 무엇입니까?

배경

내가 관심을 위하여 대부분이 알고보다는 특정 문제를 해결하는 것도 중요합니다. 이 문제에 대해 생각하게하는 문제는 사용자가 페이지의 특정 링크를 클릭 할 때 뭔가를하고 싶습니다. 아약스 호출을 수행하고 결과를 처리하고 싶지만, 페이지가 언로드되기 전에 완료되면 너무 걱정하지 않습니다. 그래서 링크 클릭에 setTimeout()을 발생시키고 운이 좋다면 끝낼 것입니다.하지만 그렇지 않다면 끝내지 않을 것입니다. 나는 어떤 상황에서 그것이 효과가 있을지 궁금해했다. 그 문제에 대한 다른 해결책이있을 수 있지만, 나는 그 문제에 대한 해결책을 알고 싶을 뿐이라는 문제에 대한 해결책을 원하지 않는다.

+5

아마도 [onunload 이벤트] (https://developer.mozilla.org/en-US/docs/DOM/window.onunload) 직후에 발생 했겠지만 그게 왜 중요한가요? –

+0

_ 브라우저가 있습니까? –

+1

*'activeTimeers * ('setTimeout'가 추가되는)는 [문서 언로드 문서 정리 단계] 중에 삭제됩니다. (http://www.w3.org/TR/html5/browsers.html#unloading-document-cleanup -steps), [다른 문서 중에서] [unload document procedure'] (http://www.w3.org/TR/html5/browsers.html#unload-a-document)에서 호출됩니다.그러나 정확히 언제 이들이 [탐색 프로세스] (http://www.w3.org/TR/html5/browsers.html#navigating-across-documents) 중에 호출되는지 확실하지 않습니다. – Bergi

답변

0

가능한 해결책 중 하나는 클릭 이벤트를 중지하고, 비동기 호출을 해고하고, ajax 호출의 결과가 처리 될 때 기본 이벤트를 다시 시작하는 것입니다. 또는 가능한 경우 서버에서 처리를 처리 할 수 ​​있습니다.이 경우 기본 이벤트를 중지 할 필요조차 없습니다. 비동기 호출을 시작하십시오.

질문에 대한 답변으로, 나는 onunload 이벤트 이후에 스크립트가 실행을 멈출 것이라고 Jack에게 동의합니다.

희망 사항입니다.

3

다음과 같은 순서가 있습니다.

1 단계 : 링크를 클릭합니다. 여기서 브라우저는 서버에 요청을 보내고 응답을 기다립니다. 현재 페이지의 문서 개체가 여전히 존재합니다.

2 단계 : 브라우저가 응답을받습니다. 현재 페이지의 문서 개체가 여전히 존재합니다.

3 단계 : 브라우저는 새 문서 개체에 대한 응답을 구문 분석하고 생성하고 렌더링합니다.

3 단계는 현재 페이지의 JS가 멈출 때입니다. 단, iframe에 대한 응답을 대상으로 지정해야합니다. 이렇게하면 새 문서 객체가 iframe 내부에서 렌더링되고 현재 페이지의 문서 객체는 그대로 유지되며 JS는 여전히 기능을 유지합니다.

귀하의 질문에 대한 답변입니다.

+0

감사! 더 자세히 설명 할 참조가 있습니까? – Rory

+0

브라우저가 응답을 받기도 전에 이전 DOM이 언로드되었다고 생각합니까? 이것이 시퀀스라고 생각하게 만드는 이유는 무엇입니까? – Bergi

+0

사용자가 링크가 응답하기를 기다리고 있는지 감지하는 방법이 있습니까? 예 : "퇴근하려고하지 않으면 바쁘게 일하십시오." –

관련 문제