2009-11-18 3 views
1

'beforeunload'이벤트에서 JSONP를 서버에 호출하려고합니다. 이 버튼은 모두 뒤로 버튼으로 재생되기 전까지 훌륭하게 작동합니다. 페이지에서 나가서 다음 번에 beforeunload 이벤트가 호출되면 JSONP 요청을하는 것으로 보이지만 서버는 절대로받지 못합니다.JSONP + onbeforeunload + back 버튼 + 문제

참고 (1) : IE 및 FF에서 테스트되었습니다 (두 가지 모두에 문제가 있음).

참고 (2) : jQuery.getJSON 메서드를 사용하여 테스트 한 결과 동일한 문제가있어서 makeJSONPCall 함수가 올바른 것으로 가정합니다. (나는 틀릴 수있다)

어떤 아이디어? 문맥

일부 코드 :

JSONP의 CALL :

makeJSONPCall('http://serverurl.mvc/method?args=' + data, 'callbackfunction');  

function makeJSONPCall(url, callbackname) 
{     
    if (url.indexOf("?") > -1) url += "&jsonp=" 
    else url += "?jsonp=" 
    url += callbackname + "&"; 
    url += new Date().getTime(); 
    var script = document.createElement("script");    
    script.setAttribute("id", "JSONP"); 
    script.setAttribute("src",url); 
    script.setAttribute("type","text/javascript");     
    if (document.head) document.head.appendChild(script); 
    else document.body.appendChild(script);  
} 

감사

답변

0

그 사건은 가지 기발한이다. 궁극적으로 그것을 사용하지 않기로 결정할 수도 있습니다. 우선, 동기 게시물을 작성하고 있는지 확인하십시오. 다음으로 브라우저가 너무 빨리 위치를 변경하지 못하도록 UI를 사용자에게 제시해야합니다. 나는 아래에있는 것을 한 번 사용했는데 효과가있었습니다. 그러나 다른 방식으로 일을 끝내 었습니다.

window.onbeforeunload = function() { 
       // stuff do do before the window is unloaded here. 
       if(IsDirty()) { 
      //i only want to call ajax if I need to. 
       setTimeout(function(){ 
        DoAjaxSaveSynchronously(); // this was important 
        ClearDirty(); 
         }, 500); 
//this return value causes the browser to pop a modal window. 
       return "You have unsaved work. Please stay on this page to save your work."; 
       } 
      } 
+0

신속한 응답을 보내 주셔서 감사합니다. 불행히도 공용 유틸리티 스크립트가되어서 사람들의 페이지에 경고를 표시 할 수 없습니다. 실제로 서버의 응답을받을 때까지 beforeunload 이벤트에서 '대기'할 방법이 없기 때문에 여기에 해결책이 있다고 생각하지 않습니다. 감사합니다. – gatapia

0

것은 나는 비슷한 문제에하고 있어요 - 내가 사이트를 떠나는 사용자에 대한 응답으로 데이터를 전송해야 내 코드는 누군가의 페이지 내부 외부 자원으로있다. 팝업이 없기 때문에 전화를해야합니다. 그리고 나는 동기가 될 수없는 JSONP를 사용해야한다. 내가 알아낼 수 있었다 무엇

은 다음과 같습니다

  • 입니다 onbeforeunload 핸들러가 아무것도 반환하지 않는 경우, 팝업이 표시되지 않는 현재 페이지
  • 을 파괴 브라우저를 차단하고 있습니다.

따라서 이벤트 핸들러가 실행되는 동안 코드가 작동합니다.

의사 코드 : 이미 나를 위해 작동 순간

window.onbeforeunload = function() { 
    startAsynchronousSending(); 
    //do lots of slow and synchronous stuff to delay destroying the window// 
    //return statement deliberately missing 
} 

하지만, 지연 부분은 단지 CPU를 많이 루프입니다. 차이가 있습니다 (요청을 보낼 충분한 시간이 있습니다). 그러나 더 나은 지연을 찾고 있습니다.

은 참조 : 내가 루프에 어떤 내용에 대한 아이디어와 의견을 부탁드립니다 http://forums.thedailywtf.com/forums/t/24374.aspx

.나는 계정에 몇 가지 옵션을 고려하고있다 :

  • '
  • 동기 아약스 호출 (하지만 난 돈 DOM
  • 액세스하는 많은 수의
  • 로컬 스토리지에 접근 (동기 호출, IO 작업)에 와서 수학에 CPU를 낭비

    • 사용하지 않는 스크립트에 아약스 용 코드를 포함하고 싶습니다.)

    아이디어가 있으십니까?