2013-04-24 5 views
11

Come si può disabilitare una funzionalità predefinita dei browser moderni usando JQuery o Native JS per andare avanti o indietro quando si scorre orizzontalmente?Come impedire a un browser di andare avanti/indietro nella cronologia quando si scorre orizzontalmente?

Questo di solito accade quando si utilizza un trackpad e quando si scorre fino alla fine o all'inizio di un div scorrevole.

+2

Il conducente e il software trackpad è il tuo signore. Vedi questa [risposta alla domanda] (http://stackoverflow.com/questions/14086337/is-it-possibile-per-essere-gestione-con -trackpads). – SimonDever

risposta

6

Quindi ho pensato che da quando ho creato un'app Web, perché non chiedere all'utente eventuali modifiche non salvate che rinvieranno l'utente a perdere le modifiche non salvate o finire alla pagina precedente o successiva nella cronologia del browser.

Ecco la soluzione, se nessun altro si imbatte in questo problema come ho fatto io:

window.onbeforeunload = function(e) { 
    return 'Ask user a page leaving question here'; 
}; 
+0

non funziona su Firefox 37 – RezaRahmati

+0

Può anche 'e.preventDefault(); return false; ' – Jacksonkr

18
history.pushState(null, null, location.href); 
window.onpopstate = function(event) { 
    history.go(1); 
}; 

Demo: http://jsfiddle.net/DerekL/RgDBQ/show/

Non sarà in grado di tornare alla pagina Web precedente, a meno che non spam pulsante Indietro o tenere premuto il pulsante indietro e scegliere la voce precedente.

Nota: onpopstate (o evento onbeforeunload) non sembra funzionare su iOS.

+2

Senza offesa, ma la manipolazione della cronologia del browser è molto brutta in termini di esperienza utente. È molto confuso e fastidioso. Puoi vedere che cosa stai ottenendo anche se –

+4

Puoi ancora tornare indietro se tieni premuto il pulsante Indietro. – 10basetom

+1

@steve È brutto se fatto senza ragione. Ma ci sono casi legittimi per manipolarlo in questo modo, almeno temporaneamente ... Un caso a cui voglio applicare questo è di saltare la cronologia indesiderata dall'uso del css [: target] (https: //developer.mozilla .org/en-US/docs/Web/CSS /: target) pseudo-classe. O forse, disabilita la cronologia e fornisci invece un "pulsante indietro" personalizzato. – hexalys

3

Se si è su un Mac, ciò è causato dai movimenti del trackpad.

System Preferences -> Trackpad -> More Gestures. 

non la soluzione JS che stai cercando, ma se si desidera solo per evitare che per te è possibile disattivare la funzione.

+0

Hai perfettamente ragione, perché dovrebbero implementare un modo così fastidioso di saltare avanti e indietro in un browser? Penso che questo sia così fastidioso per qualsiasi utente quando cerchi di cercare qualcosa in un riquadro di scorrimento orizzontale. –

2

Lavori in Chrome e Safari (cioè testato con Chrome e Safari):

// el === element on which horizontal scrolling is done 
// (can be container of scrolled element or body or any other ancestor) 
var preventHistoryBack = function (e) { 
    var delta = e.deltaX || e.wheelDeltaX; 

    if (! delta) { 
    return; 
    } 

    window.WebKitMediaKeyError /*detect safari*/ && (delta *= -1); 

    if (((el.scrollLeft + el.offsetWidth) === el.scrollWidth && delta > 0) || (el.scrollLeft === 0 && delta < 0)) { 
    e.preventDefault(); 
    } 
}; 
el.addEventListener('mousewheel', preventHistoryBack); 
+1

Nota," wheel "e" mouseweel "operano in modo leggermente diverso: https://stackoverflow.com/questions/25204282/mousewheel-wheel-and-dommousescroll-in-javascript – Jacksonkr

+0

Funziona, ma dal momento che Chrome 51 vedrai '[Violazione] Aggiunto listener di eventi non passivi a un messaggio' wheel 'di blocco scrolling nella console. Ma abbiamo bisogno di eventi non passivi, perché chiamiamo 'preventDefault', e non è chiaro come sopprimere quel messaggio – Klimashkin