it-swarm.cn

我应该将哪个的“href”值用于JavaScript的链接,“#”或“的javascript:无效(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>
3863
2cBGj7vsfp

我用javascript:void(0)

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

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

但是他们忘记在onclick中使用return doSomething()并且只使用doSomething()

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

第三个原因是存在动态分配onclick事件属性的情况。我更喜欢能够调用函数或动态分配它,而不必专门为一种附件或其他方法编写函数。因此,HTML标记中的onclick(或任何内容)如下所示:

onclick="someFunc.call(this)"

OR

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

使用javascript:void(0)避免了上述所有问题,我没有找到任何缺点的例子。

因此,如果您是一名独立开发人员,那么您可以明确地做出自己的选择,但如果您以团队形式工作,则必须说明:

使用href="#",确保onclick最后总是包含return false;,任何被调用的函数都不会抛出错误,如果你动态地将函数附加到onclick属性,请确保不抛出错误它返回false

OR

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

第二个显然更容易沟通。

2091
AnthonyWJones

都不是。

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

如果那是不可能的,那么您至少应该使用JavaScript和相应的单击事件处理程序将锚标记注入到文档中。

我意识到这并不总是可行,但在我看来,应该努力开发任何公共网站。

退房不引人注目的JavaScript渐进增强(两者都是维基百科)。

1251
Aaron Wagner

<a href="#" onclick="myJsFunc();">Link</a><a href="javascript:void(0)" onclick="myJsFunc();">Link</a>或其他任何包含onclick属性的东西 - 五年前还可以,但现在它可能是一个不好的做法。原因如下:

  1. 它促进了突兀的JavaScript的实践 - 这已经证明难以维护并且难以扩展。更多关于不引人注意的JavaScript

  2. 你花时间编写令人难以置信的过于冗长的代码 - 这对你的代码库有很小的(如果有的话)好处。

  3. 现在有更好,更容易,更可维护和可扩展的方法来实现所需的结果。

不引人注目的JavaScript方式

只是没有href属性!任何好的CSS重置都会处理缺少的默认光标样式,因此这不是问题。然后使用优雅且不显眼的最佳实践附加您的JavaScript功能 - 当您的JavaScript逻辑保留在JavaScript而不是标记中时,这些实践更易于维护 - 这在您开始开发需要将逻辑拆分为大型JavaScript应用程序时非常重要黑盒子组件和模板。更多关于大规模JavaScript应用程序架构

简单的代码示例

// 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');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

BlackboxedBackbone.jsexample

对于可扩展的黑盒子Backbone.js组件示例 - 请参见此工作的jsfiddle示例。请注意我们如何利用不引人注目的JavaScript实践,并且在少量代码中有一个组件可以在页面上重复多次,而不会在不同的组件实例之间产生副作用或冲突。惊人!

笔记

  • 省略href元素上的a属性将导致使用tab键导航无法访问该元素。如果希望通过tab键访问这些元素,可以设置tabindex属性,或使用button元素。您可以轻松地将按钮元素设置为看起来像普通链接,如Tracker1的答案中所述。

  • 省略href元素上的a属性将导致 Internet Explorer 6Internet Explorer 7 不采用a:hover样式,这就是为什么我们通过a.hover添加了一个简单的JavaScript填充程序来完成此操作。这是完全没问题的,好像你没有href属性并且没有优雅的降级那么你的链接无论如何也无法正常工作 - 你会有更大的问题需要担心。

  • 如果您希望您的操作仍然可以禁用JavaScript,那么使用带有a属性的href元素,该属性将转到某个URL,该URL将手动执行操作,而不是通过Ajax请求或任何应该去的方式。如果您这样做,那么您希望确保在点击通话中执行event.preventDefault()以确保单击该按钮时它不会跟随该链接。此选项称为优雅降级。

758
balupton

'#'会将用户带回到页面顶部,所以我通常会使用void(0)

