如何在不插入DOM的情况下对文本字符串使用jQuery selector / find()?

时间:2011-11-07 02:28:01

标签: javascript jquery jquery-selectors documentfragment

我有一个文本字符串我试图选择使用jQuery的跨度。我想抓住没有将元素添加到dom中的跨度 - 如果可能的话?

在阅读jquery文档后,我假设我可以通过将字符串包装在jquery选择器标记中来创建片段,然后使用.find()来查找我想要的元素。

我的代码与此类似,但从最后一行的外观来看,显然没有选择任何跨度;任何帮助将不胜感激:

// 'text' is normally generated automatically... 
// just made it an escaped string for example purposes.
var text ="<span id=\"blah1\">Y</span><br/><span id=\"blah2\">o</span><br/>";
var spans = $(text).find('span');
console.log(text); // => <span id="blah1">Y</span><br/><span id="blah2">o</span><br/>
console.log(spans.length); // => 0 

感谢。

2 个答案:

答案 0 :(得分:9)

您想使用filter(),而不是find()

var text ="<span id=\"blah1\">Y</span><br/><span id=\"blah2\">o</span><br/>";
var spans = $(text).filter('span');
console.log(spans.length);

jsFiddle

来自jQuery文档

过滤器:

  

针对每个元素测试提供的选择器;所有元素   匹配选择器将包含在结果中。

查找

  

.find()方法允许我们搜索后代   这些元素在DOM树中构造一个新的jQuery对象   匹配元素。

使用你的html片段,没有包装元素,因此没有后代,因此find()不起作用。

你基本上是这样做的:

var elems = jQuery("<span id=\"blah1\">Y</span>").add("<br/>").add("<span id=\"blah2\">o</span>").add("<br/>");

如果您希望查找使用find(),则需要将其包含在元素中。

var text ="<span id=\"blah1\">Y</span><br/><span id=\"blah2\">o</span><br/>"; 
var spans = jQuery("<div></div>").append(text).find("span");
console.log(spans.length);

答案 1 :(得分:1)

您希望在这种情况下使用filter

var text ="<span id=\"blah1\">Y</span><br/><span id=\"blah2\">o</span><br/>";
var spans = $(text).filter('span');
console.log(spans.length); // 2

演示:http://jsfiddle.net/ambiguous/TGY3J/

或者将其打包在<div>中并使用find

var text ="<span id=\"blah1\">Y</span><br/><span id=\"blah2\">o</span><br/>";
var spans = $('<div>' + text + '</div>').find('span');
console.log(spans.length); // 2

演示:http://jsfiddle.net/ambiguous/qbCjk/

find适用于后代,但没有<div>包装,您的$(text)没有任何<span>个后代。将您的HTML包装在<div>中可能是您​​最好的选择,这样您就不必担心所需元素的深度。