我应该为JavaScript链接使用哪个" href"值,"#"或者" javascript:void(0)"?

时间:2020-03-06 14:44:14  来源:igfitidea点击:

以下是构建链接的两种方法,其唯一目的是运行JavaScript代码。在功能,页面加载速度,验证目的等方面哪个更好?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

或者

function myJsFunc() {
    alert("myJsFunc");
}
<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

解决方案

"#"会将用户带回到页面顶部,因此我通常选择" void(0)"。

javascript :;的行为也类似于javascript:void(0);

第一个,理想情况下带有真实链接,以防用户禁用JavaScript。只要确保返回false即可防止JavaScript执行时触发click事件。

<a href="#" onclick="myJsFunc(); return false;">Link</a>

如果我们使用Angular2,则这种方式有效:

&lt;a [routerLink]="" (click)="passTheSalt()">点击我&lt;/a>

看到这里https://stackoverflow.com/a/45465728/2803344

不要忘记URL可能是必需的事实-在遵循引用之前会触发onclick,因此有时我们需要在浏览页面之前对客户端进行某些处理。

除非我们使用JavaScript写出链接(以便我们知道已在浏览器中启用该链接),否则,理想情况下,应该为禁用了JavaScript进行浏览的用户提供正确的链接,然后在onclick中阻止该链接的默认操作事件处理程序。这样,那些启用了JavaScript的用户将运行该功能,而那些禁用JavaScript的用户将跳至相应的页面(或者同一页面内的位置),而不仅仅是单击链接而没有任何反应。

两者都不。

如果我们可以使用一个有意义的实际URL,则可以将其用作HREF。如果有人在链接上单击鼠标中键以打开新标签,或者禁用了JavaScript,则onclick不会触发。

如果这不可能,那么我们至少应使用JavaScript和适当的click事件处理程序将锚标记注入文档中。

我意识到这并非总是可能的,但是我认为在开发任何公共网站时都应努力做到这一点。

查看Unobtrusive JavaScript和Progressive增强功能(均为Wikipedia)。

理想情况下,我们可以这样做:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

或者,甚至更好的是,我们将在HTML中具有默认的动作链接,并且会在DOM呈现后通过JavaScript将onclick事件毫不费力地添加到元素中,从而确保如果不存在/未使用JavaScript,我们不会有无用的事件处理程序使代码混乱,并可能混淆(或者至少分散注意力)实际内容。

禁用JavaScript的用户可以访问网站真是太好了,在这种情况下,href指向执行与正在执行的JavaScript相同的操作的页面。否则,我将"#"与"return false;"一起使用,以防止其他人提到的默认操作(滚动到页面顶部)。

搜寻"`javascript:void(0)"可提供有关此主题的大量信息。其中一些,例如这一点提到了不使用void(0)的原因。

理想情况下,应该为非JavaScript用户提供一个真实的URL作为备用。

如果这没有道理,则将#用作href属性。我不喜欢使用onclick属性,因为它直接将JavaScript嵌入HTML中。更好的主意是使用外部JS文件,然后将事件处理程序添加到该链接。然后,我们可以阻止默认事件,以便在用户单击URL后,URL不会更改为添加"#"。

你也不要问我。

如果"链接"的唯一目的是运行一些JavaScript代码,则该链接不符合链接的条件;而是一段带有JavaScript函数的文本。我建议使用带有<onpan handler>标签的<span>标签和一些基本CSS来模仿链接。链接是用于导航的,如果JavaScript代码不是用于导航的,则不应使用&lt;a>标记。

例子:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>

根据我们要完成的工作,我们可能会忘记onclick而仅使用href:

<a href="javascript:myJsFunc()">Link Text</a>

它绕过了返回false的需要。我不喜欢选项,因为如上所述,它将带用户到页面顶部。如果我们在其他地方未启用JavaScript来发送用户(这在我工作的地方很少见,但是是一个很好的主意),那么Steve提出的方法非常有用。

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

最后,如果我们不希望任何人去任何地方并且不想调用JavaScript函数,则可以使用javascript:void(0)。如果我们有想要发生鼠标悬停事件的图像,则效果很好,但是用户没有任何可单击的东西。

我相信我们提出的是错误的二分法。这些不是仅有的两个选择。

我同意D4V360先生的意见,他建议,即使我们使用的是定位标记,我们在这里也没有真正的定位标记。我们所拥有的只是文档的特殊部分,其行为应略有不同。 &lt;span>标签更合适。

如果我们使用链接作为仅执行一些JavaScript代码的方式(而不是强烈建议使用像D4V360这样的跨度),请执行以下操作:

<a href="javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B">test</a>

如果我们使用带有onclick的链接进行导航,那么在关闭JavaScript时,请勿使用href ="#"作为后备。用户单击链接时通常很烦人。相反,请提供onclick处理程序将提供的相同链接(如果可能)。如果我们无法执行此操作,请跳过onclick并仅在href中使用JavaScript URI。

我用的是javascript:void(0)。

三个原因。鼓励在开发人员团队中使用#不可避免地会导致某些人使用这样的函数的返回值:

function doSomething() {
    //Some code
    return false;
}

但是后来他们忘了在onclick中使用return doSomething(),而只是使用doSomething()

避免使用"#"的第二个原因是,如果被调用的函数抛出错误,则最终的" return false;"将不会执行。因此,开发人员还必须记住在调用的函数中适当地处理任何错误。

第三个原因是在某些情况下会动态分配onclick事件属性。我更喜欢能够调用一个函数或者动态分配它,而不必专门为一种添加方法或者另一种添加方法编写函数。因此,我在HTML标记中的" onclick"(或者其他任何形式)看起来像这样:

onclick="someFunc.call(this)"

或者

onclick="someFunc.apply(this, arguments)"