javascript:;的行为也像javascript:void(0);

302
Adam Tuttle

老实说我也不建议。我会使用程式化的<button></button>来表示这种行为。

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

这样您就可以分配您的onclick。我还建议通过脚本绑定,而不是使用元素标记上的onclick属性。唯一的问题是旧的IE中的psuedo 3d文本效果无法禁用。


如果您 _必须_ 使用A元素,请使用javascript:void(0);,原因已在前面提到过。

  • 如果您的onclick事件失败,将始终拦截。
  • 不会发生错误的加载调用,或者根据哈希更改触发其他事件
  • 如果点击通过(onclick throws),哈希标记可能会导致意外行为,除非它是适当的直通行为,并且您想要更改导航历史记录,否则可以避免它。

注意:您可以使用javascript:void('Delete record 123')等字符串替换0,这可以作为一个额外的指示符来显示点击实际上会做什么。

244
Tracker1

第一个,理想情况下,如果用户禁用了JavaScript,可以使用真实链接。只需确保返回false以防止在JavaScript执行时触发click事件。

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

如果您使用Angular2,这种方式有效:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>

见这里 https://stackoverflow.com/a/45465728/2803344

136
Zach

如果你问我我也不会;

如果您的“链接”的唯一目的是运行某些JavaScript代码,则它不符合链接条件;而是一段带有JavaScript功能的文本。我建议使用附加了<span>onclick handler标记和一些基本的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>
95
fijter

理想情况下你会这样做:

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

或者,更好的是,你在HTML中有默认的动作链接,你可以在DOM渲染后通过JavaScript不加干扰地将onclick事件添加到元素中,从而确保如果不存在/利用JavaScript你就不会让无用的事件处理程序摆脱你的代码,并可能使你的实际内容混淆(或至少分散注意力)。

95
Steve Paulo

仅使用#会产生一些有趣的动作,所以如果你想节省#self的打字工作,我建议使用JavaScript bla, bla,

75
Spammer Joe

我使用以下内容

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

代替

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

我同意其他地方的建议,说明你应该在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

53
Fczbkk

#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属性和协议被认为是不好的形式。

50
Justin Johnson

除非您使用JavaScript写出链接(因此您知道它已在浏览器中启用),否则理想情况下应为正在使用JavaScript进行浏览的人提供正确的链接,然后阻止onclick中链接的默认操作事件处理程序这样,启用JavaScript的人将运行该功能,禁用JavaScript的人将跳转到适当的页面(或同一页面内的位置),而不是仅仅点击链接并且没有任何反应。

38
Simon Forrest

我推荐使用<button>元素, 尤其 如果控件应该产生数据的变化。 (像POST一样。)

如果你不引人注意地注入元素,这是一种渐进增强,那就更好了。 (见 此评论 。)

37
phyzome

