javascript - 为什么我在 javascript 中得到的是 [Text Object] 而不是预期的带有 previousSibling 的 TR 对象?

标签 javascript

如果我有这样的 HTML 代码:

<HTML>
  <HEAD>
    <TITLE>This is a test</TITLE>
  </HEAD>
  <BODY>
    <TABLE>
      <TR>
        <TD>First Cell</TD>
      </TR>
      <TR>
        <TD>Second Cell</TD>
        <TD><A href="#" onclick="alert(this.parentNode.parentNode.previousSibling.childNodes[0].innerHTML); return false;">Click Here</A></TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>

这适用于 Internet Explorer,但不适用于 Firefox 以及可能更多的浏览器。显然,Firefox 将 TR(缩进)之间的空格解释为我上面的代码中“this”的父 TR 的 previousSibling。因此,它没有获得所需的 TR 对象,而是给了我一个 [文本对象]。

所以我现在的问题是,为什么 Firefox 不像 Internet Explorer 那样忽略 TR 之间的空格。我知道我可以使用 previousElementSibling 来规避这个问题,但我想知道为什么 Firefox 会这样做,以及是否有合理的解释或用途。我尝试在互联网上查找它但无济于事。因此,如果有人可以告诉我或给我一个可以找到此信息的链接,我将不胜感激!

最佳答案

是的,你是对的。实际上,IE 是主要错误的。 Here is Mozilla's take on it

你可以

a) 使用parentNode.getElementsByTagName
b) 通过循环来展平 dom,直到 nodeType 是您正在寻找的: 这是一个比 Mozilla 在上面的链接中提供的脚本更简单的脚本:http://blog.tegneblokken.net/2009/08/counting-childnodes-with-javascript-the-whitespace-incident/
c) 使用 jQuery

关于javascript - 为什么我在 javascript 中得到的是 [Text Object] 而不是预期的带有 previousSibling 的 TR 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831308/

相关文章:

javascript - React Native 中的 redux-form 有问题

javascript - 如何在每个列表项之前添加一个复选框,并在列表项之后添加一个删除按钮?

javascript - 有没有办法在没有 jQuery 的情况下做同样的事情,只使用 CSS3 和 HTML5

javascript - 通过 AJAX 检索 PHP JSON 数据 - 数据请求的正确结构

javascript - Prestashop - 如何 catch 购物车更新

javascript - 为什么这 2 个 HighCharts 代码不相同? (或者有没有办法在创建图表对象后修改对 legendItemClick 的调用?)

javascript - 使用 Moment.js 检测北半球或南半球

javascript - Jssor连续旋转不停歇

javascript - 解析格式正确的 json 字符串

javascript - $animate.enter() 不适用于自定义指令