我应该为JavaScript链接使用哪个" href"值,"#"或者" javascript:void(0)"?
以下是构建链接的两种方法,其唯一目的是运行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,则这种方式有效:
<a [routerLink]="" (click)="passTheSalt()">点击我</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代码不是用于导航的,则不应使用<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先生的意见,他建议,即使我们使用的是定位标记,我们在这里也没有真正的定位标记。我们所拥有的只是文档的特殊部分,其行为应略有不同。 <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" 。
我建议改用<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触发我们需要聚焦的位置,但即使页面也将跳转到顶部然后返回。