绝对散列(#)更好,因为在JavaScript中它是一个伪节点:

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

当然,使用onclick处理程序来防止默认操作的“#”更好。此外,唯一目的是运行JavaScript的链接并不是真正的“链接”,除非您在发生错误时将用户发送到页面上的某个合理的锚点(只是#将发送到顶部)。您可以简单地模拟与样式表链接的外观和感觉,完全忘记href。

另外,关于cowgod的建议,尤其是:...href="javascript_required.html" onclick="...这是一个很好的方法,但它不区分“禁用JavaScript”和“onclick失败”场景。

35
Free Consulting

我经常去

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

它比javascript:void(0)短并且做同样的事情。

30
dnetix

我会用:

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

理由:

  1. 这使得href简单,搜索引擎需要它。如果您使用其他任何东西(例如字符串),可能会导致404 not found错误。
  2. 当鼠标悬停在链接上时,它不会显示它是一个脚本。
  3. 通过使用return false;,页面不会跳转到顶部或打破back按钮。
27
Eric Yin

我选择使用javascript:void(0),因为使用它可能会阻止右键单击打开内容菜单。但javascript:;更短,并做同样的事情。

25
user564706

所以,当你使用<a />标签做一些JavaScript事情时,如果你也放了href="#",你可以添加 返回false 在事件结束时 (在内联事件绑定的情况下) 喜欢:

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

或者您可以使用以下JavaScript更改 href 属性:

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

要么

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

但从语义上讲,上述所有实现此目的的方法都是错误的 (虽然它可以正常工作) 。如果没有创建任何元素来导航页面并且有一些与之关联的JavaScript事物,则它不应该是<a>标记。

您可以简单地使用<button />来执行操作或任何其他元素,如b,span或根据您的需要适合的任何元素,因为您可以在所有元素上添加事件。


所以 有一个好处 使用<a href="#">。当你执行a href="#"时,默认情况下会在该元素上获得光标指针。为此,我认为你可以像cursor:pointer;一样使用CSS来解决这个问题。

最后,如果您从JavaScript代码本身绑定事件,那么如果您使用<a>标记,则可以执行event.preventDefault()来实现此目的,但如果您没有使用<a>标记,那么您将获得优势,你不需要这样做。

所以,如果你看到,最好不要在这类东西上使用标签。

23
Ashish Kumar

使用jQuery会更好

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

并省略href="#"href="javascript:void(0)"

锚标记标记就像

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

很简单!

22
naveen

不要仅为了运行JavaScript而使用链接。

使用href =“#”将页面滚动到顶部; void(0)的使用会在浏览器中产生导航问题。

相反,使用链接以外的元素:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

并使用CSS设置样式:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}
22
Garrett

如果你碰巧使用 AngularJS ,你可以使用以下内容:

<a href="">Do some fancy JavaScript</a>

哪个不会做任何事情。

