- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有没有办法得到所有textNode
的集合文档中的对象?
getElementsByTagName()
非常适合 Elements,但是 textNode
s 不是元素。
更新:我意识到这可以通过遍历 DOM 来完成 - 正如下面许多人所建议的那样。我知道如何编写一个查看文档中每个节点的 DOM-walker 函数。我希望有一些浏览器原生的方式来做到这一点。毕竟我能得到所有的<input>
有点奇怪s 有一个内置调用,但不是所有 textNode
最佳答案
更新:
我已经概述了这 6 种方法中的每一种在 1000 次运行中的一些基本性能测试。 getElementsByTagName
是最快的,但它完成了一半的工作,因为它没有选择所有元素,而是只选择一种特定类型的标签(我认为 p
)并盲目地假设它的 firstChild 是一个文本元素。它可能有一点缺陷,但它用于演示目的并将其性能与 TreeWalker
进行比较。 Run the tests yourselves on jsfiddle查看结果。
让我们暂时假设有一种方法可以让您本地获取所有 Text
节点。您仍然需要遍历每个生成的文本节点并调用 node.nodeValue
以获取实际文本,就像您对任何 DOM 节点所做的那样。所以性能问题不在于遍历文本节点,而是遍历所有非文本节点并检查它们的类型。我认为(根据结果)TreeWalker
的执行速度与 getElementsByTagName
一样快,甚至更快(即使 getElementsByTagName 播放有障碍)。
Ran each test 1000 times.Method Total ms Average ms--------------------------------------------------document.TreeWalker 301 0.301Iterative Traverser 769 0.769Recursive Traverser 7352 7.352XPath query 1849 1.849querySelectorAll 1725 1.725getElementsByTagName 212 0.212
Source for each method:
TreeWalker
function nativeTreeWalker() {
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT,
null,
false
);
var node;
var textNodes = [];
while(node = walker.nextNode()) {
textNodes.push(node.nodeValue);
}
}
递归树遍历
function customRecursiveTreeWalker() {
var result = [];
(function findTextNodes(current) {
for(var i = 0; i < current.childNodes.length; i++) {
var child = current.childNodes[i];
if(child.nodeType == 3) {
result.push(child.nodeValue);
}
else {
findTextNodes(child);
}
}
})(document.body);
}
迭代树遍历
function customIterativeTreeWalker() {
var result = [];
var root = document.body;
var node = root.childNodes[0];
while(node != null) {
if(node.nodeType == 3) { /* Fixed a bug here. Thanks @theazureshadow */
result.push(node.nodeValue);
}
if(node.hasChildNodes()) {
node = node.firstChild;
}
else {
while(node.nextSibling == null && node != root) {
node = node.parentNode;
}
node = node.nextSibling;
}
}
}
querySelectorAll
function nativeSelector() {
var elements = document.querySelectorAll("body, body *"); /* Fixed a bug here. Thanks @theazureshadow */
var results = [];
var child;
for(var i = 0; i < elements.length; i++) {
child = elements[i].childNodes[0];
if(elements[i].hasChildNodes() && child.nodeType == 3) {
results.push(child.nodeValue);
}
}
}
getElementsByTagName(障碍)
function getElementsByTagName() {
var elements = document.getElementsByTagName("p");
var results = [];
for(var i = 0; i < elements.length; i++) {
results.push(elements[i].childNodes[0].nodeValue);
}
}
XPath
function xpathSelector() {
var xpathResult = document.evaluate(
"//*/text()",
document,
null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE,
null
);
var results = [], res;
while(res = xpathResult.iterateNext()) {
results.push(res.nodeValue); /* Fixed a bug here. Thanks @theazureshadow */
}
}
此外,您可能会发现此讨论有帮助 - http://bytes.com/topic/javascript/answers/153239-how-do-i-get-elements-text-node
关于javascript - getElementsByTagName() 等效于 textNodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2579666/
亲爱的专家们,我对 javascript 还很陌生,我经常看到编码人员互换使用这些行。 document.body.getElementsByTagName(); 和 document.getElem
是否有代码可以使用javascript获取其他网站的元数据信息,例如标题、关键字?document.getElementById 将帮助获取当前文档的信息。同样是否有代码可以获取当前文档以外的信息。
问题是创建一个函数 showLink(),它有一个变量 sIndx,该变量指向当前选择列表中所选选项的索引。 Select a Web siteThe White House
首先声明我不是 JavaScript 开发人员,所以这个问题可能相当基础。 模拟IE的非标准时all我正在使用 getElementsByTagName("*") 属性,这两种方法之间是否存在显着的性
我正在开发一个使用 SOAP 调用将请求数据导入 Excel 的项目。我可以毫无问题地返回 XML,它看起来像这样。
我有以下 XML(它实际上是一个 gpx 文件) Move 12 2017-05-05T06:25:41.000Z
脚本有问题吗?或者 getElementsbyTagName 已被弃用? t=document.getElementsByTagName('input')[0]; document.write(t.
我的页面包含许多双击脚本 我在主体顶部插入了 js 代码(通过 s.src=('parts_async_dev.js')): var innerHTML = document.getElementsB
我认为它应该只返回完全匹配。 我在我必须使用的源代码中看到类似的内容: var someArray = someObject.getElementsByTagName("item"); 除了当我检查
我遇到了这个非常奇怪的 js 问题。 总之,如果我使用(document.getElementsByTagName("p"))[0],我会得到一个找不到的元素 如果p标签位于 div 内像这样 se
正如标题所示,我想排除脚本标记。 因为使用正则表达式时(至少我认为这是正确的名称:P) 我已经到了某事的地步 var wdc = /something/g; 包含在内 var foundwdc = w
有人可以解释一下为什么我的代码不起作用!! 当我通过 Id 获取元素时,它工作得很好。但与 getElementsByTagName() 相同的方法却不会。 如果我使用 querySelector()
我正在使用 python 的 xml.dom.minidom 来解析一个 xml。我必须从多个标签中获取元素并处理它们。场景是这样的: 我有两种标签类型,并且在我使用 getElementsByTag
我正在使用 Java 应用程序读取 XML 文件并对其进行处理。该应用程序在大多数情况下都有效,但在某些情况下则无效。我有一个包含项目列表的 XML 文档。该应用程序读取文档并编译所述项目的列表,如下
在 php 中,我可以在任何 DOM 对象上使用 getElementsByTagName,但 JavaScript 似乎没有这个概念。 IE 如果 var detailsNode 是一个特定的节点,
Favorite beverages : Tea Coffee Milk 我想要'ul'中'li'的总数 Method 1 : It doesn't w
我正在尝试更改我页面中每个 h1 的颜色,但使用此代码它不会更改任何内容: function toggleDark() { document.body.style.background = "#1
只是看看别人的.js代码来学习,这个使用jQuery的网站居然引用了: document.getElementsByTagName 我猜这比使用 jQuery 选择器更快,它在所有浏览器中都安全吗?
我正在研究基于 xml 内容显示图像的内容流。我正在将它构建为一个站点,因此它是 html 和 javascript,并且出于某些未知原因 - 相信我,我已经尽可能精细地梳理它 - 我的 javasc
我的最终目标是获取单选按钮列表并选中/取消选中它们。这是我的代码: for (var radio in document.getElementsByTagName('input')) {
我是一名优秀的程序员,十分优秀!