поиск элементов с текстом с помощью jQuery
Я хочу создать массив всех html-элементов в div, которые содержат текстовые строки, такие как
<p>some string</p>.
Я не хочу захватывать строки, Я хочу, чтобы элементы массива были элементами (в примере это был бы узел p). Я не знаю перед рукой, какие строки будут, поэтому я не могу искать строковые значения для соответствия. Я также не хочу, чтобы пустые текстовые узлы заканчивались в массиве.
спасибо!
8 ответов
$("#my_div *").filter(function()
{
var $this = $(this);
return $this.children().length == 0 && $.trim($this.text()).length > 0;
})
эта версия не будет возвращать родительские элементы, содержащие элементы с текстами, только элементы последнего уровня.
может быть не самый быстрый, но работает довольно хорошо на домашней странице StackOverflow:)
пользовательский селектор может быть полезен в вашем случае:
jQuery.expr[':'].hasText = function(element, index) {
// if there is only one child, and it is a text node
if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) {
return jQuery.trim(element.innerHTML).length > 0;
}
return false;
};
после этого, вы можете просто сделать это:
$('#someDiv :hasText') // will contain all elements with text nodes (jQuery object)
$('#someDiv :hasText').get() // will return a regular array of plain DOM objects
Я предполагаю, что вы только пытаетесь выбрать элементы, которые имеют только текст внутри них.
вы можете использовать не и пустые селекторы, чтобы получить непустые элементы при преобразовании в массив, можно достичь с помощью get
$("#theDiv > :not(:empty)").get();
вышеупомянутый селектор получает все дочерние элементы "theDiv" и которые не пусты (т. е. у них есть дети или текст), а затем преобразует сопоставленный набор в массив.
Если вы хотите только элементы, которые имеют текст внутри них, это должно работать...
$("#theDiv > :not(:empty, :has(*))").get();
чтобы избавиться от элементов, которые пробелы вы можете использовать filter
$("#theDiv > :not(:has(*))").filter(function() {
return $.trim(this.innerHTML).length > 0;
}).get();
var array = [];
var divSelector = "div.mine";
$(divSelector).contents().each(function()
{
// If not an element, go to next node.
if (this.nodeType != 1) return true;
var element = $(this);
if ($.trim(element.text()) != "")
array.push(element);
});
array
- это массив элементов, в которых есть некоторый текст.
$(function() {
var array = new Array();
$("#testDiv *").each(function(x, el) {
if ($.trim($(el).text()) != '' ) {
array.push(el);
}
});
alert(array.length);
});
d-это div, под которым вы хотите найти вещи
v-пустой массив
я должен начать с 0.
долларов.trim используется, чтобы вы не получали узлы, которые являются просто пробелами.
$("*",d).filter( function() {
return $.trim($(this).text()) != ""
} ).each( function() {
v[i] = $(this).text();
i++;
} );
можно также использовать v. push ($(this))...что совершенно вылетело у меня из головы.
используйте селектор: contains:
var matches = new Array();
$('#start_point *:contains(' + text + ')').each(function(i, item) {
matches.push( item );
}