button标签未指定类型导致的问题

今天部门同事分来一bug:新浪微博授权页面mobile版的错误提示黄签不能关闭,查找其原因,发现是黄签关闭后又被显示出来了,很奇怪,但很明显是有哪个地方又触发了它的show方法。然后在js中跟踪发现黄签关闭后又触发了表单提交方法,而提交表单会触发表单校验功能,校验功能会再次显示出黄签来。

这个关闭流程,已由正常的“点击关闭按钮” ->”隐藏黄签”,变为“点击关闭按钮” ->”隐藏黄签”->“提交表单”->“表单验证”->“显示黄签”,所以黄签就关不掉了。

但为什么会再次提交了表单呢?这个关闭按钮怎么这么特别,随后用Firebug查看黄签上的关闭按钮是一个button标签,<button node-type=”tipClose”>×</button>。

问题找到了,原来是这个button在作祟,由于这个黄签是在form表单内部的,导致点击这个关闭按钮会再次触发提交表单,就出现了如上问题,原因就是这个button因为没有指定type类型,而被当做submit使用了。

查了下button的相关定义及方法,如下:

<button> 标签定义一个按钮。

在 button 元素内部,您可以放置内容,比如文本或图像。这是该元素与使用 input 元素创建的按钮之间的不同之处。

<button> 控件 与 <input type=”button”> 相比,提供了更为强大的功能和更丰富的内容。<button> 与 </button> 标签之间的所有内容都是按钮的内容,其中包括任何可接受的正文内容,比如文本或多媒体内容。例如,我们可以在按钮中包括一个图像和相关的文本,用它们在按钮中创建一个吸引人的标记图像。

唯一禁止使用的元素是图像映射,因为它对鼠标和键盘敏感的动作会干扰表单按钮的行为。

请始终为按钮规定 type 属性。Internet Explorer 的默认类型是 “button”,而其他浏览器中(包括 W3C 规范)的默认值是 “submit”。
从上面的内容中可以看到button在未指定type属性时,其默认即为“submit”,所以在form表单中,它的功能同<input type=”submit” >一样,所以就直接提交表单了。

至此,问题的原因已经明确,修改方法有多种:

  • 可以指定其type为button。
  • 更换为其他标签,如a,span等。
    问题解决了,将本文贴出来,希望大家在开发中注意下这个问题。