2016-03-19 36 views
1

我用下面的代码单击要更改<a>href属性重定向,
我不想使用window.locationwindow.open这样做的原因,
因为如果我用这个方法,当用户点击按钮,他们可以仍然选择选项卡按键盘打开新的URL或不变化HREF重定向

例如a在它的工作原理像往常一样,但b只改变HREF 不是重定向,为什么呢?以及如何解决?

<div class="submit"> 
    <a>submit</a> 
</div> 

一个

$('.submit').on('click', function() { 
    var submit = $(this); 

    // var url = ...; 
    $(submit).find('a').attr('href', url); 
}); 

b

$('.submit').on('click', function() { 
var submit = $(this); 

    requestPost().then(function(response) { 
    // ... 

    // var url = ...; 
    $(submit).find('a').attr('href', url); 
    }); 
}); 
+0

“打开一个新的标签”是很重要的浏览器功能。除非你有非常充分的理由,否则你不应该将其从用户手中抢走。 –

+0

??雅我同意这一点很重要,那就是为什么我问这个问题。尽量找到方法,我可以使用ajax发布数据,用户还可以选择是否打开tab,而不仅仅是使用window.open为用户决定。 – user1575921

回答

0

这是因为在a你在onclick处理程序anchor的容器,这意味着click事件赢得分配href直到onclick处理程序完成才完成(因为此处理程序可以通过返回来中止点击和导航false或做一个event.preventDefault)。

虽然b,因为您使用的是异步函数,onclick句柄成功完成完成异步函数requestPost之前,所以改变了锚的href没有导航的影响,因为的onclick已经没有HREF完成标记,但是如果您再次点击submit那么它会导航,因为href已在之前的点击中设置。

所以,作为一个快速的解决方法,你可以做的是触发锚点击您指定href属性后,像

$(submit).find('a').attr('href', url).click();

+0

感谢您的回复,我试过触发点击之前,但它会再次发布数据,无限循环 – user1575921

+0

右键然后做一件事情,在'$('。submit')。'('click',function(){ '返回false,让我尝试附加一个片段到我的答案,如果SO支持导航 –

+1

在这种情况下可以在tagName上进行检查,但无论如何,您对错误的过程是正确的,事情是他想要用户决定是否必须在新选项卡中或在当前选项卡中或在新窗口中打开。 –