因此,如果窗口的哈希值已更改,我希望页面加载内容。
使用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处理程序始终会更改哈希?如果在加载内容之前先选择某些默认设置,则可能可以使用单独的功能。
(之所以这样说是因为看起来好像您的位置具有某种目录结构式的约定。哈希是,也许您在选择根时选择的是树的特定叶子还是其他?)