比较DOM树中

时间:2015-10-26 13:51:56

标签: javascript dom tree

我创建了一个函数,它具有树DOM的两个节点作为参数,如果第一个节点的标签与第二个节点的标签不同,则返回1,反之亦然。 这是方法:

function foo(node1, node2) {
   if(node1.nodeName !== node2.nodeName) {
      return 1;
   }
   return 0;
}

如果作为参数传递的节点是具有不同标签的节点(例如,P和I,#text和U等),这对我来说很好。但是如果节点是相同的并且是两个文本(#text)我不仅要比较节点类型,还要比较内容(在这种情况下是两个文本)。因此,如果文本不同,请执行某项操作,如果它们与另一个操作相同。

在我的应用程序中,我知道文本节点总是在树DOM的叶子中找到。

例如,如果我有这两个DOM树:

        P
    /   |   \
 some   B    A
        |    |
      text  here


        P
    /       \
 other       U
           /   \
          TT    I
          |     |
     beautiful  text

我用2个参数调用该函数(第一个节点在第一个树中,第二个节点在第二个树中):

  • foo(P, some) => return 1
  • foo(some, some) => return 0
  • foo(some, beautiful) => return 1,因为文字不同
  • 等...

如何更改功能以获得我想要的功能? 作为文本的收入而不仅仅是节点的类型?

谢谢

3 个答案:

答案 0 :(得分:1)

这应该这样做。

function foo(node1, node2) {
   if(node1.nodeName !== node2.nodeName) {
      return 1;
   }
   else if (node1.nodeName === "#text"){
      if (node1.nodeValue !== node2.nodeValue) {
         return 1;
      }
      return 0;
   }
}

答案 1 :(得分:0)

我会做这样的事情:

function foo(node1, node2) {
    if(node1.nodeName !== node2.nodeName) {
        return 1;
    }else if (node1.nodeName === 'P' && node1.textContent === node2.textContent){
        return 0    
    }
    return 1;
}

答案 2 :(得分:0)

有一种DOM方法几乎可以做到:isEqualNode(参见MDN)。

function foo(node1, node2) {
   if(node1.isEqualNode(node2)) {
      return 0;
   }
   return 1;
}

示例:

var a = document.createElement('div');
var b = document.createElement('div');
a.textContent = 'foo';
b.textContent = 'foo';
foo(a, b); // 0

var a = document.createElement('div');
var b = document.createElement('div');
a.textContent = 'foo';
b.textContent = 'bar';
foo(a, b); // 1

var a = document.createElement('p');
var b = document.createElement('div');
foo(a, b); // 1