此外

  • 它不会带你到页面的顶部,就像(#)[。_____。]
    • 因此,您不需要使用JavaScript显式返回false
  • 它简洁而简洁
20
whirlwin

通常,您应始终使用后备链接以确保禁用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的查看器会查看您的增强功能。

19
Andrew Moore

如果没有href,则可能没有理由使用锚标记。

您可以在几乎每个元素上附加事件(单击,悬停等),那么为什么不使用spandiv

对于禁用JavaScript的用户:如果没有回退(例如,替代href),他们至少应该无法查看该元素并与之交互,无论它是<a>还是<span>标记。

18
achairapart

我相信你提出了一个错误的二分法。这些不是唯一的两个选择。

我同意D4V360先生的建议,即使你使用锚标签,你也不会真正拥有锚。您所拥有的只是文档的特殊部分,其行为应略有不同。 <span>标签更合适。

16
Clever Human

我使用开发人员工具在谷歌浏览器中尝试过,而id="#"花了0.32秒。虽然javascript:void(0)方法只花了0.18秒。所以在谷歌浏览器中,javascript:void(0)工作得越来越好。

16
user6460587

根据你想要完成的任务,你可以忘记onclick并只使用href:

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

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

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

最后,如果您不希望任何人去任何地方并且您不想调用JavaScript函数,则可以使用javascript:void(0)。如果您有想要发生鼠标悬停事件的图像,它会很有效,但用户无需点击任何内容。

16
Will Read

当我有几个虚假链接时,我更喜欢给他们一类'无链接'。

然后在jQuery中,我添加以下代码:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

对于HTML,链接很简单

<a href="/" class="no-link">Faux-Link</a>

我不喜欢使用Hash-Tags,除非它们用于锚点,而且当我有两个以上的虚假链接时我只做上述操作,否则我会使用javascript:void(0)。

<a href="javascript:void(0)" class="no-link">Faux-Link</a>

通常情况下,我喜欢完全避免使用链接,只是在一个范围内包装一些东西,并将其用作一种活动某些JavaScript代码的方式,如弹出窗口或内容显示。

16

我个人将它们组合使用。例如:

HTML

<a href="#">Link</a>

一点点jQuery

$('a[href="#"]').attr('href','javascript:void(0);');

要么

$('a[href="#"]').click(function(e) {
   e.preventDefault();
});

但我正在使用它只是为了防止页面在用户点击空锚时跳到顶部。我很少直接在HTML中使用onClick和其他on事件。

我的建议是使用<span>元素和class属性而不是锚点。例如:

<span class="link">Link</span>

然后将函数分配给.link,其中包含一个包含在正文中的脚本,就在</body>标记之前或外部JavaScript文档中。

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

*注意: 对于动态创建的元素,请使用:

$('.link').on('click', function() {
    // do something
});

对于使用动态创建的元素创建的动态创建的元素,请使用:

$(document).on('click','.link', function() {
    // do something
});

然后你可以将span元素设置为看起来像一个带有一点CSS的锚点:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

这是一个jsFiddle上述例子。

13
mdesdev

我基本上是用 这个实用的文章使用渐进增强 解释。 简短的回答是你永远不会使用javascript:void(0);#,除非你的用户界面已经推断出JavaScript已经启用,在这种情况下你应该使用javascript:void(0);。另外,不要使用span作为链接,因为从语义上来说这是错误的。

在应用程序中使用 _ seo _ 友好URL路由,例如/ Home/Action/Parameters也是一种很好的做法。如果您有一个指向不使用JavaScript的页面的链接,那么您可以在以后增强体验。使用指向工作页面的真实链接,然后添加onlick事件以增强演示。

这是一个例子。 Home/ChangePicture是一个页面上的表单的工作链接,其中包含用户界面和标准HTML提交按钮,但它看起来更好,注入了带有jQueryUI按钮的模态对话框。无论哪种方式都可以,取决于浏览器,它满足移动优先开发。

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>
13
Josh Simerman

您还可以在锚中写一个提示,如下所示:

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

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

11
Lukom

我想说最好的方法是将一个href锚点转换为你永远不会使用的ID,比如#Do1Not2Use3This4Id5或类似的ID,你100%肯定没有人会使用它并且不会冒犯别人。

  1. Javascript:void(0)是一个坏主意,违反了启用CSP的HTTPS页面上的内容安全策略 https://developer.mozilla.org/en/docs/Security/CSP (感谢@ jakub.g)
  2. 仅使用#将使用户在按下时跳回到顶部
  3. 如果未启用JavaScript,则不会破坏页面(除非您有JavaScript检测代码
  4. 如果启用了JavaScript,则可以禁用默认事件
  5. 你必须使用href,除非你知道如何阻止你的浏览器选择一些文本,(不知道使用4将删除阻止浏览器选择文本的东西)

基本上没有人在本文中提到5我认为很重要,因为如果你的网站突然开始选择链接周围的东西,你的网站就会变得不专业。

11
Anders M.

很高兴让禁用JavaScript的用户可以访问您的网站,在这种情况下,href指向一个执行与正在执行的JavaScript相同的操作的页面。否则我使用“”和“return false;”来阻止默认操作(滚动到页面顶部),正如其他人提到的那样。

谷歌搜索“javascript:void(0)”提供了很多关于这个主题的信息。其中一些,比如 这一个 提到原因 不使用void(0)

10
mmacaulay

对于想要继续使用href#值的人,我看到很多答案,因此,这是一个有希望满足两个阵营的答案:

A) 我很高兴将javascript:void(0)作为我的href值:

<a href="javascript:void(0)" onclick="someFunc.call(this)">Link Text</a>

B) 我正在使用jQuery,并希望#作为我的href值:

<a href="#" onclick="someFunc.call(this)">Link Text</a>

<script type="text/javascript">
    /* Stop page jumping when javascript links are clicked.
       Only select links where the href value is a #. */
    $('a[href="#"]').live("click", function(e) {
         return false; // prevent default click action from happening!
         e.preventDefault(); // same thing as above
    });
