Как использовать jQuery selector / find () для текстовой строки без вставки в DOM? - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть текстовая строка, которую я пытаюсь выбрать с помощью 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 ]

9 голосов
/ 07 ноября 2011

Вы хотите использовать 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 docs

:

Поставляемый селектор тестируется для каждого элемента;все элементы, соответствующие селектору, будут включены в результат.

find:

.find () метод позволяет нам искать потомков этих элементов вDOM-дерево и создайте новый объект jQuery из соответствующих элементов.

с вашим html-фрагментом, элемент-обертка отсутствует, поэтому нет потомков, поэтому find () не работает.

Вы в основном делаете:

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

Если вы хотите, чтобы find работал с 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 голос
/ 07 ноября 2011

Вы хотите использовать 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>, вероятно, является лучшим выбором, так что вам не нужно беспокоиться о глубине желаемых элементов.

...