如果执行了onclick,如何禁用HREF?


94

我有一个同时 设置HREFONCLICK属性的锚点。如果单击并启用了Javascript,我希望它执行ONCLICK和忽略HREF。同样,如果禁用或不支持Javascript,我希望它遵循HREFURL并忽略ONCLICK。以下是我正在执行的示例,该示例将执行JS并并发地跟随链接(通常是先执行JS,然后页面更改):

<A HREF="http://example.com/no-js-login" ONCLICK="yes_js_login()">Log in</A>

最好的方法是什么?

我希望有一个Java脚本的答案,但我会接受任何可以使用的方法,只要它可以用PHP即可完成。我已经读过“ href链接已执行并在javascript onclick函数能够完成之前重定向页面 ”,但它只会延迟HREF,但不会完全禁用它。我也在寻找更简单的方法。


4
我会用一个带有href的锚和一个不带有href的锚。在页面加载时,请检查是否启用了javascript,是否显示了正确的锚,否则显示了另一个。
ewein 2013年

1
@ewein为什么?听起来像一个简单功能的大量标记。
Supuhstar

Answers:


56

如果将return放在onclick属性中,则可以使用第一个未编辑的解决方案:

<a href="https://example.com/no-js-login" onclick="return yes_js_login();">Log in</a>

yes_js_login = function() {
     // Your code here
     return false;
}

示例:https//jsfiddle.net/FXkgV/289/


1
我喜欢这有多干净!但是,公认的解决方案使我对是否忽略HREF拥有更多控制权
Supuhstar 2014年

在过去的几年中,我改变了主意。这是一个更好的解决方案
Supuhstar

多么有益健康!
DrunkDevKek '18年

但这不能与JSX一起工作。这样行吗?
编码器

1
这节省了很多时间。
Mark Lozano

60
    yes_js_login = function() {
         // Your code here
         return false;
    }

如果返回false,它将阻止默认操作(转到href)。

编辑:对不起,这似乎不起作用,您可以改为执行以下操作:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>

1
编辑的答案无法回答问题,因为它会删除实际的链接。
Itai Bar-Haim 2014年

11
或者onclick="return yes_js_login();"yes_js_login回程配合使用false
UweKleine-König2014年

1
@cgogolin看到我的答案。
·罗根

对于仍然坚持的人,可以添加以下行event.stopImmediatePropagation()
didxga'7

33

只需使用HTML preventDefault并在中传递eventHTML 即可禁用默认浏览器行为。

<a href=/foo onclick= yes_js_login(event)>Lorem ipsum</a>

yes_js_login = function(e) {
  e.preventDefault();
}

1
返回false在聚合物中不起作用...上述解决方案确实起作用...谢谢
Paras Sachapara

16
<a href="http://www.google.com" class="ignore-click">Test</a>

使用jQuery:

<script>
    $(".ignore-click").click(function(){
        return false;
    })
</script>

使用JavaScript

<script>
        for (var i = 0; i < document.getElementsByClassName("ignore-click").length; i++) {
            document.getElementsByClassName("ignore-click")[i].addEventListener('click', function (event) {
                event.preventDefault();
                return false;
            });
        }
</script>

您将类分配给.ignore-click任意数量的元素,而这些元素上的点击将被忽略


这是一个很好的解决方案!我将其用于按钮,当单击时将伪类.btn-loading添加到单击的链接中,如果成功,则复选标记(错误时为X)将替换加载动画。我不希望在某些情况下(无论成功还是错误)都可以再次单击该按钮,使用它我可以简单$(elemnent).addClass('disabled'),轻松地以优雅的方式实现我一直在寻找的功能!
马修·马西森

14

您可以使用以下简单代码:

<a href="" onclick="return false;">add new action</a><br>

5

如果传递这样的事件参数,则更简单:

<a href="#" onclick="yes_js_login(event);">link</a>
function yes_js_login(e) {
    e.stopImmediatePropagation();
}

1
那对我不起作用。我必须使用e.preventDefault()
Milan Simek

2

这可能会有所帮助。 无需JQuery

<a href="../some-relative-link/file" 
onclick="this.href = 'https://docs.google.com/viewer?url='+this.href; this.onclick = '';" 
target="_blank">

此代码执行以下操作:将相对链接传递到Google Docs Viewer

  1. 通过以下方式获取锚的完整链接版本 this.href
  2. 在新窗口中打开链接。

因此,在您的情况下,这可能会起作用:

<a href="../some-relative-link/file" 
onclick="this.href = 'javascript:'+console.log('something has stopped the link'); " 
target="_blank">

1

我解决了以下情况:我需要为该元素提供模板的模板,该模板可以处理常规URL或javascript调用,其中js函数需要对调用元素的引用。在javascript中,“ this”仅在表单元素(例如按钮)的上下文中用作自引用。我不想要按钮,只是想要常规链接的外观。

例子:

<a onclick="http://blahblah" href="http://blahblah" target="_blank">A regular link</a>
<a onclick="javascript:myFunc($(this));return false" href="javascript:myFunc($(this));"  target="_blank">javascript with self reference</a>

href和onClick属性具有相同的值,例如,当它是JavaScript调用时,我会在onClick上附加“ return false”。在调用的函数中出现“ return false”不起作用。


为什么有两个?为什么要将JS放入HREF
Supuhstar 2014年

Supuhstar,实际的代码是动态的,javascript,并且将为外部定义的数百个项目生成一个<a>元素。每个项目要么指定一个静态链接地址,要么就是生成的<a>元素应使用常规“ href行为”的地方。或者,为该项指定javascript函数调用,在这种情况下,将根据元素的上下文计算<a>元素的行为。在<a>生成器的代码中,我只想复制为每个元素指定的内容,而无需测试它是链接地址还是javascript函数调用。
约翰逊

我不明白这如何回答我的问题。谁说我要几百个链接?我真的不明白这一切的意义,甚至不明白你刚才说的一半。
Supuhstar 2014年

0

这对我有用:

<a href="" onclick="return false;">Action</a>

感谢您的回答,欢迎您使用Stack Exchange!不幸的是,这似乎并没有增加任何新知识,因为似乎以前的答案已经表明了这一点。如果您同意,那么最好投票反对。如果您不同意,请编辑您的答案,以便发现新知识!
Supuhstar

0

就我而言,当用户单击“ a”元素时,我有一个条件。条件是:

如果其他部分的项目超过十个,则不应将用户重定向到其他页面。

如果其他部分的项目少于十个,则应将用户重定向到其他页面。

“ a”元素的功能取决于其他组件。click事件中的代码如下:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.