2012-11-22 2 views
7

페이지를 언로드하기 전에 서버에 게시를하려고하는데 this을 따라 가면 정상적으로 작동합니다. 내 문제는 window.unload의 $ .post가 이후 언로드 된 입니다. 나는 signout 링크와 함께 그것을 시도하고 내 로그를 확인, 나는 다음과 같은 얻을 :언로드 후 Window.unload가 포스트를 트리거합니다.

Started GET "/signout" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by SessionsController#destroy as HTML 
Redirected to http://localhost:3000/ 
Completed 302 Found in 1ms 


Started GET "/" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by HomeController#index as HTML 
    Rendered home/index.html.erb within layouts/application (0.4ms) 
    Rendered layouts/_messages.html.erb (0.1ms) 
Completed 200 OK in 13ms (Views: 12.9ms) 


Started POST "/unloading" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by HomeController#unloading as */* 
    Parameters: {"p1"=>"1"} 
WARNING: Can't verify CSRF token authenticity 
Completed 500 Internal Server Error in 0ms 

NoMethodError (undefined method `id' for nil:NilClass): 
    app/controllers/home_controller.rb:43:in `unloading' 

첫 번째 부분은 signout하고 다음 사용자가 다음는 포스트 ('/ 언')를 실행 루트로 리디렉션됩니다 .

'/ 언로드'를 먼저 실행 한 다음 언로드 작업이 무엇이든 실행하려면 방법이 있습니까?

나는 업데이트

$(window).unload -> 
    $.ajax { 
    async: false, 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
    , url: '/unloading' 
    , type: 'Post' 
    , data: { 
     p1: '1' 
    } 
    } 

그래서 내가 beforeunload하는 아약스 요청을 전송 한 내 JQuery와 포스트으로이 있고 그것을 작동했지만, 난 대화 상자를 제거하는 return null을해야했다 표시되지 않는 경우 아약스가 여전히 대화 팝업 팝업을 표시하고 있기 때문에 표시됩니다 ('예/아니오'라고 대답하지 않아도이 페이지를 종료하고 싶습니다). 난 단지 지금은 크롬으로 그것을 시도하고 예상대로 작동하고, 또한

window.onbeforeunload -> 
    $.ajax { 
    async: false, 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
    , url: '/unloading' 
    , type: 'Post' 
    , data: { 
     p1: '1' 
    } 
    } 
    return null 

: 결과가 이것이다. 그러나 다른 브라우저에서 사용해보십시오.

답변

9

unload 이벤트의 정확한 처리가 브라우저의 버전으로 버전에서 다양 한 beforeUnload 이벤트를보십시오. 예를 들어 링크를 따라 가면 Firefox의 버전에 따라 이벤트가 발생하지만 창이 닫히면 작동하지 않습니다. 실제 사용에서는 동작이 지원되는 모든 브라우저 ( )에서 테스트되어야하며 독점적 인 beforeunload 이벤트와 대조되어야합니다.

  • https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload

    UPDATE

    페이지가 언로드 때 언로드 이벤트가 트리거됩니다.

    업데이트 2

    beforeUnload 콜백 함수

    는 UPDATE 3

    확인이

    +0

    죄송합니다. 답장을 좀 늦게 보내 주시면 죄송합니다. 이전에 beforeunload에 전체 Ajax 블록을 추가하려고 시도했지만 항상 '이 페이지를 종료 하시겠습니까?'라는 질문을 먼저 묻습니다. [object object]가 추가 된 메시지로 표시됩니다. 나는 전에 검색을했고 그 것이 beforeunload의 목적이라고 생각합니다 ... 어떻게 제거 할 수 있습니까? – index

    +0

    그리고 페이지를 이미 언로드했을 때 언로드 이벤트가 트리거된다는 정보에 감사드립니다. – index

    +0

    'beforeUnload' 함수에서'null'을 반환 해 봅니다. http://stackoverflow.com/questions/1119289/how-to-show-the-are-you-sure-you-want-to-navigate-away-from- 이 페이지 - 언제 - ch – nickaknudson

    4

    @NickKnudson 제안으로, 이전에 양식 데이터를 다시 게시 할 "beforeUnload"이벤트를 사용하여 창은 언로드됩니다.

    window.onbeforeunload = function() { 
        $.ajax { 
        async: false, 
        beforeSend: (xhr) -> 
         xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
        , url: '/unloading' 
        , type: 'Post' 
        , data: { 
         p1: '1' 
        } 
        } 
    } 
    

    약 2 주 전과 동일한 상황이 발생하여 beforeUnload로 전환하면 문제가 해결됩니다.

    +0

    해당 브라우저를 경험해 보셨습니까? 에서 문제가 되는가? – akamaozu

    +0

    아니요,하지만 OSX에서 실행되는 Opera와 브라우저는 테스트하지 않았습니다. Chrome, IE 및 모든 최신 버전의 FF가 지원합니다. – SaschaM78

    +0

    죄송합니다. 회신이 조금 늦었을 경우.이전에 beforeunload에 전체 Ajax 블록을 추가하려고 시도했지만 항상 '이 페이지를 종료 하시겠습니까?'라는 질문을 먼저 묻습니다. [object object]가 추가 된 메시지로 표시됩니다. 나는 전에 검색을했고 그 것이 beforeunload의 목적이라고 생각합니다 ... 어떻게 제거 할 수 있습니까? – index

    3

    문제는 창이 닫히기 전에 윈도우의 unload 이벤트가 AJAX 호출 (비동기식 호출)을 기다리지 않는다는 것입니다. 또한 jQuery에는 beforeunload 이벤트에 대한 기본 제공 처리 기능이없는 것 같습니다. 따라서 처리하기 위해 기본 JS 코드로 되돌려 야합니다. 아래를 참조

    ( : 커피 스크립트로 작성)

    window.onbeforeunload = function() { 
        $.ajax { 
         async: false, // Important - this makes this a blocking call 
         beforeSend: (xhr) -> 
          xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
         , url: '/unloading' 
         , type: 'Post' 
         , data: { 
          p1: '1' 
         } 
        } 
    }; 
    

    onbeforeunload - unload 이벤트 전에 화재가 페이지가 언로드되는 이벤트입니다.

    이 주제에 대한이 Google Forum 토론을 참조하십시오.

    관련 문제