3

我是 JavaScript 的初学者。我试图了解如何在 js 中使用 DOM ...

无论结构多么复杂,我都想从每个 DIV 中获取某个网站的文本。如果我在下面运行我的代码,它将给我文本但是: patern div 给我他的文本和来自子 div 的文本......然后子 div 给我他的文本......所以得到很多重复的文本。

var items = document.body.getElementsByTagName('*');
for(var i=0; i<items.length; i++)
{
  document.write(items[i].textContent);
}

知道当前文本的节点对我来说很重要所以我不能使用它,因为我得到了文本但我不知道文本的节点:

var body = document.body, textContent = 'textContent' in body ? body.textContent : body.innerText;
document.write(textContent);

我知道解决方案是 jQuery。,但我试图了解如何在 JS 中执行此操作。

4

2 回答 2

0

在这种情况下,通常的textContentorinnerHTML方法会失败,因为它.innerHTML包含子节点的 HTML。

但是您可以使用另一个属性:childNodes. 此列表不仅包含子元素,还包含所有子节点,包括文本节点

var items = document.body.getElementsByTagName('*');
for(var i=0; i<items.length; i++)
{
  var currItem = items[i];
  for(var j = 0; j < currItem.childNodes.length; ++j)
  {
    if(currItem.childNodes[j].nodeName === "#text")
    {
      // the current child node is a text node
      document.write(items[i].textContent);
    }
  }
}

由于每个节点在 DOM 中都有一个唯一的位置,这将确保每个节点只被写入一次。

参考:

于 2012-10-12T18:13:36.687 回答
0

您可以尝试使用 jQuery .get() 函数获取所有匹配的元素。

例子:

var elements = [];
elements = $('div').get();

一旦你拥有了所有元素,你就可以从每个元素中获取文本(如果有的话)并将其存储在另一个数组中,如下所示:

var textStrings = [];
var len = elements.length;
for(var a = 0; a < len; a++)
    textStrings[a] = elements[a].text();

第二个代码块将遍历第一个元素数组并从每个元素中提取文本,将其保存在名为 textStrings 的第二个数组中。'len' 变量用于优化 javascript 代码并防止浏览器每次通过循环评估 'elements.length'。

希望这可以帮助。

于 2012-10-12T18:09:26.147 回答