Come prevenire gli avvisi JavaScript che si attivano quando si lascia una pagina?


12

Molte pagine hanno avvisi quando le lasci: se chiudi le schede, vai via senza salvare, ecc., Ci sono numerosi motivi per cui un sito ti avvisa / blocca la tua uscita fino a quando non confermi un avviso, ad esempio "Sei sicuro di voler uscire da questa pagina? ".

Questo viene generalmente eseguito con i gestori onbeforeunloade / o onunload.

Ecco un esempio

Esiste un modo per impedire gli eventi di avviso / blocco utente generati da questi gestori? Fondamentalmente, vorrei lasciare JS abilitato e in particolare vietare le cose che mi impedirebbero di lasciare una pagina senza che si verifichino ulteriori clic.

onbeforeunloade i onunloadgestori dovrebbero ancora sparare; semplicemente non dovrebbero essere autorizzati a fare cose che bloccano l'utente. Ciò significa che non sono presenti avvisi né operazioni che richiedono più di qualche secondo.

Ho trovato alcuni plugin che modificano / greasemonkey patch il javascript per determinate pagine e ho giocato un po 'con il loro codice per provare a renderli più universalmente applicabili. Tuttavia, spero di trovare una soluzione che funzioni su qualsiasi pagina che tenti di bloccare l'uscita dell'utente.


Puoi pubblicare un URL che lo fa?
golimar

Modificato, esempio aggiunto. Inoltre, capisco perché questo comportamento è spesso desiderabile e che è necessario per prevenire la perdita accidentale di dati in molti casi. Vorrei ancora sapere come sovrascriverlo / disabilitarlo.
Zac B,

Nota: tutta la risposta corrente (che modifica onbeforeunload) funzionerà solo per le pagine che utilizzano onbeforeunload, non per le pagine che utilizzano uno degli altri metodi per allegare eventi.
Synetech,

Risposte:


7

Bene, la cosa più semplice da fare è semplicemente ignorare direttamente lo script delle pagine e riassegnare l'evento a null.

window.onbeforeunload = null;

Dovrebbe funzionare ovunque, a meno che non siano veramente dannosi, e continui a riassegnarlo da soli. In tal caso, un ciclo per mantenere l'impostazione nullprobabilmente funzionerà.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Ora, attenzione, alcune pagine lo usano per sempre. Prendi la pagina di caricamento di YouTube: se ti allontani durante un caricamento, potresti aver perso ore di progresso! O forse un modulo Web che stai compilando, che potresti non voler compilare di nuovo, o un messaggio (forum / e-mail) che potresti non voler riscrivere. Con questa funzione, sei protetto.

Un altro problema è rappresentato da qualsiasi pagina che lo utilizza per scopi secondari, come il salvataggio dei dati da AJAX. Possono utilizzare questo evento per attivare l'azione di salvataggio e sperare che l'utente impieghi abbastanza tempo per fare clic sul pulsante affinché la richiesta passi. Ancora una volta, questo viene spesso fatto per salvarti da te stesso.

Ma, ovviamente, sappiamo tutti che molte pagine lo usano per malati. Quindi, se conosci qualsiasi pagina su cui vuoi che funzioni, potresti sempre avere un sistema di white list. Non c'è davvero un modo per bloccare questa azione, senza il blocco totale window.onbeforeunload, e qualsiasi (eventualmente buona) azioni che può intraprendere.

Non esiste alcun modo (senza una conoscenza preliminare di un determinato codice di pagine) per mantenere le buone azioni mentre si interrompe la finestra popup. Questa scatola non è un alert(). La casella viene generata dal browser, come il comportamento previsto di onbeforeunload. Uno lo crea eseguendo qualsiasi funzione assegnata per window.onbeforeunloadrestituire una stringa. Quella stringa verrà stampata nel popup.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Pertanto, non sarebbe possibile bloccare il popup senza cancellare la funzione.

Inoltre, se trovassi un modo, qualsiasi AJAX fallirebbe. Il popup offre alle richieste il tempo di passare, senza di esso, i dati potrebbero andare persi.

Per quanto riguarda onunload, non dovrebbe essere possibile bloccarti con questo. Poiché si attiva dopo lo scaricamento della pagina. Ma per sicurezza, puoi sempre fare un window.onunload = null;e dovrebbe essere curato.


Quel tipo di lavori, ma cosa succede se il onbeforeunloadgestore ha fatto qualcos'altro importante? Ad esempio, cosa succede se viene effettuata una breve richiesta AJAX o se si impegna qualcosa nello storage HTML5 locale? Esiste un modo per impedire ai onbeforeunloadgestori di effettuare determinate chiamate (ovvero alert()) o di funzionare per un periodo di tempo maggiore? Ecco perché ho chiesto un'estensione piuttosto che solo uno script di tipo greasemonkey: sembra che, per fare questo nel modo giusto, ci dovrebbe essere qualcosa di cambiato a livello di motore JavaScript.
Zac B,

1
Ho aggiunto qualche informazione in più. Per quanto riguarda effettivamente la correzione a un livello inferiore, le estensioni non sono in realtà un livello inferiore. Hanno autorizzazioni più elevate e alcune API speciali, ma non hanno alcuna possibilità di modificare le funzioni principali del browser. Non sono sicuro di quanto possa essere profonda la connessione FF, non ho esperienza in quella zona. Ovviamente, essendo open source, potresti apportare queste modifiche. Ma sta andando un po 'lontano per risolvere un popup.
zeel

Non funziona per me :(
Phuc Nguyen

0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

1
Perché mai dovresti creare una sceneggiatura come questa?
Brad,

3
@chiunque. Può essere utile se provi a spiegare la tua sceneggiatura per aiutare gli altri a sapere cosa stanno facendo. Ciò consentirebbe anche che la risposta venga utilizzata da molti in quanto un pezzo specifico della sceneggiatura potrebbe essere in grado di essere modificato in modo da migliorare la sceneggiatura o un pezzo potrebbe essere in grado di essere utilizzato in una sceneggiatura completamente diversa. È anche una buona idea spiegare la tua risposta in ogni caso per aiutare le persone a sapere come si applica alla loro domanda. Grazie per aver pubblicato la tua risposta però.
David,

0

C'è un bel strumento in grado di gestire qualsiasi fastidioso popup su un sistema Windows: ClickOff . Puoi scaricarlo da qui . L'ho verificato e funziona con l'avviso "Le modifiche apportate potrebbero non essere salvate" per il sito di SharePoint.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.