2012-01-17 63 views
4

想象一下下面的标记:让jQuery在读取href之前等待href更改?

<a href="#link01">1</a> 
<a href="#link02">2</a> 

和:

$('a').click(function(){ 
    var href = $(location).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 

现在,会发生什么你点击一个链接是jQuery的提醒hrefPage这是那里你点击了链接,不以前后如预期的那样,在之后的。因此:

1)我位于http://www.example.com/#link01
2)单击链接
3,结果)link01是呼应
3,预期)link02是呼应

任何想法如何解决这一问题?

编辑:我为什么使用位置而不是href?因为我希望前面的代码也可以在页面加载href时没有任何被单击的情况下工作,我不认为为同一个进程编写两段代码是一个好主意吗?

+1

你trrying实施“页面位置发生改变, “处理程序与链接点击处理程序。它不这样工作。对于初学者来说,'click'会触发_first_,但还有其他原因无法使用。只需要链接的“href”属性。 – 2012-01-17 16:27:04

+0

编辑了这个问题。 – 2012-01-17 16:28:41

+0

不,链接的点击处理程序不会因为您加载页面而奇迹般地触发。如果你想避免代码重复,把逻辑封装在一个函数中,并在多个处理程序中调用它。 – 2012-01-17 18:59:41

回答

2

你可以使用hashchange事件监测这些变化,而不是:

$('a').bind('hashchange',function(){ 
    var hval = location.hash.slice(1); // remove the leading # 
    alert(hval); 
}); 

要在页面LO触发hashchange广告,所以它触发对外部链接的散列或当你后退按钮(而不是点击一个链接,只有当)浏览,补充一点:

$(document).ready(function() { 
    $(window).trigger('hashchange'); 
}); 
+0

你应该包含使这项工作在IE中的回退。 – 2012-01-17 16:30:50

+0

它在IE8 +中工作 - 旧版本需要[插件](http://stackoverflow.com/q/680785/901048)。 – Blazemonger 2012-01-17 16:32:53

2

您的代码中存在一个错误。而不是this关键字,您正在使用location它指向window.location

$('a').click(function(){ 
    var href = $(this).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 
+0

我认为他的意思是,虽然这是对问题的有效解决方案。 – 2012-01-17 16:26:09

0

为什么不使用您点击的链接的href?它将具有href在更改之后所具有的价值。

$('a').click(function(){ 
    var href = this.href, 
    hrefLength = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
    // could also use: 
    // alert(this.href.split("#")[1]); 
}); 
0

您需要在运行javascript之前获取url更改。你可以做到这一点的方法之一是简单地把

window.location = $(this).attr('href'); 

在javascript代码的顶部,迫使窗口导航操作你的JavaScript之前发生

例如:http://jsfiddle.net/btdqe/