【问题标题】:Multiple parentNode (s) Not Working In Internet Explorer 7多个父节点在 Internet Explorer 7 中不起作用
【发布时间】:2011-05-30 08:04:41
【问题描述】:
var round1 = output.parentNode.parentNode.parentNode.getElementsByTagName('a')[0].innerHTML


Internet explorer 7 给我错误“无法获取属性'innerHTML'的值:对象为空或未定义”当代码清楚地适用于 ie 9 ff 和 chrome 任何建议时。

【问题讨论】:

    标签: javascript dom parent-node


    【解决方案1】:

    只是不要这样做,即反复调用parentNode,甚至不知道它是什么。 DOM 看起来可能与您预期的大不相同。这与仅仅为了方便而不进行任何范围检查一样聪明。

    改用防御性和灵活的方法(或者,使用像 jQuery 这样的框架来完成繁重的工作)。

    function closest(node, tagName) {
      var parent = node.parentNode;
      if (parent) {
        if (parent.tagName && parent.tagName.toUpperCase() === tagName.toUpperCase()) {
          return parent;
        }
        return closest(parent, tagName);
      }
    }
    
    var container = closest(node, "table");
    var firstLink = container.getElementsByTagName('a')[0];
    var round1    = firstLink.innerHTML || "";
    

    【讨论】:

    • 好吧,如果它的任何星座,它的导航是一个相当大的菜单,所以我知道它的结构,但显然我的方式是无效的。我真的不明白你的代码它是如何工作的?这会得到哪个父节点?谢谢你
    • @Cadell 它检索具有特定节点名称的最近父节点,因此是函数名称。在浏览器的开发者工具中设置调试器断点,看看它是如何工作的。
    • @Tomalak 嗨,我使用了您的代码,它在获取第一个节点时工作正常,但是当我实现它以选择任何父节点时,我仍然在 ie7 中遇到错误。我什至设置了几个 if then 语句来检查选择了哪些 dom 元素,但我仍然得到错误。有什么建议吗?
    • @Cadell 如果您收到“对象为空或未定义”错误,那就是:您正在调用nullundefined 的属性。这总是是草率编程的结果,而且很容易避免:在调用innerHTML之前,只需检查typeof,您的对象既不是null也不是undefined。跨度>
    • 好的,我已经对其进行了更多研究并解决了我的问题 - Internet Explorer 似乎将锚标签解析为父标签,而它显然不是这种意义上的父标签。我现在已经解决了这个问题,非常感谢 tomalak
    【解决方案2】:

    output.parentNode.parentNode.parentNode 中似乎没有“a”-Tag 所以getElementsByTagName('a')[0] 返回null ;)

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2017-04-02
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多