2009-06-19 39 views
8

Tôi muốn tạo ra một mảng của tất cả các yếu tố html trong một div có chứa chuỗi văn bản, chẳng hạn nhưyếu tố phát hiện bằng văn bản sử dụng jQuery

<p>some string</p>. 

Tôi không muốn để có được giữ của chuỗi, tôi muốn các mục mảng là các phần tử (trong ví dụ, sẽ là nút p). Tôi không biết trước những gì các dây sẽ được, vì vậy tôi không thể tìm kiếm các giá trị chuỗi để phù hợp. Tôi cũng không muốn các nút văn bản trống rỗng kết thúc trong mảng.

Cảm ơn!

Trả lời

10
$("#my_div *").filter(function() 
{ 
    var $this = $(this); 
    return $this.children().length == 0 && $.trim($this.text()).length > 0; 
}) 

Phiên bản này sẽ không trở lại các yếu tố cha mẹ có chứa các yếu tố có văn bản, chỉ có yếu tố mức độ cuối cùng.

Có thể không phải là nhanh nhất nhưng hoạt động khá tốt trên trang chủ StackOverflow :)

+1

Từ thử nghiệm của tôi, đây là giải pháp chỉ trả về các phần tử có chứa văn bản, chứ không phải bố mẹ của họ. Cảm ơn !!! –

+0

Giải pháp tốt, đơn giản và sạch hơn tôi :) –

+1

$ ('\ *: không (: có (\ *))') có thể là cách tốt hơn để chọn các nút con (ít) lá ... chắc chắn ít đánh máy hơn. – Dave

1

Bạn có thể lướt qua các children và lấy tất cả những gì có giá trị .text()!= ""

+0

Điều đó nghe như một kế hoạch tốt nhưng tôi không biết jQuery đủ rõ để hiểu cách xây dựng cú pháp. Bạn có thể tạo một ví dụ không? Cảm ơn. –

0

d là div dưới mà bạn muốn tìm những thứ
v là một mảng trống
i bạn phải bắt đầu ra tại 0.

$ .trim được sử dụng để bạn không nhận được các nút chỉ là khoảng trắng.

$("*",d).filter(function() { 
    return $.trim($(this).text()) != "" 
    }).each(function() { 
    v[i] = $(this).text(); 
    i++; 
    }); 

Người ta cũng có thể sử dụng v.push ($ (this)) ... đó là thứ đã hoàn toàn lọt tâm trí của tôi.

+0

Điều này có vẻ đầy hứa hẹn, sẽ thử. Nếu tôi chỉ muốn các yếu tố, không phải là văn bản thực tế sẽ được phân công cuối cùng là: v [i] = $ (this); ? –

+0

Nó phụ thuộc vào việc bạn muốn nó là một đối tượng jQuery hay không. Nếu bạn muốn nó là một đối tượng jQuery, nó sẽ là $ (this). Nếu bạn chỉ muốn phần tử DOM, nó sẽ chỉ là điều này. – Thomas

+0

Và trên thực tế, bạn thậm chí sẽ không cần phải làm điều đó ... tất cả những gì bạn phải làm là loại bỏ .each(), vì mục đích duy nhất cho việc đó là kéo văn bản ra. (Xin lỗi, tôi đã phần nào bị phân tâm khi tôi đưa ra nhận xét cuối cùng – Thomas

1
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 là mảng các phần tử có một số văn bản trong chúng.

0
$(function() { 
     var array = new Array(); 
     $("#testDiv *").each(function(x, el) { 

      if ($.trim($(el).text()) != '') { 
       array.push(el); 
      } 
     }); 
     alert(array.length); 
    }); 
2

Bạn có thể tận dụng không và selectors trống để có được những yếu tố không có sản phẩm nào trong khi chuyển đổi thành một mảng có thể đạt được sử dụng có được

$("#theDiv > :not(:empty)").get(); 

Bộ chọn trên được tất cả các yếu tố con của "theDiv" và không trống (nghĩa là chúng có con hoặc văn bản) và sau đó chuyển đổi tập hợp đã khớp thành một mảng.

Nếu bạn muốn chỉ yếu tố có văn bản bên trong chúng, điều này sẽ làm việc ...

$("#theDiv > :not(:empty, :has(*))").get(); 

Để thoát khỏi các yếu tố có khoảng trắng, bạn có thể tận dụng bộ lọc

$("#theDiv > :not(:has(*))").filter(function() { 
       return $.trim(this.innerHTML).length > 0; 
     }).get(); 
+1

Điều này sẽ không hoạt động nếu anh ta muốn các phần tử CHỈ có văn bản bên trong. Điều này cũng trả về bất kỳ phần tử nào có con, ngay cả khi không có ai trong số đó có văn bản bên trong –

+1

Một lưu ý khác, điều này sẽ chỉ hoạt động trên các trẻ em ngay lập tức của div (không chắc chắn nếu đây là hành vi mong muốn hay không) Hủy bỏ các> để kiểm tra tất cả các tổ tiên. * cũng không phục vụ mục đích trong trường hợp này là –

+0

Cảm ơn bạn đã chọn lên * Tôi đã cập nhật câu trả lời của mình cho phù hợp –

7

Một công cụ chọn tùy chỉnh có thể hữu ích trong trường hợp của bạn:

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; 
}; 

Sau đó, bạn chỉ cần thực hiện việc này:

$('#someDiv :hasText') // will contain all elements with text nodes (jQuery object) 
$('#someDiv :hasText').get() // will return a regular array of plain DOM objects 

Tôi giả định rằng bạn chỉ đang cố gắng chọn các phần tử có văn bản CHỈ bên trong chúng.

+1

Câu trả lời tuyệt vời, chỉ cần một typo nhỏ - nodeType nên được kiểm tra thay vì nodeValue ... –

+0

Cuộc gọi tốt, lỗi của tôi –

0

Sử dụng: chứa selector:

var matches = new Array(); 
$('#start_point *:contains(' + text + ')').each(function(i, item) { 
matches.push(item); 
} 
+0

Ông nói rằng ông không có bất kỳ văn bản cụ thể để tìm kiếm. –

Các vấn đề liên quan