以下是构建链接的两种方法,它们的唯一目的是运行JavaScript代码。在功能、页面加载速度、验证目的等方面,哪一个更好?
1 2 3
function myJsFunc( ) {
alert( "myJsFunc" ) ;
}
或
1 2 3
function myJsFunc( ) {
alert( "myJsFunc" ) ;
}
除非我遗漏了什么,否则 完全没有意义。如果您必须使用javascript: psuedo协议,那么您也不需要onclick 属性。 会做得很好。
@wesleymurch-如果myJsFunc() 有返回值,则页面将中断。jsfiddle.net/jad9g您仍然需要像这样使用void : 。但是,这样的行为还是会有所不同。通过上下文菜单调用链接不会触发click 事件。
为什么不只是?
javascript:; 比javascript:void(0) 打字快得多呢?
@Gilly3认为jsFiddle并没有破坏页面。它变了吗?我喜欢在href 属性中指出单击 时将发生什么。
@迈克尔,这取决于你使用的浏览器。IE和FF"break"通过将返回值("false",在本例中)加载为新的URL。chrome绕过了href行为,只执行函数。
只需执行 ,它就可以正常工作,不仅可以单击,还可以通过上下文菜单等在键盘上输入。
第一个想到的是:"如果您不想通过本机浏览器功能打开另一个页面,而是想触发一些javascript‘操作’,为什么要使用 标记?"简单地使用一个span 标记和一个js-trigger 类可能会更好"。还是我错过了什么?
@Adrienbe你说得对,链接是从一个Web资源到另一个Web资源的连接,而不是一个简单的UI元素。但是我建议使用一个按钮,因为我们希望在单击一个元素之后发生一些事情——这就是为什么我们在HTML中有这个元素。另请参阅stackoverflow.com/a/8525002/1384441
@查努一个</button> 可以做这个工作是的。type="button" 删除了默认的submit 行为,如果您只需要一个"纯javascript钩子",那么您可能不需要这种行为。请参阅developer.mozilla.org/en-us/docs/web/html/element/button
链接应该像一个链接,而不是一个按钮。你真正需要的是一个链接按钮。
在HTML5中,不再需要href属性,因此可以使用以下格式:...</a> 。
那么,没有href 属性,只保留onclick 、ng-click 、(click) 等属性呢?如果您担心指针光标丢失,请将a { cursor: pointer; } 添加到您的css文件中。这还将阻止任何人试图在新选项卡中打开链接。
在Safari(移动)上,选项2可能难以正确显示?
Timo Huovinen:问题就变成了键盘的可访问性。如果没有href ,则无法通过键盘聚焦和激活链接。
为什么不使用空白的 ,不使用a href?它是完全有效的,并且实现了与javascript:void(0) 相同的效果。
如果您编程SPA,那么这两种方法都不好,因为不维护导航历史记录。有些解决方案实际上是将函数指定为Href值,允许浏览器将其作为导航历史记录推送,并保持退格键的功能。
我在一些浏览器中使用这个run-javascript代码。在href中javascript可以被忽略,尽管google seo会在href中标记为断开的链接javascript:void(0)。
@Adrien Be,使用锚而不是跨度的原因是为了方便使用。链接可以标记为,并以特殊方式读取到屏幕阅读器。当然,在链接用于动态功能的许多情况下,按钮通常更有意义。
@用户2867288 1/人们真的使用选项卡浏览链接吗?我很少看到有人这样做,但也许有数据证明我错了。另一点是它与触摸屏无关。2/屏幕阅读器主题在IMO中使用过度,同样(不幸的是)关于该主题的数据非常少,因此它可能完全不相关(即没有人通过屏幕阅读器使用您的网站,或者您的网站已经完全无法被屏幕阅读器访问)。几年前我在美国发布了一个关于屏幕阅读器使用的问题(因此我的观点),将试图找到它。
@AdrienBe,对于那些不想被只会用下巴移动的退伍军人或盲人起诉的公司来说,这更重要。如果你想对访问你网站的残疾人怀有敌意,那是你的特权。但不要试图说服别人遵守坏习惯。
@阿德里安是,在我问到"如何使链接可标签化帮助身体残疾的人谁只能移动他们的脖子?"有一些设备通过头部运动模拟键盘控制,专门为身体残疾人士设计。
@用户2867288个性化,可爱。我的观点不是我对它有敌意,而是相反。这表明,大多数开发人员"假装支持这个",因为他们实际上从未测试过它——测试是软件开发生命周期的一个既定阶段——也没有人对这个主题进行任何研究(几乎没有任何可用的数据),这表明对整个主题缺乏实际的支持。现在,您要么试图欺骗自己和他人,假装编写您从未测试过的代码,等等,要么尝试通过测试您编写的代码、提供使用数据等来提升争论。
@Adrien Be,美国政府要求其承包商进行测试,并至少符合第508条。我不知道你从哪里知道没有人测试可访问性。有一些自动化工具可以做到这一点,尽管它们中的许多很糟糕,因为它们依赖于Web爬行,而不是源代码评估。我最喜欢的是"HTML代码嗅探器",尽管这不容易放在管道中。
@用户2867288这是一个非常好的观点(美国政府要求)。在这个话题上,无论是在工作还是在网络上,我都没有遇到太多的问题,而且还是找不到太多(任何?)。关于使用屏幕阅读器的人口的可用数据(我已经搜索了很长一段时间了),因此我对给予它应有的关注的人表示怀疑。为了你的投入,至少我学到了一些东西。人们真的遵循这些要求吗?我真的很好奇,我知道在IT需求中,被认为是"完成"的需求在不同的人/团队之间会有很大的不同。
如果我们讨论的是政府承包商,那么是的,按照第508条的规定履行合同,否则你将失去合同。当然,任何一家大公司都存在着大量的不称职,这可能导致它成为一项次要任务。Target因其网站的易访问性差而提起了集体诉讼。对于新开发人员来说,Twitter引导程序的可访问性是多么的丰富,它在相关的文档中包含了角色和aria-*标记。Angular的材料设计实现也被编码为可访问性遵从性,并自动生成ID。
我用的是javascript:void(0) 。
三个原因。鼓励在开发团队中使用# ,不可避免地会导致一些人使用这样的函数的返回值:
1 2 3 4
function doSomething( ) {
//Some code
return false ;
}
但后来他们忘记了在onclick中使用return doSomething() ,只使用doSomething() 。
避免# 的第二个原因是,如果被调用的函数抛出错误,最终的return false; 将不会执行。因此,开发人员还必须记住在被调用的函数中适当地处理任何错误。
第三个原因是存在动态分配onclick 事件属性的情况。我更喜欢能够调用一个函数或动态地分配它,而不必为一种或另一种附加方法专门编写函数代码。因此,在HTML标记中,我的onclick 或任何东西看起来如下:
1
onclick= "someFunc.call(this)"
或
1
onclick= "someFunc.apply(this, arguments)"
使用EDOCX1[1]可以避免上述所有的头痛,而且我还没有发现任何负面的例子。
因此,如果你是一个独立的开发人员,那么你可以明确地做出自己的选择,但是如果你作为一个团队工作,你必须声明:
使用href="#" ,确保onclick 在结尾处始终包含return false; ,任何被调用的函数都不会引发错误,如果您动态地将函数附加到onclick 属性,则确保在不引发错误的同时返回false 。
或
使用href="javascript:void(0)" 。
第二种显然更容易沟通。
我总是在一个新的选项卡中打开每个链接,这就是为什么我个人讨厌人们使用href="javascript:void(0)" 方法的原因。
抱歉,不同意。为什么这个答案有这么多赞成票?任何使用javascript: 的做法都应被视为不好的做法,突兀而不优雅。
接下来的两个答案要比这一个好得多,合理得多。另外,前两个参数也是无效的,因为event.preventDefault() 正是为了防止默认行为(比如在本例中跳到页面的顶部)并在没有return false; 疯狂的情况下更好地处理它。
快进到2013年:javascript:void(0) 违反了支持CSP的HTTPS页面上的内容安全策略。一种选择是在处理程序中使用href='#' 和event.preventDefault() ,但我不太喜欢这样。也许您可以建立一个使用href='#void' 的约定,并确保页面上没有元素具有id="void" 。这样,单击指向不存在锚的链接将不会滚动页面。
您可以使用"",然后将单击事件绑定到所有带有""的链接,如href 。这将在jquery中通过:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; }); 完成。
@Jakub.g我最喜欢使用通用哈希标签的想法。如何防止URL在浏览器中更新?这是我唯一关心的…谢谢!
@Jaminroe很好的问题;这在现代浏览器中似乎对我很有用:window.onhashchange = function (evt) { if(evt.newURL.endsWith("#void")) { history.replaceState(null, null, evt.oldURL); } } 还没有用IE进行测试,尽管MDN说它不支持evt.newURL 和evt.oldURL (至少是ie8)。ie10支持replaceState 。
第二个为什么对开发人员有利?当一个错误被抛出时,我不希望事情照常进行。
就这样离开href="blank怎么样?我读过这本书,效果很好,以我的经验来看。它仍然有效
Web标准:只有当您有一个有效的URL时,才应该使用HREF,并且应该在页面加载之前将该URL放在HREF之间。这两种方法对于可访问性、可用性和适用于Web开发的所有其他功能都很糟糕。
这是最好的答案,因为它实际上回答了这个问题。你们中的大多数人似乎错过了"一个专门用于运行javascript代码的链接"部分。关于新标签中的链接、优雅的降级和Web开发的所有含糊其辞都只是主题之外的Web标准/最佳实践恐慌。没有a-href可能是最好的,但这实际上会降低可访问性,并可能导致其他意外行为。
历史教训:使用hash-# 是一种黑客行为。旧浏览器(ie)不会使A 标记在没有非空HREF 属性的情况下可单击,许多元素永远无法单击;hash是使某些东西可单击并同时阻止导航的唯一方法,因为有些浏览器当时还没有运行javascript。没有现代的(甚至是现在仍在使用的旧的IES)有这些问题了;所以最好坚持标准,避免这两种黑客行为,以其他答案中提到的标准适当的方式进行。
@timohuovinen href="javascript:void(0)" 在单击鼠标中键时打开空白页,而href="#" 在单击鼠标中键时打开当前页的副本。我认为后者更糟,尤其是如果你在一个沉重的页面上。请注意,这只在firefox中发生:jakub-g.github.io/accessibility/onclick
我使用了"javascript:void(0)"来防止onclick页面从这里跳转。
为什么不把javascript:void(0) 一起用于这些案例呢?为什么不先使用data-* 属性,然后使用querySelector() 属性(或等效属性)并为它们添加事件侦听器呢?
我和ie8和EDOCX1的兼容性有问题,onclick没有在附加的事件上触发
这是最坏的答案。将链接用于链接,而不是JavaScript。javascript: 伪协议旨在用表达式返回的值替换当前文档。当所用表达式的计算结果为未定义的值时(如某些函数调用所做),不会替换当前页的内容。无论如何,有些浏览器将其解释为导航,并将进入"导航"状态,其中GIF动画和插件(如电影)将停止,导航功能(如元刷新、分配给location.href )和图像交换将失败。
值得注意的是,在当今使用客户端路由的客户端应用程序的世界中,使用# 通常不再是禁止操作的选项。
我注意到在你的HREF 中使用"javascript:void(0)" 的另一个缺点,那就是使用google分析或webtrends。首先,我假设您在Achor标记中使用"javascript:void(0)" ,因为它正在触发一个函数,该函数会导致一些不离开当前URL的交互。根据我的经验,使用"javascript:void(0)" 会导致您的锚标签被两次触发,这已经引起我的质量保证部门的注意。虽然问题看起来很小,但对于我严格的质量保证部门来说,使用"javascript:void(0)" 是一个相当大的问题。希望这能帮助别人。
@很高兴我不和你一起工作!链接是一个链接,不管你怎么打扮,像这样的黑客会制造更多的问题然后解决。到了2016年,不应该有人使用# 或javascript:void(0) ,现在不管你是否想运行javascript都是很糟糕的做法。它是不可接近的,会导致意想不到的行为,不优雅地降级。这不是"散布恐慌",而是很有道理的。
@如果我能回到过去,我就不会写这封信了,当然不会那么难缠。我改变了看法。如果您想要一个在单击时运行JS的元素,不要使用锚,只要通过JS和CSS附加一个处理程序就可以了。对不起,我冒犯了你。
@我又一次因为没看时间戳而犯规了……对不起,我把评论背到了前面。
"final return false;如果被调用的函数抛出错误,则不会执行。"->这个问题很容易解决,方法是在顶部使用e.preventDefault() ,而不是依赖返回值。多年来,这是最好的方法。我真的很困惑为什么人们仍然到处使用return false 。
你能告诉我更多关于href="javascript:void(0)" 和href="javascript:;" 的区别吗?
这个答案并不能解释为什么锚链接不起作用
在firefox中使用href="javascript:myFunc()" 将打开一个新选项卡,其中包含文本"javascript:myfunc()",而不是执行函数。
嗨,安东尼,我想问你从哪里学的javascript?哪种资源?我花了很多时间在文档上,但我学习不够。
如果您的唯一目的只是触发JS代码,那么不要使用 。用 代替。
我注意到,当我离开没有href 属性的a 标记时,浏览器会自动向它添加href="javascript:;" 。那么,我们可以不加href而不加href="javascript:void(0)" 或href="#" 的a 标签吗?
两者都不。
如果您可以有一个真正的有意义的URL,请将其用作href。如果有人点击你的链接打开一个新的标签或者他们禁用了javascript,onclick就不会触发。
如果这是不可能的,那么您至少应该使用JavaScript和适当的单击事件处理程序将定位标记注入到文档中。
我意识到这并不总是可能的,但在我看来,在开发任何公共网站时都应该努力做到这一点。
查看不引人注目的javascript和渐进式增强(都是维基百科)。
您能举个例子说明如何"使用javascript和适当的单击事件处理程序将锚标记插入文档中"?
如果仅仅是为了让元素被a)单击b)显示"指针"光标,那么为什么还要注入锚标记呢?在这种情况下,甚至注入锚标记似乎都无关紧要。
@挤压:如果您通过脚本注入元素,那么在禁用JS时,它将不存在。因为除非JS正在运行,否则它是完全断开的,所以除非JS正在运行,否则它甚至不应该存在。
@曹,我刚才也是这么说的……
@克鲁斯:当时的措辞很糟糕。看起来更像是"你为什么要这样做?"即使我再读一遍,仍然是这样。
+两者都不是,但有很多方法。事实上,使用javascript: 或# 都是不好的做法,不值得鼓励。不错的文章。
两个都不加1。我讨厌用鼠标中键打开空白的"javascript:void(0)"选项卡。
@Chao的意思是"如果不将锚标记用作锚标记,就完全没有必要使用锚标记。"我在质疑建议"使用javascript和适当的单击事件处理程序将锚标记插入文档"的逻辑。该句中的所有内容都是正确的,但不应使用锚标记。使用DIV、SPAN或其他内容。
@克鲁斯:我也不想用三角翼或跨距,坦率地说,这似乎正是 所设计的。但同意:如果没有合适的链接位置,它可能不应该是一个特定的 。
@潮扣也许是最好的选择。我认为主要的一点是,不应该基于HTML元素的默认表示外观来选择它,而是应该根据它对文档结构的重要性来选择它。
令人惊讶的是,投票率如此之高,以至于事件没有试图回答这个问题。
Link 或任何其他Link 做或是onclick 属性中包含了一个五年后,这是好的东西,但现在它可以坏的做法。这是为什么:
它在实践promotes obtrusive JavaScript,这已变成很难、很难保持表。这对JavaScript unobtrusive更多的在线。
你花费你的时间写作,这令人难以置信的详细代码欧弗利(北达科他州)有非常小(如有)codebase受益你。
有了更好的和更容易维护,和更多的可伸缩的方式,所需的accomplishing)的结果。
unobtrusive JavaScript的方式
Just Don’t有一个href 属性在所有!任何好的CSS重置会照顾缺失默认的光标样式,所以是非的问题。然后你使用JavaScript功能连接unobtrusive优美和最佳实践,更多的是维护你的stays JavaScript JavaScript中的逻辑,而不是在你的标记,这是必要的,当你开始发展大型的JavaScript应用程序,需要你的逻辑上是分裂成组件和温度blackboxed鲈。更多的在线,这在大型的javascript应用程序体系结构
简单的代码例子
1 2 3 4 5 6 7 8 9
// Cancel click event
$( '.cancel-action' ) .click ( function ( ) {
alert( 'Cancel action occurs!' ) ;
} ) ;
// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$( document.body ) .on ( 'hover' , 'a' , function ( ) {
$( this ) .toggleClass ( 'hover' ) ;
} ) ;
1 2
a { cursor: pointer; color: blue; }
a: hover, a.hover { text- decoration: underline; }
1 2
< script src= "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" >
Cancel this action
在blackboxed backbone.js例子
是可扩展的,blackboxed backbone.js组件的例子,这个例子jsfiddle在国有企业工作。注意如何使用JavaScript,我们的做法unobtrusive微小的量,和在组件的代码有一个重复的网页,可以在不影响或多次侧之间的冲突的不同的组件的实例。惊人的!
笔记
omitting href 的属性将导致在a 元到元的使用是不可访问tab 键导航。如果你想用这些元素是通过tab 访问键,你可以设置tabindex 属性,或使用button 元素相反。你可以很容易地元素风格的按钮链接到看起来像正常的tracker1回答中提到的。
omitting href a 元的属性将导致在Internet Explorer  ; ;Internet Explorer 6、 ; ;(7)不需要在a:hover 造型,这是为什么我们有一个简单的JavaScript添加到这个途径。a.hover accomplish垫片。这是一perfectly好吧,如果你不有一个href属性中的链接,然后你优美的退化和工作无论如何不会和你有一个担心的大问题。
如果你想你的工作与行动仍然禁用JavaScript,然后用一元与a href 属性,去一些网址,而不是表演的行动手动或通过一个Ajax请求也应走之路。如果你这样做,你要确保你对你的一event.preventDefault() 点击呼叫按钮,以确保当一clicked不跟它的链接。这一个被称为期权的优美的退化。
注意,关闭href属性与跨浏览器不兼容,您将在Internet Explorer中丢失悬停效果等内容。
我倾向于同意这个答案,但是还有一个问题是由于省略了href属性而引起的。在许多浏览器中,如果您快速地多次单击链接,它实际上会选择页面上的文本。设置href可以解决这个特别的问题,否则很难解决。
注意:这里建议的链接式button 方法受到IE9和更低版本中不可避免的"3d"活动状态的困扰。
我觉得这个答案过于武断。有时,您只想将JS行为应用到1或2 a href。在这种情况下,定义额外的CSS和注入整个JS函数是多余的。在某些情况下(例如,通过CMS添加内容),实际上不允许您注入新的CSS或独立的JS,而内联是您所能做的。我不知道内联解决方案在1或2个简单的JSA HREF的实践中是如何维护得更少的。总是怀疑关于坏实践的广泛的一般性声明,包括这一个:)
如果添加两个类(一个称为cancel 类,另一个称为action 类),那么只将css应用于.action 类,将javascript应用于.action.cancel 类就更合理了。
完全不同意。虽然我也推广不引人注目的javascript,但是一个锚具有"javascript:;"并且它的实际事件绑定到其他地方并不是一个坏的实践。它总是比完全忽略属性要好。
所有这些"注释"都很难解决(设置tabindex就是在复杂的页面上找麻烦!).只做javascript:void(0) 更好。这是务实的答案,也是现实世界中唯一合理的答案。
如果您关心让您的Web应用程序可访问(并且您应该这样做),那么简单和健全就需要使用href。疯狂就在tabindex的方向上。
缺少的href属性是一个问题。许多浏览器不显示链接鼠标光标(是的,它可以添加到CSS中,但这已经很复杂了),我看到一些辅助软件忽略没有href的链接(它们被视为文本)。这个答案有很好的想法,但现实世界并不那么整洁。
不,不,不!!!!别这样!你刚刚破坏了无障碍性。具有屏幕阅读器的用户将无法再使用您的应用程序。
我同意我的两张预告海报。如果没有href,您甚至无法使用选项卡浏览链接。应删除此答案!
根据sitepoint.com/community/t/anchors-without-href/6690/4,屏幕阅读器可以使用不使用href的锚。使用""实际上更糟糕,因为它添加了新的选项卡功能,该功能只将使用发送回顶部的原始页面,而没有所需的功能。
'#' 会把用户带回到页面的顶部,所以我通常使用void(0) 。
javascript:; 的行为也与javascript:void(0); 相似。
避免这种情况的方法是在onclick事件处理程序中返回false。
在事件处理程序中返回false并不能避免如果javascript JS不能成功运行。
使用"某个不存在的合唱团"效果很好,因为它无处可跳。
如果您有一个基HREF,那么# 或#something 将把您带到基HREF页上的锚,而不是当前页上的锚。
使用# 或void(0) 是不好的做法,不应鼓励。
shebang(#! )可以做到,但这绝对是不好的做法。
@NEEL,任何在文档中不存在的锚(如#_ )都会使用相同的技巧,但也有相同的缺点。
@Neel在Angular的第一个发行版上,作者在将脚本标签放在页面的最底部之前说了一些类似"最佳实践遵循必要性"的话。
我真诚地建议两者都不要。我会用一个风格化的 来表现这种行为。
1 2 3 4 5 6 7 8 9 10 11
button.link {
display: inline- block;
position: relative;
background- color: transparent;
cursor: pointer;
border: 0 ;
padding: 0 ;
color: #00f;
text- decoration: underline;
font: inherit;
}
1 2 3
< p>
A button that looks like a < button type= "button" class = "link" > link</ button> .
</ p>
这样就可以分配onclick。我还建议通过脚本绑定,不要在元素标记上使用onclick 属性。唯一的解决办法是在旧的IES中不能禁用psuedo 3D文本效果。
如果必须使用a元素,出于前面提到的原因,请使用javascript:void(0); 。
如果您的onclick事件失败,将始终拦截。
不会发生错误的加载调用,也不会根据哈希更改触发其他事件
如果单击失败(onclick引发),哈希标记可能会导致意外行为,除非它是适当的失败行为,并且您希望更改导航历史记录,否则请避免它。
注意:您可以将0 替换为一个字符串,例如javascript:void('Delete record 123') ,它可以作为一个额外的指示器,显示单击实际将执行的操作。
在IE8/IE9中,我无法删除按钮的:活动状态下的1px"3d"偏移量。
@布伦南罗伯茨是的,不幸的是,任何样式的按钮是更麻烦的与IE…我仍然觉得这可能是最合适的方法,而不是有时我不违反自己的规则。
那么,不要使用 ,而是使用input type=button ?
@Patrikaffentranger将与旧的IE版本有相同的问题…我已经使用了...</a> 方法,它足够有效…只是暗示用标记声明意图不太友好。
我用的是DIV 标签。造型简单,不必大惊小怪。
@tim DIV 不是语义的。
然后使用 元素。如果你愿意的话,也可以买一辆 。不幸的是,使用非标准标记或普通的DIV可能会使键盘用户难以聚焦元素。
这个答案应该在最前面。如果你有这样的困境,很可能你真的需要一个button 。幸运的是,IE9正迅速失去市场份额,1px的积极作用不应阻止我们使用语义加价。 是一个链接,它的目的是把你送到某个地方,为我们有 的行动。
第一个,最好有一个真正的链接,以防用户禁用了javascript。只要确保返回false,以防止在JavaScript执行时触发Click事件。
如果使用Angular2,则此方法有效:
Click me 。
请参阅此处https://stackoverflow.com/a/45465728/2803344
因此,在启用了javascript且该函数支持的用户代理中,运行一个javascript函数,返回到页面顶部的链接(对于JS因任何原因失败的用户代理而言)?这很少是明智的退步。
"理想情况下,如果用户禁用了javascript,那么将使用一个真正的链接来跟踪它",它应该转到一个有用的页面而不是,即使这只是一个解释,说明该站点需要JS才能工作。至于失败,我希望开发人员在部署之前使用适当的浏览器功能检测等。
我想(希望)像这样的东西只会显示一个弹出窗口或类似简单的东西。在这种情况下,默认值是弹出页面URL。如果这是Web应用程序的一部分,或者禁用JS将完全破坏页面,那么此代码还有其他问题…
我的网络应用程序设计得很好地降级,因此链接仍然是一个有用的页面。除非你的网络应用是一个聊天客户端或者是一些互动的东西,否则如果你把时间花在设计上,考虑到性能下降,这应该是可行的。
问题是,如果myjsfunc抛出了一个错误,它将不会因为返回false而被捕获。
# 的问题是,如果javascript由于某种特定的原因而不运行,它会中断,有时会非常严重(例如:如果页面上有一个base href,# 通常会将用户带到一个完全不同的页面)。另一方面,对于void(0) ,如果javascript有问题,它根本不会做任何事情。void(0) 的另一个好处是它消除了取消单击事件的任何必要性,因为单击事件很容易被忘记,并且不可能将多个观察者附加到事件上。
根据我的发现,你必须使用onclick="event.preventDefault(); myJsFunc(); return false;" 。
@abhibeckert两者都不正确,href应该包含一个可以用作回退的URL。很好的例子是使用javascript启动弹出窗口,使用href中的URL为弹出窗口供电,当禁用javascript时,链接将带您进入弹出窗口作为回退加载的页面。
@理论上说,Lankymart不错,但在现实世界中,有很多情况下没有回退URL。例如,此注释框上的"取消"按钮没有回退。StackOverflow已选择根本不具有a href属性。这使得它根据HTML规范无效,并且在旧浏览器中也会引起一些小错误(它们将其视为一个锚而不是一个可点击的元素)。
@这是一个令人信服的原因,因为?只是因为别人这样做并不意味着你必须遵循我的观点,你有权得到你的。
就个人而言,@fczbkk和stevenpaulo的方法都更好,不管链接是否有超链接,你都应该适应那些没有javascript的用户浏览你的网站,并且优雅地降低你认为合适的等级。
@我的工钱是以每小时100美元的价格付给客户的。如果我要让我当前项目中的每个javascript链接在没有javascript的情况下工作,它将花费大约30万美元(有数千个这样的链接)。没有足够的人访问这个网站来证明费用的合理性。相反,我们会简单地告诉他们"哦,除非你打开javascript,否则这个按钮是不起作用的。"到目前为止,我们还没有任何抱怨。我总是在实际操作时放一个回退,但通常它根本不值得。与大多数事情一样,您应该了解每个解决方案的优缺点,并做出适当的选择。
如果你问我也不知道;
如果您的"链接"的唯一目的是运行一些javascript代码,那么它不属于链接;而是一段带有与之耦合的javascript函数的文本。我建议使用一个 标记,附加一个onclick handler 和一些基本的css来导入链接。链接是用于导航的,如果您的javascript代码不是用于导航的,那么它不应该是一个 标记。
例子:
1
function callFunction( ) { console.log ( "function called" ) ; }
1 2 3 4 5
.jsAction {
cursor: pointer;
color: #00f;
text- decoration: underline;
}
1 2 3
< p>
I want to call a JavaScript function < span class = "jsAction" onclick= "callFunction();" > here</ span> .
</ p>
此方法将"链接"限制为仅鼠标操作。可以通过键盘访问锚,当按下Enter键时,它的"onclick"事件被激发。
在CSS中硬编码颜色将阻止浏览器使用用户可能定义的自定义颜色,这可能是辅助功能的问题。
它们归结为使用跨度或锚标记的语义相同。如果页面URL只能在javascript中生成,那么除了所指出的锚标记可以使用键盘导航之外,它在运行的位置上没有区别。
s不打算做任何事情。用 nchors和 来做这个!
使用buttons 是更好的选择,而使用span 则不是。
我认为跨度比锚标签好。锚标记的存在是为了将您引导到其强制的href属性。如果您不想使用href,请不要使用锚。它不限制链接到鼠标,只是因为它不是链接。它没有a href。这更像是一个按钮,但它不张贴。不打算做任何事情的跨度是完全无效的。考虑一个当你悬停时激活的下拉菜单。它可能是跨距和div的组合,执行按钮的功能,扩展屏幕上的一个区域。
@但是对于屏幕阅读器或可访问的浏览器来说, 是没有意义的,不是吗?
从设计的角度来看,使用buttons 经常是一个糟糕的主意,它可以触发一个网站小部分的显示/隐藏属性,特别是在有很多这样的触发器的情况下。如果不是某种控制面板,一个地方的许多按钮通常看起来很糟糕。如前所述,锚也不是设计为JS触发器。因此,span 或者甚至可能是div 看起来是一个更好的替代品,有自己的缺点,但仍然更好。世界上没有比href 属性中的一些胡言乱语更糟糕的了。而且,span 比任何东西都能更好地处理中间点击。
我这样做是为了解决用户没有被引导到某个地方的情况,例如,打开一个模式。很好,因为中间的按钮不会默认为尝试在新的选项卡中打开链接。如果我有导航用户的东西,并且允许他们在新的选项卡中打开它,我使用一个链接(a 标记和href),这样用户可以用鼠标中键或ctrl+单击轻松打开新的选项卡。如果我有导航用户的东西,我不希望他们打开多个选项卡,那么按钮方法就可以工作。
理想情况下,您可以这样做:
或者,更好的是,在HTML中有默认的操作链接,并且在DOM呈现后通过javascript将onclick事件无障碍地添加到元素中,从而确保如果不存在/使用javascript,则不会有无用的事件处理程序清除代码,并可能混淆(或至少分散)实际的内容。
只使用# 会产生一些有趣的动作,因此如果您想节省JavaScript bla, bla, 的打字工作量,我建议使用#self 。
哇,竖起大拇指听这个提示。不知道您可以将#self 用于命名标签,并避免跳到页面顶部的烦人浏览器行为。谢谢您。
作为参考,#self 似乎并不特别。任何与文档中任何元素的名称或ID不匹配的片段标识符(不为空或"top")都应具有相同的效果。
我通常只是使用一个虚构的锚名,但我想我将开始这样做,以在我的工作中保持一致。
我建议在另一条评论中建立#void 公约,但实际上#self 很短,很容易记忆。任何东西都比# 好。
但是如果你点击这个链接,用户会很奇怪地看到URL中的"无效",看起来和错误或bug一样,与"自我"或其他类似。
我用下面的
相反
我使用javascript: (没有分号),因为它在悬停状态栏中看起来最整齐。
这段代码可能会在旧的IE中引起不好的惊喜。在某个时候,它用来破坏任何动画效果,包括翻滚,甚至动画gif:groups.google.com/forum/!主题/comp.lang.javascript/&hellip;
你总是可以…javascript:void('Do foo') 由于void将返回undefined,不管怎样,它将向用户提供一个指示,指示单击将要做什么。其中Do foo 可以是Delete record X 或任何你喜欢的。
我同意其他建议,即应该在href 属性中使用常规URL,然后在onclick中调用一些javascript函数。缺点是,他们会在通话后自动添加return false 。
这种方法的问题是,如果功能不起作用或者出现任何问题,链接将变得不可点击。onclick事件将始终返回false ,因此不会调用正常的URL。
有非常简单的解决方案。如果函数工作正常,则让函数返回true 。然后使用返回值确定是否应取消单击:
JavaScript
1 2 3 4
function doSomething( ) {
alert( 'you clicked on the link' ) ;
return true ;
}
HTML
注意,我否定了doSomething() 函数的结果。如果成功,它将返回true ,因此它将被否定(false ),而不会调用path/to/some/URL 。如果函数将返回false (例如,浏览器不支持在函数中使用的某个内容,或者有任何其他错误),则会对true 进行否定,并调用path/to/some/URL 。
# 比javascript:anything 好,但以下更好:
HTML:
JavaScript:
1 2 3
$( function ( ) {
$( ".some-selector" ) .click ( myJsFunc) ;
} ) ;
您应该一直努力实现优雅的降级(如果用户没有启用javascript……以及当它具有规范时)。和预算)。另外,直接在HTML中使用javascript属性和协议也被认为是不好的形式。
除非您使用javascript编写链接(这样您就知道它在浏览器中启用了),否则理想情况下,您应该为禁用了javascript的浏览者提供适当的链接,然后在onclick事件处理程序中阻止链接的默认操作。这样,那些启用了javascript的用户将运行函数,而那些禁用了javascript的用户将跳转到一个适当的页面(或同一页面中的位置),而不仅仅是单击链接,什么都不会发生。
我建议使用 元素,特别是当控件应该产生数据更改时。(有点像一根柱子。)
如果不引人注目地注入元素(一种渐进增强),效果会更好。(请参阅此注释。)
我也认为这是最好的解决办法。如果您有一个元素打算执行一个操作,那么它就没有理由是链接。
如果你问,你的href看起来像"某物",其他列出的一些答案可能有用,但是:如果没有链接到任何合理的东西,就没有必要有一个href,甚至连一个链接都没有。建议使用button可以,也可以使用除链接之外的任何其他元素。
这的另一个优点是引导.btn 使按钮和链接看起来完全相同。
当然,hash(# 更好,因为在javascript中它是一个伪方案:
污染历史
实例化引擎的新副本
在全局范围内运行,不尊重事件系统。
当然,使用onclick处理程序来防止默认操作的""更好。此外,只有一个目的是运行javascript的链接并不是真正的"链接",除非您在出错时将用户发送到页面上某个合理的锚(只是发送到顶部)。您可以简单地模拟样式表链接的外观和感觉,并完全忘记href。
此外,对于Cowgod的建议,尤其是:...href="javascript_required.html" onclick="... 这是一个很好的方法,但它没有区分"禁用javascript"和"onclick失败"的情况。
@Berker Y&252;Ceer,为什么是CW?
我通常去
它比javascript:void(0)短,并且做同样的事情。
我会用:
原因:
这使得href 变得简单,搜索引擎需要它。如果您使用任何其他内容(如字符串),则可能导致404 not found 错误。
当鼠标悬停在链接上时,它不会显示它是一个脚本。
使用return false; 时,页面不会跳到顶部或破坏back 按钮。
我不同意"1",因为在不允许脚本的情况下,当您放置您的脚本链接时,它会给出错误。所以这种链接应该与JS代码一起添加。这样人们就可以在不允许使用脚本的情况下避免这些链接,并且根本看不到任何错误。
我选择使用javascript:void(0) ,因为使用它可以防止右键单击打开内容菜单。但是,javascript:; 比较短,并且做同样的事情。
因此,当您使用 标记执行一些javascript操作时,如果您也放置了href="#" ,则可以在事件结束时添加return false(在内联事件绑定的情况下),例如:
或者可以使用javascript更改href属性,例如:
或
但是从语义上讲,上述实现这一点的所有方法都是错误的(尽管它工作得很好)。如果没有创建任何元素来导航页面,并且其中有一些与之相关联的javascript内容,那么它不应该是 标记。
您可以简单地使用 ,而不是根据您的需要来做一些事情或任何其他元素,如b、span或任何适合您的元素,因为您可以在所有元素上添加事件。
因此,使用 有一个好处。在执行a href="#" 操作时,默认情况下会在该元素上获得光标指针。为此,我认为您可以使用CSS进行类似于cursor:pointer; 的操作,这也解决了这个问题。
最后,如果您是从javascript代码本身绑定事件,那么如果您使用 标记,那么可以使用event.preventDefault() 来实现这一点,但是如果您不使用 标记来实现这一点,那么就有了一个优势,您不需要这样做。
所以,如果你看到了,最好不要在这种东西上使用标签。
最好使用jquery,
1 2 3
$( document) .ready ( function ( ) {
$( "a" ) .css ( "cursor" , "pointer" ) ;
} ) ;
省略href="#" 和href="javascript:void(0)" 。
定位标记标记将类似于
够简单了!
这就是我要说的。如果链接有一个有意义的回退URL,请使用它。否则,只需省略href或使用比a更合适的语义。如果每个人都主张包括href在内的唯一原因是让手指悬停,那么一个简单的"a光标:指针;"就可以做到这一点。
我可以说这是我决定要做的选择吗?例如,检查"标志"链接。
这使得交通非常方便。试一试,这样:不使用鼠标就不能标记帖子。选项卡可以访问"链接"和"编辑"链接,但"标记"不能访问。
为什么使用jquery而不是css a_cursor:pointer;
我同意这个选择。如果锚除了javascript没有其他用途,那么它不应该有a href。@fatih:使用jquery意味着如果禁用javascript,链接将没有指针。
如果您要走这条路线,为什么不使用jquery绑定click呢?使用jquery的一个好处是能够将JavaScript与标记分离。
我不敢相信这个答案有11票。太可怕了。为什么要通过javascript(和jquery)添加样式??),然后用HTML定义onclick操作?可怕的。
最好向主体添加一个js 类,让css处理css。body.js a{cursor: pointer;}
不要只为了运行javascript而使用链接。
使用href=""会将页面滚动到顶部;使用void(0)会在浏览器中产生导航问题。
相反,使用链接以外的元素:
1
< span onclick= "myJsFunc()" class = "funcActuator" > myJsFunc</ span>
并使用CSS设置样式:
1 2 3 4 5 6 7
.funcActuator {
cursor: default ;
}
.funcActuator : hover {
color: #900 ;
}
使用按钮,而不是跨度。按钮自然按焦点顺序排列,因此无需鼠标/触摸板等即可访问。
加上TonQuentin的评论:正如目前所写,键盘用户不会接触到span 元素,因为它是一个不可聚焦的元素。所以你需要一个按钮。
您可以通过将tabindex="0" 添加到跨度中使其可聚焦。也就是说,使用按钮更好,因为它可以免费为您提供所需的功能。要使用范围使其可访问,您不仅需要附加一个单击处理程序,还需要一个键盘事件处理程序来查找按空格键或Enter键,然后激发普通的单击处理程序。您还需要将第二个css选择器更改为.funcActuator:hover, .funcActuator:focus ,这样元素具有焦点的事实就显而易见了。
如果您碰巧使用AngularJS,可以使用以下选项:
1
Do some fancy JavaScript
什么都做不了。
此外
它不会把你带到页面的顶部,就像()那样
因此,不需要使用javascript显式返回false 。
它简短而简洁
但这会导致页面重新加载,而且由于我们总是使用JavaScript来修改页面,所以这是不可接受的。
@Henryhu我发现它没有重新加载的原因是因为AngularJS。查看我更新的答案。
通常,您应该始终有一个回退链接,以确保禁用javascript的客户机仍然具有某些功能。这个概念被称为不引人注目的javascript。
例子。。。假设您有以下搜索链接:
您可以始终执行以下操作:
1 2 3 4 5 6 7 8 9
var link = document.getElementById ( 'searchLink' ) ;
link.onclick = function ( ) {
try {
// Do Stuff Here
} finally {
return false ;
}
} ;
这样,禁用javascript的人将被定向到search.php ,而使用javascript的查看者将查看增强的功能。
如果没有href ,可能没有理由使用锚标记。
您可以在几乎每个元素上附加事件(单击、悬停等),那么为什么不直接使用span 或div ?
对于禁用了javascript的用户:如果没有回退(例如,一个可选的href ,他们至少应该无法看到该元素并与之交互,不管它是 或 标记。
我用开发工具在Google Chrome上都试过了,id="#" 用了0.32秒。而Javascript:void(0) 法只需0.18秒。所以在Google Chrome中,Javascript:void(0) 工作得越来越快。
根据您想要完成的任务,您可以忘记onclick,只需使用href:
它绕过了返回错误的需要。我不喜欢# 选项,因为正如前面提到的,它将把用户带到页面的顶部。如果你有其他地方可以发送给用户,如果他们没有启用javascript(这在我工作的地方很少见,但这是一个很好的主意),那么Steve提出的方法非常有效。
最后,如果您不想让任何人去任何地方,也不想调用javascript函数,那么可以使用javascript:void(0) 。如果你有一个想要鼠标悬停事件发生的图像,它会很好地工作,但是没有任何东西可以让用户点击。
唯一的缺点(从记忆中,我可能是错的)是,如果你没有一个a href在里面的话,我不认为a是a。(所以CSS规则不起作用)
惊喜。
我相信你提出了一个错误的二分法。这不是唯一的两个选择。
我同意d4v360先生的观点,他建议,即使您使用的是锚标签,您在这里也没有真正的锚。您所拥有的只是文档的一个特殊部分,它的行为应该略有不同。 标签更合适。
另外,如果要用span 替换a ,则需要记住通过键盘使其可调焦。
当我有几个人造链接时,我宁愿给他们一个"无链接"类。
然后在jquery中,我添加了以下代码:
1 2 3 4 5
$( function ( ) {
$( '.no-link' ) .click ( function ( e) {
e.preventDefault ( ) ;
} ) ;
} ) ;
对于HTML,链接只是
我不喜欢使用散列标记,除非它们被用于锚定,并且我只在有两个以上的人造链接时才使用上面的标记,否则我使用javascript:void(0)。
通常,我喜欢完全避免使用链接,只是在一个范围内包装一些东西,并将其用作激活一些JavaScript代码的方法,如弹出窗口或内容显示。
我个人结合使用它们。例如:
HTML
有点jquery
1
$( 'a[href="#"]' ) .attr ( 'href' , 'javascript:void(0);' ) ;
或
1 2 3
$( 'a[href="#"]' ) .click ( function ( e) {
e.preventDefault ( ) ;
} ) ;
但我使用它只是为了防止当用户点击一个空锚时页面跳到顶部。我很少在HTML中直接使用onclick和其他on 事件。
我的建议是使用 元素和class 属性,而不是锚。例如:
1
< span class = "link" > Link</ span>
然后将该函数赋给.link ,脚本包装在主体中,正好位于