2012-11-22 11 views
7

Sto provando a fare un post sul server prima di scaricare una pagina e ho seguito this e funziona correttamente. Il mio problema è $ .post su window.unload è attivato dopo che ha scaricato. Ho provato con un collegamento signout e controllando il mio log, ottengo il seguente:I trigger di Window.unload post dopo lo scaricamento

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' 

prima parte è il signout e allora l'utente viene reindirizzato a sradicare poi si corre il palo ('/ scarico') .

C'è un modo per eseguire "/ scaricare" prima di eseguire qualsiasi azione di scarico?

ho questo come il mio post jquery

$(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' 
    } 
    } 

Aggiornamento

così ho fatto trasferire la richiesta Ajax per beforeunload e che stava lavorando, ma ho dovuto fare un return null per rimuovere la finestra di dialogo apparendo perché se non lo faccio, l'ajax si stava ancora attivando sul popup di dialogo (anche senza rispondere "sì/no voglio uscire da questa pagina"). Il risultato è questo:

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 

Inoltre, ho provato solo con Chrome per ora e che sta funzionando come previsto. Eppure per provare altri browser.

risposta

9

Prova caso beforeUnload

La manipolazione esatta dell'evento scarico è variato da versione a versione di browser. Ad esempio, alcune versioni di Firefox attivano l'evento quando viene seguito un collegamento, ma non quando la finestra viene chiusa. Nell'uso pratico , il comportamento dovrebbe essere testato su tutti i browser supportati, e in contrasto con l'evento di download preliminare proprietario.

UPDATE

L'evento scarico viene attivato quando la pagina ha scaricato.

UPDATE 2

Per disattivare il Are you sure that you want to leave this page? comparsa provare ritorno null dalla funzione di callback beforeUnload

UPDATE 3

Controllare questo per cross-browser compatibilità

+0

Scusa se la mia risposta è stata un po 'troppo tardi. Ho provato ad aggiungere l'intero blocco Ajax a beforeunload prima, ma mi fa sempre una domanda prima di 'Sei sicuro di voler lasciare questa pagina?' con un [oggetto oggetto] come messaggio aggiunto. Ho cercato prima e penso che questo fosse lo scopo di beforeunload ... come posso rimuoverlo? – index

+0

E grazie per le informazioni che scaricano l'evento viene attivato quando la pagina è già stata scaricata. – index

+0

Prova a restituire 'null' dalla funzione' beforeUnload' http://stackoverflow.com/questions/1119289/how-to-show-the-are-you-sure-you-want-to-navigate-away-from- questa-pagina-quando-ch – nickaknudson

4

Come suggerito @NickKnudson, utilizzare l'evento "beforeUnload" per inviare di nuovo i dati del modulo prima la finestra viene scaricata:

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' 
    } 
    } 
} 

Eseguito esattamente la stessa situazione circa due settimane fa, passando a beforeUnload risolto il problema.

+0

Hai riscontrato un browser che window.onbeforeunload è problematico in? – akamaozu

+0

No, ma non ho testato Opera e browser in esecuzione su OSX. Chrome, IE e tutte le versioni recenti di FF lo supportano. – SaschaM78

+0

Scusa se la mia risposta è stata un po 'troppo tardi.Ho provato ad aggiungere l'intero blocco Ajax a beforeunload prima, ma mi fa sempre una domanda prima di 'Sei sicuro di voler lasciare questa pagina?' con un [oggetto oggetto] come messaggio aggiunto. Ho cercato prima e penso che questo fosse lo scopo di beforeunload ... come posso rimuoverlo? – index

3

Il problema è che l'evento unload della finestra non attende le chiamate AJAX (che sono asincrone) per completare prima di chiudere la finestra. Inoltre, jQuery non sembra avere una gestione integrata per l'evento beforeunload - motivo per cui è necessario ripristinare il codice JS nativo per gestirlo. Vedi sotto:

(Nota: Scritto in CoffeeScript)

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 - Un evento che viene generato prima dell'evento scarico quando la pagina viene scaricata.

Vedere anche questa discussione Google Forum su questo argomento.

Problemi correlati