Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

判定是否为表单元素

发现jQuery1.41的一个bug,John Resig在实现他的事件代理系统(live)时,需要对当前元素进行判定,判定其是否为表单元素。

var formElems = /textarea|input|select/i;
 
//**********
formElems.test( elem.nodeName)

但很明显,他忘记了button标签。我不知其他人怎样用它,我在设计一个站内短信系统时,把用它来区分是群发,还是丢到垃圾箱什么的。要修正这个bug很容易,就是补上button字段,但我想出另一个更严谨的判定:

var isFormElement = function(obj){
  return !!(obj.tagName && "name" in obj && "form" in obj);
}

首先我们判定其是否为元素节点,用的是tagName。在IE下,注释节点也有tagName,永远为"!",不过没关系,后面的条件能剔除它。然后判定其原型中是否存在name属性,a标签也有name属性,不过没关系。最后判定其原型是否存在form属性,表单元素都有一个form属性,指向其最近的祖先form标签。不过表单元素不单止input标签,select标签,textarea标签,button标签,还有label标签,fieldset标签,legend标签,HTML5还新增了output标签,datalist标签,谁晓得以后还加什么东西。但现在可以知道,label,fildset,legend是不会在提交时添加什么东西。(我们在提交时,会生成一个queryString,以name=value&name2=value2的形式提交到后台,name属性就在此时发挥作用了)。因为它们三个都没有name属性,因此我们可以把它们区别开去!

最后,我们拿以下页网验证一下:

<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>isFormElement by 司徒正美</title>
  </head>
  <body>
    <!--这是注释节点//-->
 
    <form  action="">
      <fieldset>
        <legend>表单</legend>
        <select name="aaa">
          <option>1</option>
          <option>2</option>
          <option>3</option>
        </select>
        <label for="bbb">
          <input type="text" name="bbb">
        </label><br/>
        <textarea name="ccc">司徒正美</textarea>
        <div ><button type="submit" name="ddd">提交</button></div>
 
      </fieldset>
 
    </form>
  </body>
</html>

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(1916)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示