试图从带有filter()的节点获取文本,但是返回一个对象?

时间:2015-06-17 15:10:56

标签: javascript jquery dom text

我只是尝试使用

从DOM节点中提取没有任何元素的文本
var textIWant = $('.classname').contents().filter(function(){
                    return this.nodeType === 3;
                })[1];

这让我回想起看起来就像控制台中的一个字符串一样,没有修剪过像..

"           text I want      "

所以当我用

之类的东西修剪文本时
$.trim(textIWant)

我得到了

  

“[object Text]”

也如你所料,

typeof textIWant

返回“对象”

为什么这个字符串看起来对象不是字符串,我怎样才能得到我需要的字符串?我不能使用诸如String()或toString()之类的方法,它只会将它转换为我上面提到的相同“[object Text]”。

**编辑 我还想补充一点,我正在使用代理服务器,所以我没有直接访问原始HTML编写,否则,常识解决方案是将文本包装在HTML标记中并使用jQuery查询它。文本()。我的问题来自边缘案例场景,而不是不熟悉jQuery:)。

**回答

这样的事情似乎可以解决问题

$.trim($($('.classname').contents().filter(function(){
                    return this.nodeType === 3;
                })[1]).text())
谢谢。

4 个答案:

答案 0 :(得分:3)

你有一个TextNode对象,所以需要这样阅读:

var text = $(textIWant).text();

或原生

var text = textIWant.nodeValue;

答案 1 :(得分:2)

我认为你的问题没有理由说明为什么你需要直接处理文本节点。 jQuery将为您提取文本。

如果您只有一个匹配.classname的对象,那么从该元素获取文本的更简单方法是:

var textIWant = $.trim($(".classname").text());

这将收集.classname元素内所有文本节点的文本。您无需亲自过滤它们。

如果您有多个与.classname匹配的元素而您只想要第一个元素,那么您可以使用:

var textIWant = $.trim($(".classname").eq(0).text());

将来,如果你有一个textNode DOM元素并希望从中检索文本,你可以使用node.nodeValue从textNode获取文本。

关于你的其他问题:

  

为什么这个字符串看起来不是一个字符串,我怎么能得到它   我需要的字符串?

您正在检索文本节点DOM对象,而不是节点中的文本。您可以使用node.nodeValue从文本节点获取实际文本,然后您将拥有一个可以作为字符串操作的字符串。

  

我不能使用String()或toString()之类的方法   将其转换为相同的" [对象文本]"我把它放在上面。

这是因为你有一个文本节点,而不是一个字符串。您只需要从节点中获取文本,然后就可以将其用作字符串。

答案 2 :(得分:0)

在将代码分配给" textIWant"之前,请在代码中使用.toString()。变量或您可以通过此函数将其转换为字符串: http://www.w3schools.com/jsref/jsref_string.asp

注意:如果您的对象是DOM元素,您可以使用" text"来自jquery的函数: http://api.jquery.com/text/

答案 3 :(得分:0)

textIWant是一个Text节点。因此,当您将其抛入$.trim时,它将尝试在对象上运行它。

您可能想要询问TextNode的textContent

像这样。

$.trim(textIWant.textContent); //Does not work in IE8 or below

或者像Alex K.建议使用jQuery使用.text()

从节点获取文本
$.trim($(textIWant).text);

http://jsbin.com/welidanihe/edit?html,js,console