标签中 href 和 onclick 的区别,以及href="javascript:xxx(this);"与onclick="xxx(this);" 传递this参数的区别

2017年08月18日 00:06:24 chunlynn 阅读数:12009

所属专栏: 深入浅出JavaScript
 
版权声明:本文为博主(chunlynn)原创文章,转载请注明出处 https://blog.csdn.net/chenchunlin526/article/details/77346049

<a>标签中href属性动作和onclick事件的区别,以及href="javascript:xxx(this);"与onclick="xxx(this);" 传递this参数的区别

 
 
一、href 与 onclick 的区别
 
我以前在写<a>标签的 href 和 onclick 一直很随意,后来出过几次问题,以后才开始重视这个问题:
首先摘录一篇文档:
在Javascript中void是一个操作符,该操作符指定要计算一个表达式,但是不返回值。
void 操作符用法格式如下:

javascript:void(expression) 
javascript:void expression
expression 是一个要计算的 Javascript 标准的表达式。表达式外侧的圆括号是可选的,但是写上去是一个好习惯。 (实现版本 Navigator 3.0)
 
你可以使用 void 操作符指定超链接。表达式会被计算,但是不会把当前文档处装入任何内容。
 
下面的代码创建了一个超链接,当用户点击以后不会发生任何事。当用点击户链接时,void(0) 计算为 0,但 Javascript 上没有任何效果。
<a href="javascript:void(0);">单击此处什么也不会发生</a>
下面的代码创建了一个超级链接,用户单击时会提交表单。
<a href="javascript:void(document.form.submit());">单此处提交表单</a>
 
下面代码则执行了subgo() 函数,
<a href="javascript:void(0);" onclick="subgo();">点我</a>
在这里,javascript:void(0),没起实质上的作用,它仅仅是一个死链接,执行的函数是subgo()。
 
<a href="#" onclick="subgo();">点我</a>
<a href="javascript:void(0);" onclick="subgo();">点我</a>
的区别。
 
实际上 # 包含了一个位置信息,默认的锚是#top ,也就是网页的上端 ,而 javascript:void(0); 仅仅表示一个死链接,没有任何信息。所以调用脚本的时候最好用void(0)。
 
href一般是指向一个URL地址,也可以调用javascript ,如 href="javascript:xxx();",文档中推荐这样写:
<a href="javascript:void(0);" onclick="xxx();">yyy</a>
尽量不要用javascript:协议做为a的href属性,因为这种方法在复杂环境,有时会产生奇怪的问题,有时会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放。
 
如果链接中同时有,href 属性函数和 onclick 事件函数,那到底执行那个呢?
<a href="javascript:subgo2();" onclick="subgo();">点我</a>
subgo()与subgo2()执行顺序是怎样的?
 
链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接); 
 
假设链接中同时存在 href 与 onclick,如果想让 href 属性下的动作不执行,onclick 必须得到一个 false 的返回值,一般是这样写onclick="xxx();return false;" 。
<a href="javascript:subgo2();" onclick="subgo(); return false;">点我</a>
上面的链接只执行onclick事件函数,href 里的 subgo2()不执行。
如果页面过长有滚动条,且希望通过链接的 onclick 事件执行操作。应将它的 href 属性设为 javascript:void(0);,而不要是 #,这可以防止不必要的页面跳动; 
如果在链接的 href 属性中调用一个有返回值的函数,当前页面的内容将被此函数的返回值代替; 
二、<a>标签里的函数事件写法的实战建议
 
如果在实际应用中确实是要用到<a>标签来响应onclick事件的,
那么就建议使用下面三种方法 

<a href="javascript:void(0);" onclick="doSomething();">test</a> 
<a href="http://xxx/findname/" onclick="doSomething();return false">test</a> 

<a href="http://xxx/findname/" onclick="doSomething();event.returnValue=false">test</a> 

方法后面的分号";",可加可不加,一般推荐加上。
 
