所以我想我的頁面加載內容,如果窗口的散列已更改。onHashChange運行onLoad ... awkward
使用Mootools的,這是很簡單的:
$extend(Element.NativeEvents, {
hashchange: 1
});
然後:
window.addEvent('hashchange', function() {});
然而,當被加載頁面的hashchange
事件被解僱,即使規範要求它不發射,直到頁面加載完成!
除非我第一次加載頁面,沒有散列,那麼所有的預期工作。
我認爲這裏的問題是,瀏覽器認爲頁面加載「完成」,然後運行JavaScript的其餘部分,其中包括散列檢測加載必要的頁面。
例如,如果我在http://foo.bar/
中輸入,所有都會正常工作。但是,理想情況下,http://foo.bar/#test
會加載初始頁面,檢測散列並加載「測試」內容。
不幸的是,瀏覽器加載了初始頁面,認爲它是「已準備就緒」,然後加載「測試」內容,然後觸發onHashChange
。哎呀?
這會導致無限循環,除非我特別要求瀏覽器不要在發生事件時更新哈希值。這很容易:
var noHashChange;
noHashChange = true;
var hashes = window.location.hash.substr(1).split("/"); // Deciphers the hash, in this case, hashes[0] is "test"
selectContent(hashes[0]); // Here, selectContent would read noHashChange, and wouldn't update the hash
noHashChange = false;
所以,現在,更新已加載頁面後的哈希將正常工作。除了在初始頁面加載時仍然堅持,並且獲取內容大約3或4次,因爲它一直在檢測散列已經改變。亂。
我認爲它可能有一些做與我怎樣設置散列,但我想不出更好的辦法,除了這樣做:內部函數的
window.location.hash = foobar;
...那在選擇新內容時運行。
這就是問題所在,是嗎?頁面加載,那麼內容加載(如果有內容)...
我希望我一直連貫......
你可以用一個工作的例子創建一個jsfiddle嗎? www.jsfiddle.com – 2010-07-21 04:20:26
@chase:www.jsfiddle。* net * - 以防萬一;) – polarblau 2011-07-13 17:47:15
Woops!我應該更清楚地知道。 – 2011-07-14 20:18:00