javascript:void(0)和target =“_ blank”行为

时间:2013-06-13 18:28:34

标签: javascript html

首先,我没有真正的问题。我只是出于好奇而问这个。

在同一个链接中使用javascript:void(0)target="_blank"时,我不小心遇到了一种奇怪的行为。

<a href="javascript:void(0);" target="_blank" /> Link </a>

我发现Chrome正常处理此问题而在您点击该链接时没有做任何事情,而IEFirefox会打开一个空白的新标签。

我的问题是,javascript:void(0)是否应该阻止来自链接的任何点击事件,即使它是针对新标签/窗口的?为什么target="_blank"会覆盖它?

另外,如果我是最好的方法,比方说,用href属性填充target="_blank"属性,我更喜欢在href属性旁边硬编码{{1}}?

2 个答案:

答案 0 :(得分:1)

<a href=# onclick="return false;">I look like a link!</a>

总是使用它。

编辑:关于void(0)的问题,onclick应该具有比href属性更高的优先级,因为它提供了更丰富的功能,并且具有实际阻止href操作的能力 - 因此我的{{1} }。如果存在onclick事件,则href仅适用于机器人和旧浏览器。

此外,是否使用奇怪形成的URL执行常规导航由浏览器决定。如果链接以哈希开头,它应该只是跳转到书签。但是当它为空或包含其他协议时,如果它决定尝试访问新文档,则全部取决于浏览器。输入return false伪协议传统上用于预期与当前页面一起使用的bookmarklet,因此任何不javascript:或其他破坏性修改javascript:应该< / em>让页面重新加载。

EDIT2:我不确定href中后端语言的含义,但考虑到HTML有效的document.write()属性,如果它在逻辑上不属于href属性,则可以使用代码。

答案 1 :(得分:0)

我用简单的技巧解决了这个问题。它可能有用。

我已根据链接动态删除了目标属性。即如果链接未定义或为空或javascript:void(0),那么我们将使用下面的代码删除目标属性。

如果链接是正确的,我们将添加该超链接的目标属性(&#34;如果条件&#34;则会这样做,因为在我的页面链接是动态的)。

我复制了示例html文件(Test.html)。 如果我们要删除页面onload上的属性,请复制此文件中的脚本代码并将其粘贴到所需文件的末尾。

如果我们想将此应用于动态链接,我们必须将此代码放在一个函数中,我们可以在需要时调用它。

此代码适用于该页面中的所有超链接。我们可以使用类或任何其他属性将此限制为特定的链接集。

Test.html
---------

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<a href="javascript:void(0);" target="_blank">Link1</a>
<a href="javascript:void(0);" target="_blank">Link2</a>
<a href="www.url1.com" target="_blank">Link3</a>
<a href="www.url2.com" target="_blank">Link4</a>

<script>
$("a").each(function() {

if(typeof(this.href) == 'undefined' || this.href == 'javascript:void(0);') {
    $(this).attr('href', 'javascript:void(0);');
    $(this).removeAttr('target');
}
if(typeof(this.href) != 'undefined' && this.href != 'javascript:void(0);') {
    var s_link = this.href;
    if (s_link.indexOf('http://') === -1 && s_link.indexOf('https://') === -1) {
        s_link = 'https://' + s_link;
    }   
    $(this).attr('href', s_link);
    $(this).attr('target', '_blank');
}

});
</script>