2012-07-09 14 views
9

Załóżmy mój HTML jestGet wartość hash, który był przed hashchange

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

i JS jest

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

Chcę uzyskać wartość hash, który był przed zmianą hash .Is to możliwe? Jeśli tak, jak?

+0

możliwe duplikat: http://stackoverflow.com/questions/680785/on-window-location-hash-change – undefined

+0

@undefined niezupełnie –

Odpowiedz

10

użycie że

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

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

+1

to daje niezdefiniowany –

+0

co przeglądarka i system operacyjny są używasz – Amit

+2

Mozilla Firefox i OS Windows 7 i nie powinieneś o to pytać, ponieważ chcę mieć kompatybilną z przeglądarką odpowiedź: –

6

Trzeba śledzić ostatni skrót, na przykład:

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

Wydaje się to nie działać w IE9 'event.fragment' również jest niezdefiniowane. Musiał zastąpić go 'location.hash.replace (/^# /, '')' –

+0

@ rparree dzięki, poprawiła moją odpowiedź. –

2

Faktycznie rozwiązanie dostarczone przez Amit działa, ale z biblioteki jQuery i także platforma krzyżowa.

Oto bardziej uproszczone rozwiązanie z wykorzystaniem javascript i crossbrowser. (Sprawdzone z najnowszej wersji 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

Nie działa na FF12, nie sprawdzono innych przeglądarek. – jldupont

+0

Jak wskazano powyżej, działa to w najnowszej wersji (IE/FF/Chrome/Safari). Kody są dobrze testowane i działają dla mnie we wszystkich czterech wskazanych przeglądarkach. Nie wiem, czy FF12 to najnowsza wersja przeglądarki. Kiedy testowałem, moja wersja FF to FF20.0.
Możesz sprawdzić wartość e (wykonane w drugim wierszu) i dowiedzieć się zmiennych oldURL i newURL (e.oldURL i e.newURL), jeśli istnieją lub nie. Powodzenia. –

+0

Miałem na myśli FF19 na Linuksie. W każdym razie używam 'window.location.hash', który wydaje się być dużo bardziej niezawodny. – jldupont

0

Nie używaj

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

To nie będzie działać na IE i pewnie gdzie indziej też.

Użyj tego raczej.

(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 
}); 

Powinno działać we wszystkich nowoczesnych przeglądarkach.

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

Powiązane problemy