href与onclick中的JavaScript函数


474

我想在单击时运行一个简单的JavaScript函数,而无需任何重定向。

将JavaScript调用放入href属性之间有什么区别或好处(例如:

<a href="javascript:my_function();window.print();">....</a>

)与将其放入onclick属性(将其绑定到onclick事件)?


5
之前已经讨论过这个问题:stackoverflow.com/questions/245868/…–
SolutionYogi

Answers:


276

将onclick放在href中会激怒那些坚信内容与行为/行为分开的人。理由是,您的html内容应仅专注于内容,而不是表示或行为。

这些天的典型路径是使用JavaScript库(例如jquery)并使用该库创建事件处理程序。它看起来像:

$('a').click( function(e) {e.preventDefault(); /*your_code_here;*/ return false; } );

1
或mootools,prototype,dojo ...或纯javascript,但这将是很多代码,但值得一试。
瑞安·佛罗伦萨

15
如果您不需要对事件对象做任何事情,纯JavaScript就是非常简单的。使用obj = document.getElementById()获取DOM节点,然后设置obj.onclick = foo
Matt Bridges

1
当在弹出窗口中动态生成<a href>时,内容分离又如何呢?您仍然需要特殊的点击行为?
Serge

6
但是问题不是在问将JS调用内联href与内联放入之间的区别onclick吗?假设由于某种原因您将其内联,应该使用哪个?(实际上,我会按照您的建议进行操作,但是您似乎跳过了这两个属性之间的区别。)
nnnnnn

1
我提倡将函数调用置于内联而不是使链接具有onclick事件的那一次是,如果要在页面中动态创建将全部调用相同函数但可能没有唯一ID的链接。我有一个Web窗体,用户可以在其中添加和删除项,并将onclick放在动态创建的div内的链接的href中,这样我就可以更快地开始处理脚本,而不是使用相对不具体的东西(例如相对ID或班级名称。
MistyDawn

976

坏:

<a id="myLink" href="javascript:MyFunction();">link text</a>

好:

<a id="myLink" href="#" onclick="MyFunction();">link text</a>

更好:

<a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>

更好的1:

<a id="myLink" title="Click to do something"
 href="#" onclick="MyFunction();return false;">link text</a>

更好的2:

<a id="myLink" title="Click to do something"
 href="PleaseEnableJavascript.html" onclick="MyFunction();return false;">link text</a>

为什么更好?因为这return false会阻止浏览器跟踪链接

最好:

使用jQuery或其他类似框架,按元素ID附加onclick处理程序。

$('#myLink').click(function(){ MyFunction(); return false; });

21
如果href没有设置#为noJS浏览器的实际链接,那将是另一种最佳解决方案。
helly0d

6
如果我告诉您,只有第一个(坏)的东西在所有带有Middleclick的浏览器中都以相同(正确)的方式工作,该怎么办?
Vloxxity

14
<a id="myLink" href="javascript:MyFunction();">有什么不好?
Vaddadi Kartick 2015年

6
我仅收取5美分的低价:“最好”的选择是使用按钮进行点击(onclick事件?),并将锚点与href保持一致,以使其最初的设计意图是:锚定至其他页面的链接。
nidalpres

4
使用javascript的on click绑定有一个缺点:稍后当您调试其他表单时,真的很难找到在何处以及将哪种javascript绑定到该元素。
Maarten Kieft 2015年

69

javascript而言,一个区别是处理程序中的this关键字onclick将引用其onclick属性为的DOM元素(在本例中为<a>元素),而thishref属性中则引用该元素。window对象。

表示而言,如果href链接中没有属性(即<a onclick="[...]">),则默认情况下,浏览器将显示text光标(而不是通常需要的pointer光标),因为它正在处理<a>锚定为锚,而不是链接。

行为方面,当通过进行导航来指定动作时href,浏览器通常会支持href使用快捷方式或上下文菜单在单独的窗口中打开该行为。仅通过指定动作时,这是不可能的onclick


但是,如果您要询问从DOM对象单击获得动态操作的最佳方法是什么,那么最好的方法是使用与文档内容分开的javascript附加事件。您可以通过多种方式执行此操作。一种常见的方法是使用jQuery之类的JavaScript库来绑定事件:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<a id="link" href="http://example.com/action">link text</a>
<script type="text/javascript">
    $('a#link').click(function(){ /* ... action ... */ })
</script>

9
感谢您证实我的怀疑,即“ href”与“ onclick”中的“ this”不同。
joonas.fi 2014年

17

我用

Click <a nohref style="cursor:pointer;color:blue;text-decoration:underline"
onClick="alert('Hello World')">HERE</a>

很长的路要走,但是可以完成工作。使用A样式进行简化,然后变为:

<style> A {cursor:pointer;color:blue;text-decoration:underline; } </style> 
<a nohref onClick="alert('Hello World')">HERE</a>

10
+1太好了!:-)我以前从未听说过nohref属性。这是处理此类JavaScript动作的最合乎逻辑/最优雅的方法。这与FF12和IE8兼容。因此,我将全部替换href="JavaScript:void(0);"nohref。非常感谢。干杯。
olibre 2012年

