【问题标题】:Javascript E4X - Return the text of node and its children?Javascript E4X - 返回节点及其子节点的文本?
【发布时间】:2012-07-28 00:46:48
【问题描述】:

我正在尝试解析一些有重复代码行的 html,例如:

<a>This is <span>some text</span> but its <span>not grabbing the span</span> content</a>

所以我循环遍历对象并提取它:

object.a[i].text();

但它只返回

"This is  but its  content"

如何将子节点中的文本也作为一个字符串抓取?

干杯

【问题讨论】:

  • 它实际上是雅虎开放数据表中的 javascript。雅虎返回一个 E4X 对象,我只是用一个 js for 循环来循环返回的“a”标签数量的长度。如果没有简单的方法让 E4X 返回批次 - 我如何循环遍历孩子并保持文本字符串有序?编辑:没有可用的 jQuery
  • @Chris 根据我在 MDN 上阅读的内容,E4X 几乎已被弃用。如果 Yahoo 返回一个表示 XML 数据的字符串,您应该能够使用 jQuery 或类似的库来解析它......所以(在 ​​jQuery 中)......$( responseXML ).find( 'a' )...
  • 查看this 页面的最底部...它有某种儿童循环...我不确定它是否仍会抓取您的文字或只是其中的文字跨度...可能需要一些麻烦。
  • @Šime 谢谢,我通常不会在客户端使用它,但是 Yahoo 数据表中的查询将数据返回为 E4X 并且 javascript 正在服务器端运行,因此没有可用的 jquery/库 =(

标签: javascript e4x


【解决方案1】:

我不知道 E4X,但我可以假设纯 JavaScript 没问题吗?

textContentdoesn't seem to have great compatibility for IE prior to version 9。这在textContent 可用时有效。但是我没有 IE8,所以我无法使用它进行测试,但这应该也可以。

var obj = (!object.a[i].innerText) ? object.a[i].textContent : object.a[i].innerText;

这在客户端实现中有效,但由于它在您的实现中不起作用,我猜您将需要更具体的设置;不幸的是,我在那里无能为力。然而,我会再给它一个纯粹的 JS 刺。这会遍历 object.a[i] 的每个子节点,确定它是 textNode 还是 elementNode 并分别拉取数据或 innerHTML。

var doesThisWork = '';
var children = object.a[i].childNodes;
for(x in children){
doesThisWork += (children[x].nodeType === 1) ? children[x].innerHTML : children[x].data;
}

我将保留 jQuery 版本:

.contents:

object.a[i].contents().text();

【讨论】:

  • 再次感谢加里。这个 javascript 是由雅虎在服务器端运行的,所以只要他们支持它,就应该很甜蜜。不幸的是 .textContent 没有返回任何内容 =( 我现在使用 .toXMLString() 和一些狡猾的正则表达式来去除标签。如果有人能想出一个更优雅的解决方案,我将永远感激不已,但运行不佳暂时先这样。感谢您的努力。
  • 仍然从这些方法中的任何一个都没有返回任何结果 - 但我认为这只是 yahoos javascript 的不足 - 对于在一般 JS E4X 环境中搜索这个的任何人来说,答案都是正确的。再次感谢。
  • 我想我可以通过迭代孩子来解决一些问题。我会在它工作时更新。
  • 我在单独抓取子文本时遇到的问题是,您无法分别获取每个子文本之间的“a”标签文本。所以你会返回“这只是它的内容,一些文本没有抓住跨度”而不是“这是一些文本,但它没有抓住跨度内容” - 如果这有任何意义的话
  • 如果我理解正确,您可以返回任何作为直接子节点的文本节点,但不能返回任何子标签的内容?
【解决方案2】:

在 Rhino 中这会起作用:

var a = <a>This is <span>some text</span> but its <span>not grabbing <b>the</b> span</span> content</a>;
print(XML_innerText(a));

function XML_innerText(node) {
    var result = [];
    for each (var i in node.descendants()) {
        if (i.nodeKind() == 'text') {
            result.push(i);
        }
    }
    return result.join(' ');
}

在更高级的 ecma/js 变体中,您可以使用相同的代码,但将其移动到 XML.prototype.innerText 中,然后直接调用 a.innerText() 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多