专栏首页静晴轩Html<a>标签href的困惑记载

Html<a>标签href的困惑记载

近日,在工作中遇到一个小问题(给手游平台做些网页活动,其中牵涉到一个按钮链接,就习以为常的用了<a>标签,Click响应之后走一段js代码逻辑-弹出一个分享微信弹框。Chrome和Android平台都没问题,测试阶段发现Ios平台出现了点问题~弹框闪现一下之后,页面被重新渲染了,自然弹框又被消隐掉了。),经历一番查证,个中缘由原来如此。

出现问题后,立马走了段代码逻辑,发现并没任何逻辑问题。并且Chrome和Android平台又都OK的,只是Ios平台有此问题。经验不够丰富情形之下,只能在Ios手机上先Alert下,看下代码走的路线了。代码采用Backbone框架而成,经alert出来的提示,发现Click之后,页面view竟被重新执行了一次。额…逻辑没问题,而类似活动无数,没出现类似问题啊,不明就里~[好桑心,无能为力又无从下手的感觉,好难受]。

之后,请出同事中的前辈帮着Codereview下,终定为出了问题。原是误用这<a>惹出来的。这边见大家都用<a href="javascript:;"></a>。当然之前偶然看了张鑫旭一篇《疑问:为什么要使用href=”javascript:void(0);”?》,从中窥测之前多用的是<a href="javascript:void(0);"></a>。但为什么要用这个,他本人也没弄明白,然后读完,我也没明白。而此处,嫌用<a href="javascript:;"></a>这么长麻烦,就用<a href="#"></a>这个试了下,唉~可以啊,Android也可以唉,那就用下了(噢,问题就因此埋下了,额额额~v~)。

A Problem Is A Chance For You To Do Your Best!我坚信这一点。惹出些问题并不见得都是坏事。每每因为自己的造成的这些个问题,反倒收获不少,?。

之后就去查证了下关于这Html<a>标签的Href属性。超链接的 URL。可能的值:

  • 绝对 URL - 指向另一个站点(比如 href=”http://www.jeffjade.com")
  • 相对 URL - 指向站点内的某个文件(href=”index.htm”)
  • 锚 URL - 指向页面中的锚(href=”#top”)

根据网搜得到的答案如下,亲测也的确如此: ​<a href="javascript:void(0)">点击</a>: 点击链接后不会回到网页顶部 <a href="#">点击</a>: 点击后会回到网面顶部; 这里的href=”javascript:;”,其中javascript:是伪协议,它可以让我们通过一个链接来调用javascript函数.而采用这个方式 javascript:;可以实现A标签的点击事件运行时,如果页面内容很多,有滚动条时,页面不会乱跳,用户体验更好。点击链接后也不会回到网页顶部。

而对于Href第三点~指向页面中的锚,如下用法:

  1. 需要转到地方添加,<a href="#命名">文字</a>,注意href值是#开头+英文字母命名
  2. 需要在被转到位置添加,<span id="命名" name="命名"></span>,注意id和name值相同并且与a命名相同(亲测,id必须跟a命名相同,而span的name则不用!并且当 href=”#” 之时也会回到页面顶部.)

即可得出当使用(href=”#”)之时即有可能会回到页面顶部。但问题是,活动一屏幕足以显示完,无需滑动,Ios手机也是如此。那么使用(href=”#”)在这里是不会影响页面刷新的。得到ios客户端开发的说法是:这样写[使用(href=”#”)]会触发到客户端的监控,从而引发异常。(~这一段,很多疑惑,只是猜测,有待继续学习检验)。


此段15-08-19更新: 对于这一段的不理解,后来在ios客户端童鞋的帮助下消解了。对于Ios跟js的交互是略有点不同的: ios中objective-c与js的交互这篇文章会有讲到。js调用objective-c的方法, 代码应该这么做:

function testFunc(cmd,parameter1)   
{   
    document.write(Date());   
    document.location="objc://"+cmd+":/"+parameter1;  //cmd代表objective-   
c中的的方法名,parameter1自然就是参数了  (这里的objc://可以随意的去改)
}

在Ios里面有一个监听 http 跳转的方法;一旦有类似http:// or objc://他们都可以监听到(像这种 http:// 并不是他们要的 ,而要的是这种 objc:// 这种,所以在跟ios通信时候,都必须这种规则 objc://…。而href=”#”代表的是本地页面[页面跳转到页面本身]。如此就能解释了之前出现问题了:ios可以监听到<a href="#">点击</a>这种链接,从而使得页面被刷新。


那么很疑惑,为何Android平台没有该问题?最后,也更进一步的疑问:JavaScript中语句最后的分号是可以缺省的,那为何要使用javascript:;而不是javascript:呢?是习惯还是规范,我也很疑惑!我也很疑惑!我也很疑惑!(重要的事情说三遍)

具有代码洁癖的coder们,没事多写一个分号,圣洁的精神世界杯玷污了,怎么能忍受的了呢?这又不是多多语句,不写分号可能会出现意想不到的情况!(很认同,原话出自:张鑫旭


此段15-08-19 20:06更新: 今日在博客园~神人唯吾的标签的href和onclick属性这篇文章中看到了一个说法:

尽量不要用javascript:协议做为A的href属性,这样不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放。

这也许是大家默认使用’javascript:;’的一个原因,个中原委,有待于进一步的去摸索。

总结:#包含了一个位置信息默认的锚是#top 也就是网页的上端; 而javascript:void(0)仅仅表示一个死链接,没有任何信息。作用类同~javascript:; 而javascript:会导致不必要的触发window.onbeforeunload事件等。 故此:此处当不依靠href属性做页面跳转时候,最好还是用javascript:;更优一点。


Gui求指点,欢求吐槽!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mac必备软件集之Brew

    Brew~安装开发工具链的神器:brew 又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的 安装/查询/卸载 软件, 只需要一个命令...

    晚晴幽草轩轩主
  • 详解 Cookie 纪要

    从事 Web 开发已有近17个月;在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感~差不多是了解一二,然而又非真切的明晰;这就使得再用的时...

    晚晴幽草轩轩主
  • Lua代码片段收集

    Lua实现闭包 --[[@Func :实现闭包 @Desc : 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征...

    晚晴幽草轩轩主
  • 2016.05 第1周 群问题分享

    HTML+CSS a标签href属性的作用 2016.05.02~2016.05.06 核心概念 a标签href属性 参考答案 a标签定义超链接,用于从一个页面...

    HTML5学堂
  • vuex在页面刷新后数据被清除

    用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失

    wust小吴
  • 微信小程序|突出优点

    为了避免用户在微信中使用小程序服务时,注意力被周围复杂环境干扰,小程序在设计时应该注意减少无关的设计元素对用户目标的干扰,礼貌地向用户展示程序提供的服务,友好地...

    算法与编程之美
  • Mac OSX取消Apache(httpd)开机启动(转载)

    启动服务时提示Apache启动失败,80端口被占用.查看进程发现存在几个httpd. OS X自带Apache,可是默认是没有启动的.我也没有开启Web共享,怎...

    lin_zone
  • Flutter 图片如何充满父布局

    正常我们需要显示一张图片,会用到Image这个控件。 打个比方,我们加载一张本地的图片, 先看一下这个Image.asset的源码:

    坑吭吭
  • Tag标签页面如何优化呢

    很多站长都不会如何制作tag页面,的ag页面使用并不恰当,甚至可能会有负效果。不过一两句话很难说清,所以单独写个帖子聊一下tag标签页面怎样SEO。

    V站CEO-西顾
  • ListView详细介绍与使用

    关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注...

    开发者

扫码关注云+社区

领取腾讯云代金券