2012-07-09 10 views
9

Supponiamo che il mio html èPrendi il valore hash che era prima hashchange

<a href="#one">One</a> 
<a href="#two">Two</a> 

e Js è

$(window).on("hashchange"){ 
alert(document.location.hash); 
} 

voglio ottenere il valore hash che era prima della variazione hash .IS possibile? Se si Come?

+0

Eventuali duplicati: http://stackoverflow.com/questions/680785/on-window-location-hash-change – undefined

+0

@undefined non esattamente –

risposta

10

uso che

$(window).on("hashchange", function(e){ 
    console.log(e.originalEvent.oldURL) 
    console.log(e.originalEvent.newURL) 
})​; 

Demo: http://jsbin.com/ulumil/

+1

sta dando indefinito –

+0

quale browser e OS sono stai utilizzando – Amit

+2

Mozilla Firefox e os Windows 7 e non dovresti chiedere questo perché voglio una risposta compatibile cross browser –

6

È necessario monitorare l'ultimo hash, per esempio:

var currentHash = function() { 
    return location.hash.replace(/^#/, '') 
} 

var last_hash 
var hash = currentHash() 

$(window).bind('hashchange', function(event){ 
    last_hash = hash 
    hash = currentHash() 
    console.log('hash changed from ' + last_hash + ' to ' + hash) 
}); 
+1

Questo non sembra funzionare in IE9 'event.fragment' è anche indefinito. Dovuto sostituirlo con 'location.hash.replace (/^# /, '')' –

+0

@rparree ringraziamenti, ho migliorato la mia risposta. –

2

In realtà la soluzione fornita da Amit funziona ma con libreria jQuery e crossplatform pure.

Ecco una soluzione più semplificata utilizzando core javascript e crossbrowser. (Controllato con l'ultima versione di IE/FF/Chrome/Safari)

window.onhashchange = function(e){ 
    console.log(e); 
    var oldURL = e.oldURL; 
    var newURL = e.newURL; 
    console.log("old url = " + oldURL); 
    console.log("new url = " + newURL); 
    var oldHash = oldURL.split("#")[1]; 
    var newHash = newURL.split("#")[1]; 
    console.log(oldHash); 
    console.log(newHash); 
}; 
+0

Non funziona su FF12, non ha controllato altri browser. – jldupont

+0

Come indicato sopra, questo funziona sull'ultima versione di (IE/FF/Chrome/Safari). I codici sono testati bene e funzionano per me su tutti e quattro i browser indicati. Non so se FF12 sia l'ultima versione del browser. Quando ho provato, la mia versione FF era FF20.0.

È possibile controllare il valore di e (fatto in seconda riga) e trovare le variabili oldURL e newURL (e.oldURL e e.newURL) se esistono o meno. In bocca al lupo. –

+0

Intendevo FF19 su Linux. Ad ogni modo, sto usando 'window.location.hash' che sembra essere molto più affidabile. – jldupont

0

Non utilizzare

$(window).on("hashchange", function(e){ 
    console.log(e.originalEvent.oldURL) 
    console.log(e.originalEvent.newURL) 
})​; 

Non funziona su IE e probabilmente anche altrove.

Utilizzare questo piuttosto.

(function(w, $){ 
    var UrlHashMonitor = {}; 
    UrlHashMonitor.oldHash = ''; 
    UrlHashMonitor.newHash = ''; 
    UrlHashMonitor.oldHref = ''; 
    UrlHashMonitor.newHref = ''; 
    UrlHashMonitor.onHashChange = function(f){ 
    $(window).on('hashchange', function(e){ 
     UrlHashMonitor.oldHash = UrlHashMonitor.newHash; 
     UrlHashMonitor.newHash = w.location.hash; 
     UrlHashMonitor.oldHref = UrlHashMonitor.newHref; 
     UrlHashMonitor.newHref = w.location.href; 
     f(e); 
    }); 
    }; 
    UrlHashMonitor.init = function(){ 
    UrlHashMonitor.oldHash = UrlHashMonitor.newHash = w.location.hash; 
    UrlHashMonitor.oldHref = UrlHashMonitor.newHref = w.location.href; 
    }; 
    w.UrlHashMonitor = UrlHashMonitor; 
    return UrlHashMonitor; 

})(window, window.jQuery); 

/* 
* USAGE EXAMPLE 
*/ 
UrlHashMonitor.init(); 
UrlHashMonitor.onHashChange(function(){ 
    console.log('oldHash: ' + UrlHashMonitor.oldHash); 
    console.log('newHash: ' + UrlHashMonitor.newHash); 
    console.log('oldHref: ' + UrlHashMonitor.oldHref); 
    console.log('newHref: ' + UrlHashMonitor.newHref); 
    //do other stuff 
}); 

Questo dovrebbe funzionare in tutti i browser moderni.

DEMO: https://output.jsbin.com/qafupu#one

Problemi correlati