Javascript onHashChange正在运行onLoad。。。令人尴尬的

Javascript onHashChange正在运行onLoad。。。令人尴尬的,javascript,mootools,onload,Javascript,Mootools,Onload,因此,如果窗口的哈希值发生变化,我希望我的页面加载内容 使用Mootools,这非常简单: $extend(Element.NativeEvents, { hashchange: 1 }); 然后: window.addEvent('hashchange', function() {}); 但是,加载页面时会触发hashchange事件,即使规范要求在页面加载完成之前不触发该事件 除非我是第一次加载页面,没有散列,否则一切都会正常工作 我认为这里的问题在于浏览器认为页面加载“完成”,

因此,如果窗口的哈希值发生变化,我希望我的页面加载内容

使用Mootools,这非常简单:

$extend(Element.NativeEvents, {
    hashchange: 1
});
然后:

window.addEvent('hashchange', function() {});
但是,加载页面时会触发
hashchange
事件,即使规范要求在页面加载完成之前不触发该事件

除非我是第一次加载页面,没有散列,否则一切都会正常工作

我认为这里的问题在于浏览器认为页面加载“完成”,然后运行其余的JavaScript,其中包括哈希检测以加载所需的页面

例如,如果我键入
http://foo.bar/
,一切正常。但是,
http://foo.bar/#test
理想情况下,加载初始页面、检测散列并加载“测试”内容

不幸的是,浏览器加载初始页面,将其视为“domready”,然后加载“test”内容,然后触发
onHashChange
。哎呀

这会导致无限循环,除非我特别要求浏览器在触发
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;
。。。在选择新内容时运行的函数内部

这就是问题所在,是吗?加载页面,然后加载内容(如果有内容)


我希望我是连贯的…

也许您可以先检查散列以消除递归:

 if(window.location.hash != foobar){ window.location.hash = foobar;}
为什么onHashChange处理程序会以任何方式更改哈希?如果在加载内容之前先选择了一些默认值,那么可能会在一个单独的函数中进行选择


(我这么说是因为看起来你的位置有某种目录结构的约定。散列,也许你是在选择根时选择了树的某个特定叶还是什么?)

您可以为哈希对象实现一个观察器,当has对象发生更改时,该观察器将触发一个函数。它与页面的实际加载无关。 最好的方法是通过
Object.prototype.watch


查看关于同一主题的其他页面:

看看它实现了onhashchange如果新的html5历史api不可用,无需重新发明轮子:)

你能用一个工作示例创建一个JSFIDLE吗?www.jsfiddle。com@chase:www.jsfiddle.*net*-以防万一;)呜呜!我应该知道得更清楚一些。事实证明,我没有多少条理清晰,因为读了一遍我的问题,我不知道我想说什么。为答案欢呼,它确实是一个目录结构。我将查看您的解决方案。您能否发布正确的解决方案或选择一个答案作为此问题的正确答案?嗨,蒂姆-我们决定“还没有”实施onHashChange。但请放心,这件事我已经记在心里了,一旦我们着手解决,我会让你知道我们是如何做到的。从那时到现在,我们可能已经发现了一个mootools函数可以正确地处理这个问题,所以这可能是没有意义的。