2016-11-30 32 views
0

我有一些代码JavaScript(jQuery)代码正在运行,用于侦听<a href="">点击并将其替换为数据属性中的链接。仅当用户需要时,JavaScript窗口位置新选项卡

<a class="js-external" href="http://www.google.com/" data-href="/tracking.php?url=http://www.google.com/">Google</a> 
<script type="text/javascript"> 
    $('a.js-external').click(function(e) { 
     var hrefNew = $(this).attr('data-href'); 

     if (hrefNew) { 
      e.preventDefault(); 
      window.location.href = hrefNew; 
     } 

    }); 
</script> 

这按预期工作,但打破了一些浏览器行为。如果用户ctrl + click的链接(在新窗口中打开它),该URL仍然会在同一窗口中打开。

我该如何不打破常规浏览器?我是否也应该检测用户是否按住ctrl,然后使用window.open()

+1

'如果(e.ctrlKey)window.open(...)'? –

+0

是的,我可以做到这一点。但我也必须为mac添加'metaKey',并且可能还会增加一些边缘情况。没有更好的方法吗? – DenverCoder9

回答

0

它发生,因为你是防止默认动作与 e.preventDefault();

使你在你的问题中提到你必须跟踪压制在新窗口中的控制键和开放。

if(e.ctrlKey) 
    window.open(hrefNew) 
    else 
    window.location.href = hrefNew; 

但是,如果你不希望这样做那么最简单的方法是动态地设置的锚的href属性。

$('a.js-external').click(function(e) { 
    var hrefNew = $(this).attr('data-href'); 
    if (hrefNew) { 
     $(this).attr("href",hrefNew); 
    } 
}); 

https://jsfiddle.net/tintucraju/go44o3o3/

+1

谢谢!替换实际的href值似乎效果最好。检测'ctrlKey'是不够的,因为还有鼠标中键,'metaKey'等等。我认为只有它没有检测到的点击是鼠标右键 - >在新标签中打开。 – DenverCoder9

相关问题