JavaScript控制HREF的中键/右键单击URL

JavaScript控制HREF的中键/右键单击URL,javascript,jquery,html,Javascript,Jquery,Html,我有一个链接,想用JavaScript将它们重定向到另一个URL。我让它在左键单击下工作,但在用户中键单击或右键单击->在新选项卡/窗口中打开时不工作。我如何让它适用于中键/右键单击流 Codepen无法很好地显示href行为 $('a')。在('click')上,函数(e){ e、 预防默认值(); window.location.href=http://www.google.ca“;//不适用于中键/右键单击 }); 我尝试了收听mousedown事件,而不是click,但我只能重新引导

我有一个链接,想用JavaScript将它们重定向到另一个URL。我让它在左键单击下工作,但在用户中键单击或右键单击->在新选项卡/窗口中打开时不工作。我如何让它适用于中键/右键单击流

Codepen无法很好地显示
href
行为

$('a')。在('click')上,函数(e){
e、 预防默认值();
window.location.href=http://www.google.ca“;//不适用于中键/右键单击
});


我尝试了收听
mousedown
事件,而不是
click
,但我只能重新引导当前窗口。打开的新窗口/选项卡返回了不正确的
#
URL,而不是
www.google.ca

event.event,这对您的情况很有用,其中event.event分别等于1,2,3(左、中、右)。现在你的代码是这样的

$('a').mousedown(function(e) {
    e.preventDefault();
    if(e.which == 2 || e.which == 3)
    window.location.href = 'http://www.google.ca'; 
});
我尝试了收听mousedown事件而不是单击,但我只能重新定向当前窗口。打开的新窗口/选项卡返回了错误的URL#,而不是www.google.ca

如果这是阻止它完美工作的唯一原因,您可以简单地用适当的URL替换href标签(无论如何,这是一种更好的做法)。当然,你仍然会拦截点击

比如说:

$('a').on('mousedown', function(e) {
    e.preventDefault();
    window.location.href = 'http://www.google.ca'; //does not work for middle/right click
});
<a href="http://www.google.ca">link</a>
$('a')。在('mousedown',函数(e)上{
e、 预防默认值();
window.location.href=http://www.google.ca“;//不适用于中键/右键单击
});

如果链接是动态的,您可以在回调中更新href。

解决方案是避免侦听单击事件,而是侦听这些其他事件:

$('a')。打开(“上下文菜单”,函数(e){
$(this.attr('href','http://www.google.ca')
});
$('a')。在(“mouseup”上,函数(e){
$(this.attr('href','http://www.google.ca')
});
$('a')。on('mouseout',函数(e){
$(this.attr('href','#')
});

相反,如果您想禁用右键和中键单击,并像左键单击一样执行它们,则完全可以删除上下文菜单。

因为这只是考虑左键单击。它不检测单击了哪个鼠标按钮。您必须检测按钮,然后在此基础上继续。嗯,他的代码没有条件,因此它会在任何mousedown事件中触发,而您的代码会首先执行条件。此代码不会在右键单击时触发,防止右键单击菜单弹出,从而使用户无法单击“在新选项卡中打开”?@md84h此解决方案不适用于我,因为中键/右键单击只会将当前窗口强制转到Google。生成的新窗口仍然在#中打开。只需再添加一行e.preventDefault();若要防止默认操作,应使用.attr作为属性,使用.prop作为属性(通常为布尔值)。href是一个属性,因此您应该更改代码。诚然,您的代码可以工作,但它违反了最佳实践@gaemaf它适用于右键单击,但不适用于中键单击。您的解决方案是否有可能包含中键单击?对于中键单击I引擎,您必须在鼠标悬停事件上收听,重复我在关联菜单中所做的操作。你是对的上下文菜单只是一个正确的按钮,但我没有一个中间按钮,所以我为我的缺乏道歉。但是我确信你可以用同样的方式为鼠标重复事件上下文菜单,当然测试属性必须不同。非常感谢。中键单击和左键单击都是
mouseup
事件:(我同意用正确的URL替换HREF标签是更好的做法。但是,在我的情况下,无论如何我都不允许更新HREF。我不能。在我的情况下,我不能以任何方式更改DOM结构。在这种情况下,你必须使用contextmenu事件阻止右键单击行为,但我不确定你是否可以让它在r所有浏览器的中键点击。嗯……我将开始研究检测中键点击的e