2015-03-10 23 views
8

Sto parlando di una finestra di dialogo stile, invece della finestra di dialogo predefinita 'beforeunload' che non può essere disegnata.Qual è il modo più discreto per implementare una finestra di dialogo personalizzata "pre-caricamento"?

See Facebook: Facebook unload image

Qual è il modo più discreto per fare questo? Preferibile uno script che dichiaro una volta e che funziona sempre magicamente.

Sono pensare a qualcosa nella linea di:

function showCustomDialog() 
{ 
    [...] 
} 

var unfinished = true; 

$('a').click(function() 
{ 
    if (unfinished) 
    { 
     window.showCustomDialog({ originalUrl: $(this).attr('href') }); 
     return false; 
    } 
} 

Ma io sono affraid questo si romperà i casi in cui cioè un elemento <a> è usato per innescare JS-comportamento, o dove JavaScript attiva una finestra .location.href change.

C'è un modo migliore, non invadente?

Nota aggiuntiva - Hanno anche funzionato per il pulsante Indietro.

Nota aggiuntiva - Apparentemente tornano alla finestra di dialogo predefinita quando è fuori dal loro controllo.

+1

solo beforeunload() può impedire i clic involontari del pulsante di risposta. Sono d'accordo che potrebbe sembrare più bello, ma il default prende il tema dell'utente e sembra che si aspettino. si perderebbe usabilità e funzionalità personalizzandolo. – dandavis

+0

Bene, buon punto. Non so * come * lo fanno, ma hanno anche il pulsante indietro funzionante :) –

+1

** Brain dump: ** Facebook probabilmente serve/carica pagine diverse dai normali server web, permettendo loro di avere il pieno controllo su tutto. Ecco come alcuni elementi, come la chat, rimangono persistenti mentre il resto del contenuto viene caricato. Per implementare questo da soli, è possibile caricare tutte le pagine tramite AJAX, impostare il contenuto e aggiornare l'URL con 'history.replaceState'. Per quanto riguarda il pulsante Indietro, probabilmente stanno usando 'onbeforeunload' per attivare la precedente richiesta (breadcrumb). – Scott

risposta

0

Credo che il problema principale è che non è possibile prevedere tutti i cambiamenti nel DOM, in modo da poter appena facilmente aggiornare ogni MouseMove-evento (touch-evento per gli smartphone, ecc ..) in questo modo:

$(document).off('mousemove').mousemove(function(){ 
     $('a').off('click').click(function(e){ 
      e.preventDefault(); 

      //your dialog goes here 

     }); 
}); 
Problemi correlati