</script>

注意,如果您知道不会动态创建链接,请使用click函数:

$('a[href="#"]').click(function(e) {

9
dazbradbury

这里还有一件重要的事情需要记住。 第508条 遵守。因此,我觉得有必要指出你需要屏幕阅读器的锚标签,如 _ jaws _ 能够通过标签对焦。因此解决方案“只使用JavaScript并忘记锚定开始”不是其中一些选项。只有当你无法让屏幕跳回到顶部时,才需要在href内部启动JavaScript。您可以将settimeout用于0秒并将JavaScript激发到您需要关注的位置,但即使是apage也会跳到顶部然后再返回。

9
rcof

我使用href =“#”作为我想要虚拟行为的链接。然后我使用这段代码:

$(document).ready(function() {
    $("a[href='#']").click(function(event) {
        event.preventDefault();
    });
});

这意味着如果href等于散列(* =“#”),它会阻止默认链接行为,因此仍然允许您为其编写功能,并且它不会影响锚点击。

9
Vinny Fonseca

我从你的话中理解的是,你想创建一个链接来运行JavaScript代码。

然后你应该考虑有人在他们的浏览器中阻止JavaScript。

因此,如果您真的要仅使用该链接来运行JavaScript函数,那么您应该动态添加它,这样如果用户没有在浏览器中启用它们并且您正在使用该链接,那么它甚至都不会被看到触发一个JavaScript函数,在浏览器中禁用JavaScript时使用类似的链接是没有意义的。

因此,当禁用JavaScript时,它们都不好。

如果启用了JavaScript,您只想使用该链接来调用JavaScript函数

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

比使用更好的方式

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

因为href =“#”将导致页面执行不需要的操作。

另外,<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>优于<a href="#" onclick="myJsFunc();">Link</a>的另一个原因是JavaScript被用作大多数浏览器的默认脚本语言。作为Internet Explorer的示例,使用onclick属性来定义将使用的脚本语言的类型。除非弹出另一种优秀的脚本语言,否则Internet Explorer也将使用JavaScript作为默认语言,但如果另一种脚本语言使用javascript:,则可以让Internet Explorer了解正在使用的脚本语言。

考虑到这一点,我更喜欢使用和锻炼

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

足以使它成为习惯并且更加用户友好,请在JavaScript代码中添加这种链接:

$(document).ready(function(){
    $(".blabla").append('<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>')
});
8
Berker Yüceer

您可以使用href并删除所有只有哈希的链接:

HTML:

<a href="#" onclick="run_foo()"> foo </a>

JS:

$(document).ready(function(){         // on DOM ready or some other event

   $('a[href=#]').attr('href','');    // set all reference handles to blank strings
                                      //  for anchors that have only hashes

});
8
vol7ron

为什么不用这个呢?这不会向上滚动页面。

<span role="button" onclick="myJsFunc();">Run JavaScript Code</span>
8
AlxGol

理想情况下,您应该有一个真正的URL作为非JavaScript用户的后备。

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

7
Peter

完全符合整体情绪,在需要时使用void(0),并在需要时使用有效的URL。

使用 URL重写 您可以创建不仅可以执行禁用JavaScript操作的URL,还可以告诉您它将要执行的操作。

<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解析。

我相信那里有更多的缺点。随意讨论它们。

7
user394888

在现代网站上,如果元素仅执行JavaScript功能(不是真实链接),则应避免使用href。

为什么?此元素的存在告诉浏览器这是一个与目标的链接。这样,浏览器将显示“在新选项卡/窗口中打开”功能(当您使用shift +单击时也会触发)。这样做会导致打开同一页面而不会触发所需的功能(导致用户受挫)。

关于IE:从IE8开始,如果设置了doctype,则元素样式(包括悬停)可以工作。其他版本的IE不再需要担心了。

只有缺点:删除HREF会删除tabindex。为了解决这个问题,您可以使用一个样式为链接的按钮或使用JS添加tabindex属性。

7
TomDK

如果您使用<a>元素,只需使用:

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

我个人稍后会使用JavaScript附加一个事件处理程序(使用attachEventaddEventListener或者也可以<将您喜欢的JavaScript框架放在这里>)。

7
Pablo Cabrera

不要忽视您的URL可能是必要的事实 - 在遵循引用之前触发onclick,因此有时您需要在导航离开页面之前处理客户端。

7
nathaniel

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

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

在JavaScript不可用的情况下,我会使用href到当前URL,也许是锚点到链接的位置。该页面仍可供没有JavaScript的人使用,他们不会注意到任何差异。

正如我要掌握的,这里有一些jQuery可能会有所帮助:

var [functionName] = function() {
   // do something
};

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

如果 你使用一个链接作为 只是 执行一些JavaScript代码(而不是使用像D4V360这样的跨度强烈建议),只需:

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

如果您使用带onclick的链接进行导航,请不要在JavaScript关闭时使用href =“#”作为后备。当用户点击链接时,通常会非常烦人。相反,如果可能,提供onclick处理程序将提供的相同链接。如果您不能这样做,请跳过onclick并在href中使用JavaScript URI。

6
Shadow2531

我非常希望尽可能地将我的JavaScript保留在HTML标记之外。如果我使用<a>作为点击事件处理程序,那么我建议使用<a class="trigger" href="#">Click me!</a>

$('.trigger').click(function (e) {
    e.preventDefault();
    // Do stuff...
});

值得注意的是,许多开发人员都认为使用锚点标记来实现点击事件处理程序并不好。他们更喜欢你使用<span><div>和一些添加了cursor: pointer;的CSS。这是一个很多争论的问题。

6
Jesse Atkinson

不应该在你的HTML中使用 inline onclick="something();"来不用无意义的代码污染它;必须在Javascript文件(* .js)中设置所有单击绑定。

像这样设置绑定:$('#myAnchor').click(function(){... **return false**;});$('#myAnchor').bind('click', function(){... **return false**;});

然后你有一个干净的HTML文件很容易加载(和seo友好)没有数千href="javascript:void(0);"和只href="#"

6
G. Ghez

这是完整性的另一个选项,即使禁用JavaScript也会阻止链接执行任何操作,并且它很短:)

<a href="#void" onclick="myJsFunc()">Run JavaScript function</a>

如果页面上没有id,则链接将不执行任何操作。

一般来说,我同意Aaron Wagner的回答,JavaScript链接应该用JavaScript代码注入文档。

3
Timo Huovinen

Javascript: void(0);为空值为空值 [未分配] ,这意味着您的浏览器将NULL单击 _ dom _ ,并且窗口返回false。
'#'不遵循javascript中的DOM或Window。这意味着锚点href内的'#'符号是 _ link _ 。链接到相同的当前方向。

2
SchoolforDesign

编辑于2019年1月

HTML5 中,使用没有href属性的元素是 valid 。它被认为是 “占位符超链接”

如果a元素没有href属性,则该元素表示一个占位符,否则链接可能放置在该占位符中(如果它是相关的),仅包含元素的内容。

例:

<a>previous</a>

如果之后你想做其他事情:

1 - 如果您的链接没有去任何地方,请不要使用<a>元素。使用<span>或其他适当的东西,并根据需要添加CSS :hover来设置样式。

2 - 如果您想要原始,精确和快速,请使用javascript:void(0) OR javascript:undefined OR javascript:;

2
Lyes CHIOUKH

你可以在这里使用javascript:void(0)而不是使用#来停止锚标记重定向到标题部分。

function helloFunction() {
    alert("hello world");
}
<a href="javascript:void(0)" onclick="helloFunction();">Call Hello Function</a>
0
Javed Khan