使用javascript:void(0)可以避免上述所有麻烦,而且我还没有发现任何不利方面的例子。

因此,如果我们是一个孤独的开发人员,那么我们可以明确地做出自己的选择,但是如果我们是团队合作,则必须声明以下两种情况:

使用href ="#",确保onclick总是包含return false;,确保任何被调用的函数都不会抛出错误,并且如果我们将函数动态添加到onclick属性,请确保以及不引发错误,它会返回" false"。

或者

使用href =" javascript:void(0)"

第二种显然更容易沟通。

如果我们使用的是<a>元素,则使用此元素:

<a href="javascript:myJSFunc();" />myLink</a>

就我个人而言,以后我将使用JavaScript添加事件处理程序(使用attachEvent或者addEventListener或者也许<在这里放置我们喜欢的JavaScript框架>)。

我同意其他地方的建议,指出我们应该在href属性中使用常规URL,然后在onclick中调用一些JavaScript函数。缺陷在于,它们会在通话后自动添加" return false"。

这种方法的问题在于,如果该功能不起作用或者出现任何问题,则该链接将变得不可点击。 Onclick事件将始终返回" false",因此不会调用普通URL。

有一个非常简单的解决方案。如果函数正常运行,则让函数返回" true"。然后使用返回的值确定是否应取消点击:

的JavaScript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

的HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

注意,我否定了doSomething()函数的结果。如果可行,它将返回" true",因此将被否定(" false"),并且不会调用" path / to / some / URL"。如果该函数返回" false"(例如,浏览器不支持该函数中使用的某些内容,或者其他任何错误),则将其否定为" true",并调用" path / to / some / URL" 。

我建议改用&lt;button>元素,尤其是在控件应该在数据中产生更改的情况下。 (有点像POST。)

如果我们毫不夸张地注入元素(一种渐进增强),那就更好了。 (请参阅此评论。)

通常,我们应该始终具有一个后备链接,以确保禁用JavaScript的客户端仍然具有某些功能。这个概念称为非干扰性JavaScript。

示例...假设我们具有以下搜索链接:

<a href="search.php" id="searchLink">Search</a>

我们始终可以执行以下操作:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

这样,禁用JavaScript的人将被定向到search.php,而使用JavaScript的查看者将查看增强功能。

最好使用jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

并同时省略href ="#"和href =" javascript:void(0)"。

锚标记标记将类似于

<a onclick="hello()">Hello</a>

很简单!

只是为了了解其他一些人提到的观点。

最好绑定事件'onload'a或者$('document')。ready {};。然后将JavaScript直接放入click事件中。

在无法使用JavaScript的情况下,我将对当前URL使用href,并在链接位置使用锚点。对于没有JavaScript的人来说,该页面仍然可以使用,那些没有注意到任何区别的人。

正如我所掌握的那样,这是一些可能会有所帮助的jQuery:

var [functionName] = function() {
};

jQuery("[link id or other selector]").bind("click", [functionName]);

我们还可以像这样在锚中编写提示:

<a href="javascript:void('open popup image')" onclick="return f()">...</a>

因此用户将知道此链接的作用。

我用以下

<a href="javascript:;" onclick="myJsFunc();">Link</a>

反而

<a href="javascript:void(0);" onclick="myJsFunc();">Link</a>

绝对哈希()更好,因为在JavaScript中它是伪方案:

  • 污染历史
  • 实例化引擎的新副本
  • 在全局范围内运行,并且不尊重事件系统。

当然,带有防止默认操作的onclick处理程序的"#"要好得多。而且,唯一有运行JavaScript的链接并不是真正的"链接",除非我们在出现问题时将用户引导到页面上的某个合理锚点(只会发送到顶部)。我们可以简单地模拟与样式表链接的外观,而完全不用考虑href。

另外,关于Cowgod的建议,尤其是这样:... href =" javascript_required.html" onclick =" ...这是一个好方法,但是不能区分" JavaScript禁用"和" onclick失败"两种情况。

#比javascript:anything更好,但以下内容甚至更好:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

我们应该始终努力使性能降级(在用户未启用JavaScript的情况下……以及在具有规范和预算的情况下)。另外,直接在HTML中使用JavaScript属性和协议也被认为是不好的形式。

与总体观点完全一致,需要时使用void(0),并在需要时使用有效的URL。

使用URL重写,我们可以使URL不仅可以在禁用JavaScript的情况下完成我们想做的事情,而且可以确切地告诉我们它要做什么。

<a href="./Readable/Text/URL/Pointing/To/Server-Side/Script" id="theLinkId">WhyClickHere</a>

在服务器端,我们只需解析URL和查询字符串,然后执行所需的操作即可。如果我们很聪明,则可以允许服务器端脚本以不同的方式响应Ajax和标准请求。允许我们使用简洁的集中式代码来处理页面上的所有链接。

URL重写教程

优点

  • 显示在状态栏中
  • 通过JavaScript中的onclick处理程序轻松升级到Ajax
  • 实际上评论自己
  • 防止目录被一次性HTML文件所困扰

缺点

  • 在JavaScript中仍应使用event.preventDefault()
  • 服务器端的路径处理和URL解析相当复杂。

我敢肯定那里还有更多的弊端。随时讨论他们。

这里还有一件重要的事情要记住。符合第508条的规定。
因此,我觉得有必要指出,我们需要屏幕阅读器(例如JAWS)的定位标记,以便能够通过制表符将其聚焦。因此,"仅使用JavaScript而忘了开始的锚"解决方案不是其中某些选择。仅当我们负担不起屏幕跳回到顶部时,才需要在href内触发JavaScript。我们可以使用settimeout设置0秒钟,并使JavaScript触发我们需要聚焦的位置,但即使页面也将跳转到顶部然后返回。