7
主要浏览器不支持该功能,为什么要使用此功能?w3schools.com/tags/att_area_nohref.asp
hetaoblog 2012年

11
nohrefarea标签的一部分,不是a!您的示例与<a onClick="alert('Hello World')">HERE</a>
nZeus 2015年

6
只是另一个“不要发出此警告”。这完全是非标准的建议。标签nohref上不存在a
Colin't Hart

11

除了此处所有内容之外,href还会显示在浏览器的状态栏中,而onclick不会显示。我认为在此处显示javascript代码不是用户友好的。


10

最好的方法是:

<a href="#" onclick="someFunction(e)"></a>

问题在于,这将在浏览器中的页面URL末尾添加一个哈希(#),因此要求用户单击两次“后退”按钮才能转到您的页面前。考虑到这一点,您需要添加一些代码来停止事件传播。大多数javascript工具包都已经具有此功能。例如,dojo工具箱使用

dojo.stopEvent(event);

这样做。


9
我想警告一下,如果您使用href="#"浏览器将查找一个命名的锚标记,并且由于找不到它,那么它将使窗口滚动到页面顶部,如果您已经在顶部了。为避免此行为,请使用:href="javascript:;"
alonso.torres 2011年

1
@ alonso.torres很好,但这就是为什么我提到使用dojo.stopEvent()的原因-它会停止事件传播/冒泡以及单击锚点的默认行为。
linusthe3rd

7
而不是stopEvent,为什么不只返回false(onclick =“ someFunction(e); return false;”)
stracktracer

10

最好的答案是一种非常糟糕的做法,永远不要链接到一个空的哈希,因为它会在以后产生问题。

最好是将事件处理程序绑定到元素,正如其他许多人所说的那样, <a href="javascript:doStuff();">do stuff</a>在每种现代浏览器中均能完美运行,并且在渲染模板时我广泛使用它,以避免必须为每个实例重新绑定。在某些情况下,此方法可提供更好的性能。青年汽车

另一个有趣的小贴士...

onclickhref直接调用javascript时有不同的行为。

onclickthis正确传递上下文,而href不会,或者换句话说,<a href="javascript:doStuff(this)">no context</a>将不起作用,而<a onclick="javascript:doStuff(this)">no context</a>

是的,我省略了href。尽管它不符合规范,但可以在所有浏览器中使用,尽管理想情况下,它应该包含一个href="javascript:void(0);"很好的措施


8

具有javascript:任何非专门用于脚本编写的属性是一种过时的HTML方法。从技术上讲,它是可行的,但您仍将javascript属性分配给非脚本属性,这不是一个好习惯。它甚至可能在旧的浏览器或某些现代的浏览器上失败(在Google论坛上发布的帖子似乎表明Opera不喜欢'javascript:'网址)。

更好的做法是将JavaScript放入onclick属性的第二种方法,如果没有脚本功能可用,则将其忽略。将有效的URL放置在href字段(通常为“#”)中,以供那些没有javascript的人使用。


1
我没有看到'javascript:'href和带有onclick属性的'#'href有什么区别。对于未启用JS的浏览器,两者均无用。
harto

2
harto,这实际上是不正确的。“#”是命名链接的指示符,不是javascript标识符。这是一个有效的URL,不需要识别Javascript。
zombat


7

这有效

<a href="#" id="sampleApp" onclick="myFunction(); return false;">Click Here</a>

3
欢迎使用Stack Overflow!尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中添加解释性注释,因为这会降低代码和解释的可读性!
再见StackExchange

2
此代码无效。return:false无效。它应该返回false。
hbulens

5

就个人而言,我发现将javascript调用放在HREF标签中很烦人。我通常并不十分注意某个内容是否为javascript链接,并且常常想在新窗口中打开内容。当我尝试使用这些类型的链接之一执行此操作时,我得到的空白页上没有任何内容,而我的位置栏中显示的是javascript。但是,通过使用onlick可以稍微回避一下。


3

当在JavaScript中使用“ href”时,我注意到了另一件事:

如果两次单击之间的时间差很短,则不会执行“ href”属性中的脚本。

例如,尝试运行以下示例,然后双击每个链接(快速!)。第一个链接将只执行一次。第二个链接将执行两次。

<script>
function myFunc() {
    var s = 0;
    for (var i=0; i<100000; i++) {
        s+=i;
    }
    console.log(s);
}
</script>
<a href="javascript:myFunc()">href</a>
<a href="#" onclick="javascript:myFunc()">onclick</a>

在Chrome(双击)和IE11(带有三次单击)中复制。在Chrome中,如果您单击的速度足够快,则可以单击10次,而只执行1个函数。

Firefox可以正常工作。


3

首先,href最好使用url,因为它允许用户复制链接,在其他选项卡中打开等。

在某些情况下(例如,频繁更改HTML的网站),每次更新都绑定链接是不切实际的。

典型的绑定方法

普通链接:

<a href="https://www.google.com/">Google<a/>

对于JS来说是这样的:

$("a").click(function (e) {
    e.preventDefault();
    var href = $(this).attr("href");
    window.open(href);
    return false;
});

这种方法的好处是将标记和行为完全分开,而不必在每个链接中重复执行函数调用。

无绑定方法

但是,如果您不想每次都绑定,则可以使用onclick并传入元素和事件,例如:

<a href="https://www.google.com/" onclick="return Handler(this, event);">Google</a>

这对于JS:

function Handler(self, e) {
    e.preventDefault();
    var href = $(self).attr("href");
    window.open(href);
    return false;
}

这种方法的好处是您可以随时随地加载新链接(例如通过AJAX),而不必担心每次绑定。


1
 <hr>
            <h3 class="form-signin-heading"><i class="icon-edit"></i> Register</h3>
            <button data-placement="top" id="signin_student" onclick="window.location='signup_student.php'" id="btn_student" name="login" class="btn btn-info" type="submit">Student</button>
            <div class="pull-right">
                <button data-placement="top" id="signin_teacher" onclick="window.location='guru/signup_teacher.php'" name="login" class="btn btn-info" type="submit">Teacher</button>
            </div>
        </div>
            <script type="text/javascript">
                $(document).ready(function(){
                $('#signin_student').tooltip('show'); $('#signin_student').tooltip('hide');
                });
            </script>   
            <script type="text/javascript">
                $(document).ready(function(){
                $('#signin_teacher').tooltip('show'); $('#signin_teacher').tooltip('hide');
                });
            </script>   

0

当页面嵌入Outlook的网页功能(将邮件文件夹设置为显示url)时,我体验到javascript:hrefs不起作用

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.