三、<a>标签语法结构
 
超级链接<a>标签代表一个链接点,是英文anchor(锚点)的简写。它的作用是把当前位置的文本或图片连接到其他的页面、文本或图像,这已是众所周知了,但关于它的语法结构可能有点鲜为人知,而要用活它则必须了解其语法结构。<a>标签的基本语法结构是: 

<a 
class=type 
id=value 
href=reference 
name=value 
rel=same|next|parent|previous 
rev=value 
target=window 
style=value 
title=title 
onclick=function 
onmouseout=function 

onMouseOver=function>连接</a>

从标签的语法结构可以看出,在设定一个超级链接时有很多参数可供选择,以实现不同的链接效果,这有点出乎意料吧?! 
 
其中class和id选项:用于设定链接点所属的类型和分配的ID号,通常不加以设定。
最常用的两个参数是href和name。其中href是hypertext reference的缩略词,用于设定链接地址。链接地址必须为url地址,如果没有给出具体路径,则默认路径和当前页的路径相同。 链接到的文件也分为几种情况:如果为HTML文件,则在当前浏览器中直接打开;如果为可执行文件(.exe文件),则直接执行或下载,我们提供下载的文件就是用它的这种特性做的;如果为文本文件如word格式的文件,则在浏览器中打开此文件,并可以进行编辑加工。 
rel:表示设定链接的关系:rel=same表示待链接的文件与此文件相同,rel=next表示待链接的文件为下一页,rel=parent 表示本文件为待链接文件的父文件,rel=previous则表示待链接的文件为上一页。 
rev:则用于设定反向链接。 
target:是在采用帧窗口的情况下设定链接到哪一个窗口,还有target="_blank"是表示新开一窗口打开网页。 
title:用于设定链接点被选到时显示的标题。 
onclick:对应于一个事件,当链接点被点击后将触发这个事件,执行对应的子程序。 
onmouseover:与onclick类似,对应的事件在鼠标移到链接点上时被触发。 
onmouseout:对应的事件在鼠标移出镇接点后被触发。 
 
举几个例子:

<a href="http://xxx/blog/index.htm">回到主页</a> 
<a href="http://xxx/blog/sound.wav">播放语音文件</a> 
<a href="http://xxx/blog/javascipt.open()">执行对应的程序</a> 

<a herf="document.doc">打开对应的文档进行加工</a> 

应用技巧 
1、提供下载文件 
有不少网友来信问,提供下载的效果怎么做。实际上仍然是做一个超级链接,不过供下载的文件必须上传到网站上。例:有一个“网页技巧”的文件包供下载,文件名是“homepagejq.zip”且已上传到网站了,则这个链接的代码可以这样写:<a href="http://xxx/blog/homepagejq.zip">点击这里下载“网页技巧”文件包</a>。 
 
2、在新窗口中打开链接的网页 
设定“target”的值为“_blank”。例:新开窗口打开网页“aboutme.htm”。产生该效果的代码是:<a href="http://xxx/blog/aboutme.htm" target="_blank">关于我......</a>。 
 
3、鼠标移到链接,显示一行说明文字 
设定“title”参数值,即可获得这种效果。例:当鼠标移到“黄山村夫”这个链接上时,显示说明“这是一个介绍网页制作技巧的专业网站”。这个链接的代码是这样的:<a href="http://xxx/blog/hscf.htm" title="这是一个介绍网页制作技巧的专业网站">黄山村夫</a>。 
 
4、鼠标移到一个链接上弹出一个窗口 
这是设定onmouseover参数获得的效果。例:当鼠标移到一个链接上,弹出一个窗口并在窗口中显示“鼠标悬停效果演示!”。这个链接的代码是这样的:<a href="http://xxx/blog/其它网页.htm" onmouseover="alert('鼠标悬停效果演示!')">链接</a>。用类似的方法可以制作当鼠标按下后弹出提出示窗口、当鼠标离开时弹出提示窗口的效果。 
 
