我这里有一些循环,代码下的解释
$(document).ready(function(){
var newHash = "";
$('a').click(function(event) {
var id = $(this).attr('href');
alert(id);
//Do something with selector with id that is clicked
window.location.hash = $(this).attr("href");
event.preventDefault();
});
$(window).bind('hashchange', function(){
newHash = window.location.hash.substring(1);
if (newHash) {
$("ul li." + newHash + " a").trigger("click");
};
});
$(window).trigger('hashchange');
})
<ul>
<li class="first"><a href="#first">first</a></li>
<li><a href="#second">second</a></li>
<li><a href="#third">third</a></li>
</ul>
我正在使用Ben Alman的ba-hashchange插件这是一个活生生的例子-> EXTERNAL LINK ON MY SERVER
注意,当你点击"#first"时,你会收到2个警报但当粘贴链接时更改hash -> changed hash你只有一次警报。
它就像一个循环,当你点击链接时,你会从点击中得到警报,并从改变URL触发新的哈希。所以你有两个警报。
我只想要一个警报。在这种情况下。你粘贴链接,它的触发链接应该来自哈希名称,你得到1个警告。当你点击链接时它会改变哈希值但不会触发它改变这个哈希值
您收到两个警报,因为当您加载没有散列的页面时,您有效地单击了'first'链接两次。下面是发生的事情:
- 访问您的网站
- 你的'hashchange'处理程序被调用(因为某些原因你调用
$(window).trigger('hashchange')
,但是因为没有newHash值,什么也没有发生 - 点击"首次"
- 你的点击处理程序被调用,你调用
alert()
(第一个警报!),然后哈希被改变 - 因为哈希从你的点击处理程序中改变,你的'hashchange'处理程序被调用,现在因为newHash有一个有效值,你的处理程序再次点击链接(编程),你得到第二次警报。
当使用预设散列加载页面时,会发生类似的事件集:
- 使用哈希集 访问您的站点
- 你的'hashchange'处理程序被调用,但不像以前有一个非空的newHash值,所以你的代码编程点击第一个链接,你得到一个警报。哈希值被设置为与之前相同的值,因此hashchange处理程序不做任何操作。
- 点击"首次"
- 你的点击处理程序被调用,
alert()
被调用,但你的哈希值保持不变,所以你的哈希变化处理程序不被调用。所以在这种情况下,你只收到一个警报。
问题毫无意义,现在解决了。在这种情况下,我只需要。
$(document).ready(function(){
var newHash = "";
$('a').click(function(event) {
//Do something with selector with id that is clicked
window.location.hash = $(this).attr("href");
event.preventDefault();
});
$(window).bind('hashchange', function(){
newHash = window.location.hash.substring(1);
if (newHash) {
alert(newHash);
};
});
$(window).trigger('hashchange');
})
这是微不足道的,因为我的问题很复杂,但我需要睡觉来理解