为什么是以下||跳过有效值?

时间:2016-05-02 09:12:59

标签: javascript

以下代码根据第一个和子节点的存在设置this.statOffset

console.log('Node: ', this.node.childNodes.item(0))
console.log('Node length: ', this.node.childNodes.item(0).length)

this.startOffset = this.node.length - 1 ||
    this.node.firstChild.length - 1 || 
    this.node.childNodes.item(0).length - 1 || 
    this.node.childNodes.item(0).firstChild.length - 1

没关系。但在某些情况下,我会在最后一个值中获得Uncaught TypeError: Cannot read property 'length' of nullthis.node.childNodes.item(0).firstChild.length - 1

奇怪的是,当this.node.childNodes.item(0).length - 1是有效值时会发生这种情况。 console.logs输出:

Node: "a"
Node lenght: 1

为什么代码跳过有效值并尝试执行最后一个(这是无效的)?

编辑:节点的结构:

<p>
    <strong>a</strong>
    b
    <span>
        <em>c</em>
    </span>
    d
    <strong>e</strong>
</p>

2 个答案:

答案 0 :(得分:1)

  

没关系。但在某些情况下,我得到一个未捕获的TypeError:不能   在最后一个值中读取null的属性'length':   this.node.childNodes.item(0).firstChild.length - 1

两件事

  1. 您不需要从长度减少1,否则仅在长度大于1或0时才有效。
  2. 您需要使用childNodeschildren而不是长度,因为Element没有长度属性
  3. 假设this引用发生事件的元素,请尝试

     this.startOffset = this.childNodes.length ||
       this.childNodes.item(0).childNodes.length;
    

    或使用hasChildNodes

     this.startOffset = this.hasChildNodes() ||
       this.childNodes.item(0).hasChildNodes();
    

答案 1 :(得分:0)

你尝试过孩子而不是childNodes吗?这对孩子们来说很有帮助,即使我们在不同的浏览器上尝试这一点,孩子似乎也可以工作,但是childNodes并不适用于所有人。

两者的作用有时不同。我曾在IPad上工作过,而且我已经完成了一些与childNodes合作的工作,而且还没有开展工作。

<html>
    <div id="div1">
      <div id="div2">
        <div id="div3">
          <div id="div4">
          </div>
        </div>
       </div>
    </div>
<script>
    var div1 = document.getElementById("div1");
    console.log(div1.childNodes.item(0).firstChild);
    console.log(div1.children.item(0).firstChild)
    document.getElementById("div4").innerHTML = JSON.stringify(div1.childNodes.item(0).firstChild);
    document.getElementById("div4").innerHTML += div1.children.item(0).firstChild;
</script>
<html>

Fiddle