5、链接到本页的指定内容 (可以用于tab页的跳转)
要实现链接到本页的某一部分内容上(也就是“文件内跳转”),必须用参数name指定链接点的名称。选定一块文本,可以用name参数为其命名,以备 链接所用。所谓同一个文件内的跳转是指当读者在阅读一个很长的文件的时候,若只对某部分的内容感兴趣,可以采用跳跃式的阅读方式。其基本格式是: 

<a href="#链接点名称">第二部分</a>第一部分内容...... 

<a name="链接点名称"></a>第二部分实际内容......

这样当你点击“第二部分”这个超级链接后,就会自动转移到“第二部分实际内容”这个地方来。“name”参数所定义的链接点名称可以随意取,但链接的“href”参数中的链接点名称必须与其一致,不要忘记在前面加上“#”。 
 
6、链接到其它页面的指定内容位置 
方法与上例类似,但在“href”参数中的链接点名称前要加上网页的文件名。例:有两个网页page1.htm和page2.htm ,每页均有两部分内容,现要在page1.htm中制作一个超级链接,按下该链接后将转到page2.htm的第二部分内容上。那么我们可以这样做,首先在page2.htm第二部分内容开始的地方写上这样一句代码:
<a name="链接点名称"></a>
在page1.htm中写上这样一个链接代码:
<a href="http://xxx/blog/page2.htm#链接点名称">page2 的第二部分内容</a>
 
7、链接到E_mail 
点击一个超级链接后,将启动客户机上的电子邮件管理软件给你写信。例这行代码:<a href="mailto:web@163.com">请给我写信</a>。一旦你点击了“请给我写信”这个链接,将自动启动电子邮件管理软件(如OE)的写信功能,并已把邮件地址加在了收信人的地址栏里了。 
链接不仅可以以文本作载体,也可以以图象作载体,而且可以以图片的某一部分作载体,且都能实现上述这些效果,方法也相同,所不同只是载体,也就是链接的两对方括号中间的那部分,所以不再另举例了。
 
例子:
用CheckBox控件时,想实现在每个checkbox后再加链接的功能,点链接实现一些功能之外,还要把checkbox选中。

<input type="checkbox" name="chk" id="chkid">
<label for="chkid">选中它
    <a href="javascript:void(0);" onclick="this.parentNode.click();">[label中的链接]</a>

</label>

最后用parentNode来实现的。
四、 href="javascript:xxx(this);"和onclick="xxx(this);"的区别
 
正确的做法:在onclick的方法中传递this参数,将当前a标签对象传递给方法。即使用onclick="xxx(this);"方法。
 
想传递当前对象给一个函数,于是就将这个URL写成"javascript:shoControlSidebar(this);",可是结果发现
这并不可行,传递过去的参数是一个对象,但是却得不到任何其他信息。我想得到的是innerText,而这个this并非
指向它所在的a标签。 
 
这是<a href="javascript:shoControlSidebar(this);">
和<a href="javascript:void(0);" onclick="shoControlSidebar(this);">
不同的地方。 
 
当使用 onclick="shoControlSidebar(this);" 的时候,解释器会给他包装一个匿名函数,变成了: 
代码如下:

a.onclick = function anonymous() { 
    shoControlSidebar(this); 

}

 
这个this指的就是a这个对象,而使用href的方式时,由于是一个地址,这个this就无处可指了。 
代码如下:
<a href="javascript:void(0);" onclick="test(this);">A标签测试</a> 
 
想获取A 中的innerHTML 
如果href="test(this);" 不但获取不到值,而且程序将退出,href引向不对。 正确获取当前标签对象代码如下:
JS实战代码:

