2013-07-11 15 views
31

Qualcuno potrebbe condividere esperienza/codice in che modo è possibile rilevare il clic del pulsante Indietro del browser (per qualsiasi tipo di browser)?Rilevatore di clic sul pulsante back del browser JavaScript o jQuery

Abbiamo bisogno di soddisfare tutti i browser che non supporta HTML5

+4

Stai cercando l'API di cronologia HTML5. – SLaks

+3

possibile duplicato di [rilevare il pulsante Indietro fare clic sul browser] (http://stackoverflow.com/questions/6359327/detect-back-button-click-in-browser) –

risposta

0

E 'disponibile nelle API di HTML5 Storia. L'evento si chiama 'popstate'

+1

Abbiamo bisogno di soddisfare tutti i browser che non supportano HTML5 –

10

ci sono molti modi in cui è possibile rilevare se l'utente ha fatto clic sul pulsante Indietro. Ma tutto dipende da quali sono i tuoi bisogni. Prova ad esplorare i link qui sotto, dovrebbero aiutarti.

Rilevare se tasto premuto dall'utente "Back" a pagina corrente:

rilevare se la pagina corrente viene visitato dopo aver premuto il tasto "Back" sul precedente ("Forward ") pagina:

39

L'evento 'popstate' funziona solo quando si preme qualcosa prima. Quindi devi fare qualcosa di simile:

jQuery(document).ready(function($) { 

    if (window.history && window.history.pushState) { 

    window.history.pushState('forward', null, './#forward'); 

    $(window).on('popstate', function() { 
     alert('Back button was pressed.'); 
    }); 

    } 
}); 

Per il browser retrocompatibilità vi consiglio: history.js

+3

questo non fa distinzione tra pulsante indietro o avanti, basta popstate, che può essere sia – Richard

+0

Il tuo codice funziona perfettamente nel browser desktop.Ma nel browser mobile non funziona correttamente – Shwet

+1

Ma avviso fuoco su backword e avanti entrambi, come posso rilevare solo back click – lalitpatadiya

5

trovato questo per lavorare bene navigatore croce e mobile back_button_override.js.

(Aggiunto un timer per safari 5,0)

// managage back button click (and backspace) 
var count = 0; // needed for safari 
window.onload = function() { 
    if (typeof history.pushState === "function") { 
     history.pushState("back", null, null);   
     window.onpopstate = function() { 
      history.pushState('back', null, null);    
      if(count == 1){window.location = 'your url';} 
     }; 
    } 
} 
setTimeout(function(){count = 1;},200); 
0

disattivare il pulsante URL seguente funzione

window.onload = function() { 
    if (typeof history.pushState === "function") { 
     history.pushState("jibberish", null, null); 
     window.onpopstate = function() { 
      history.pushState('newjibberish', null, null); 
      // Handle the back (or forward) buttons here 
      // Will NOT handle refresh, use onbeforeunload for this. 
     }; 
    } 
    else { 
     var ignoreHashChange = true; 
     window.onhashchange = function() { 
      if (!ignoreHashChange) { 
       ignoreHashChange = true; 
       window.location.hash = Math.random(); 
       // Detect and redirect change here 
       // Works in older FF and IE9 
       // * it does mess with your hash symbol (anchor?) pound sign 
       // delimiter on the end of the URL 
      } 
      else { 
       ignoreHashChange = false; 
      } 
     }; 
    } 
}; 
0

Nel mio caso sto usando jQuery .load() per aggiornare DIV in una SPA (singolo pagina [web] app).

Essendo nuovo di lavorare con $(window).on('hashchange', ..) listener di eventi, questo si è rivelato impegnativo e ha preso un po 'di incidere su. Grazie alla lettura di molte risposte e alla ricerca di diverse varianti, finalmente abbiamo capito come farlo funzionare nel modo seguente. Per quanto posso dire, sembra molto stabile finora.

In sintesi, la variabile globalCurrentHash deve essere impostata ogni volta che si carica una vista.

Poi, quando $(window).on('hashchange', ..) listener di eventi viene eseguito, esso controlla il seguente:

  • Se location.hash ha lo stesso valore, significa Andando avanti
  • Se location.hash ha valore diverso, significa Going Back

Realizzo utilizzando global var s non è la soluzione più elegante, ma fare cose con OO in JS mi sembra complicato finora. Proposte di miglioramento/affinamento certamente apprezzate


impostare:

  1. Definire una var globale:
var globalCurrentHash = null; 
  1. Quando si chiama .load() per aggiornare il DIV, aggiornare il var globale così:

    function loadMenuSelection(hrefVal) { 
        $('#layout_main').load(nextView); 
        globalCurrentHash = hrefVal; 
    } 
    
  2. A pagina Installazione semplice e rapida l'ascoltatore a controllare la var globale per vedere se viene premuto il pulsante Indietro:

    $(document).ready(function(){ 
        $(window).on('hashchange', function(){ 
         console.log('location.hash: ' + location.hash); 
         console.log('globalCurrentHash: ' + globalCurrentHash); 
    
         if (location.hash == globalCurrentHash) { 
          console.log('Going fwd'); 
         } 
         else { 
    
          console.log('Going Back'); 
          loadMenuSelection(location.hash); 
         } 
        }); 
    
    }); 
    
0

In caso di HTML5, questo farà il trucco

window.onpopstate = function() { 
    alert("clicked back button"); 
}; history.pushState({}, ''); 
Problemi correlati