【问题标题】:A JS exception caused by 'form' element由'form'元素引起的JS异常
【发布时间】:2014-01-20 06:20:08
【问题描述】:

今天我遇到了这个问题,这让我很恼火...... 我在维护一个JS项目,有一行:

node.tagName

其中node.nodeType1。 显然代码想要获取这个元素的标签名称,它似乎适用于 99.99% 的网页......

遗憾的是,当我在http://codeforces.com/problemset/problem/377/D 上执行脚本时,它不起作用。原因是form 元素的子节点具有name="tagName" 属性。

form 元素的子节点具有属性name 可以通过如下方式访问:node.NAME_VALUE(reference),因此node.tagName 将获得其名称属性为tagName 的子节点,而不是节点的标签姓名form

有没有人也遇到过这个问题?除了检查节点是否为form,还有其他解决方案吗?


编辑 1:
我已经为 jQuery here 触发了一个错误。我这样做是因为 jQuery 为 .prop("tagName") 解决这个问题可能比让所有浏览器都解决这个问题要容易得多。
顺便说一句,我认为没有人应该使用像 tagNamenodeName 这样的东西作为 HTMLInputElement 的 name 值。

【问题讨论】:

  • 你覆盖了 Node 的 tagName 属性。
  • 我建议不要直接使用tagName,而是“找到”名称为“tagName”的元素,这样更安全,在浏览器中更广泛接受
  • @Givi 对我来说听起来有点复杂,但值得一试。
  • @Givi 会覆盖它甚至在这里有帮助吗?还是 node.NAME_VALUE(当 NAME_VALUE == "tagName")仍然优先?
  • @nrathaus 为什么?最好避免使用 Node 属性名称作为输入名称或 id 属性的值,以及如何在没有 tagName 的情况下使用事件委托?

标签: javascript html forms tagname


【解决方案1】:

我不是这些方面的专家,所以这可能不是您能得到的最佳答案,但绝不会少……我可以想到两种解决方案:

1) 如果您可以确定输入名称不存在,请改用 nodeName。

2) 使用element.clone(false).tagName(如document.getElementById('someid').clone(false).tagName

【讨论】:

    【解决方案2】:

    如果node.tagName 不适合您,请使用node.nodeName

    我在我的代码中使用node.nodeName

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      相关资源
      最近更新 更多