//js的方法中参数不能再写成test(this)了,因为this有特定的含义,所以写成test(obj)才正确
function test(obj){
    //obj就是onclick="test(this)"中this传过来的,this指的就是页面中点击的a标签对象,
    //然后通过HTML的DOM属性parentNode获取a标签的父节点,不断往上获取到最外层tr的父节点,然后进行下一步的其他事件操作了。
    var node = obj.parentNode.parentNode.parentNode.parentNode;
    $(node).find("tr[class='parents']").find("input[type='checkbox']").prop("checked",'true');
    node.parentNode.removeChild(node);
    alert(obj); 
    //js 
    alert(obj.innerHTML); 
    //jquery 
    alert($(obj).html()); 

}

全文完。

<a>标签深入讲解的更多相关文章

  1. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  2. thinkphp内置标签简单讲解

    thinkphp内置标签简单讲解 1.volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 ...

  3. 一个由SEO优化展开的meta标签大讲解

    您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个人网站 ...

  4. Struts2 标签库讲解

    要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可: <%@ taglib prefix="s" uri="/struts-tags"%& ...

  5. html中的a标签特例讲解

    将自己的博客写成了一个大杂烩了,遇见啥问题就写啥问题.但是当看见自己网页的成品就特别的开心. 还记得看见过的一个故事,说是收费的东西好还是免费的东西好,有一个答案是最让我记忆深刻的.回复的一个答案是: ...

  6. HTML入门(转义字符、行内样式和块级元素、定位、锚点、跑马灯标签、图片标签、表格标签的讲解)

    一.转义字符由特殊字符包裹的文本 会当做标签去解析 对应不换行空格 对应全角空格 em是字体排印学的计量单位,相当于当前指定的点数.其占据的宽度正好是1个中文宽度,而且基本上不受字体影响.<对应 ...

  7. html--前端基本标签内容讲解

    body里面分为两类标签:块级标签和内联标签. 1.块级标签:<p><h1><table><ol><ul><form><d ...

  8. el和jstl标签库讲解视频

    https://www.bilibili.com/video/av22415283/?p=1

  9. HTML标签详细讲解

    http://www.cnblogs.com/yuanchenqi/articles/5603871.html

随机推荐

  1. Part7-时钟初始化_lesson1

    1.概念解析 1.1时钟脉冲信号 1.2时钟脉冲频率 1.3时钟源(提供时钟脉冲信号) a.晶振 b.锁相环PLL 2.时钟体系 2440: 晶振的频率.时钟体系有多少个PLL.这些PLL分别产生了哪 ...

  2. hdu 1556 Color the ball (线段树做法)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...

  3. Socket接口原理及用C#语言实现

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  4. WCF项目问题1-找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

    找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHosti ...

  5. 黑盒测试实践--Day1 11.25

    黑盒测试实践--Day1 今天完成任务情况: 晚上得到老师布置的本周小组作业--黑盒测试的基本要求,然后小组在上周作业建立的微信群里开了个在线的短会,主要内容如下: 组长小靳带领大家学习了这个要求 计 ...

  6. php变量数据类型

    整型:可以用十进制.八进制.十六进制指定.十进制就是日常使用的数字:八进制,数字前必须加上“0”(这个0是阿拉伯数字0,可不是英文字母“欧”哦):十六进制,数字前必须加“0x” (这个0也是阿拉伯数字 ...

  7. 深数据 - Deep Data

    暂无中文方面的信息,E文的也非常少,原文连接: A lot of great pieces have been written about the relatively recent surge in ...

  8. 国内物联网平台(8):中移物联网开放平台OneNet

    国内物联网平台(8)——中移物联网开放平台OneNet 马智 平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算 ...

  9. Linux中的SELinux与chcon以及Samba实现【转】

    一.SELinux SElinux的前身是NSA(美国国家安全局)发起的一个项目.它的目的是将系统加固到可以达到军方级别. 为什么NSA选择Linux呢? 在目前市面上大多数操作系统都是商用闭源的,只 ...

  10. .net core MVC 通过 Filters 过滤器拦截请求及响应内容

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: Swashbuckle.AspNetCore 我暂时用的是 ...