2009-05-01 38 views
22

Tôi có một đối tượng (trong trường hợp này là một đối tượng đánh giá từ js-kit) mà tôi muốn vô hình nếu giá trị xếp hạng là 'chưa được xếp hạng'. Tôi đang gặp rắc rối với việc chọn đúng bộ chọn jQuery để thực hiện việc này.Bộ chọn jQuery nơi văn bản = một số giá trị

Mặc dù mã bên dưới có vẻ như nó hoạt động nhưng nó không hoạt động.

$(".js-rating-labelText:contains('unrated')").css("visibility", "hidden"); 

.js-rating-labelText là lớp được đặt trên văn bản.

+4

Bạn có thể dán HTML bạn đang chạy này không? –

+0

Một chút phức tạp của nó (đối với tôi ít nhất) vì nội dung của div xếp hạng đang được lấp đầy bởi chức năng javascript js-kit và do đó không có sẵn ở thời gian thiết kế. Div rỗng (để bắt đầu) và trông như thế này:

+0

Thật kỳ lạ, thay đổi hàm jquery để thêm dấu ngoặc đơn thứ hai - trông có vẻ sai vì không có dấu ngoặc mở phù hợp ... $ ("# ratingDiv : contains ('unrated')) "). css (" hiển thị "," ẩn "); ... khiến mục đầu tiên trong danh sách hiển thị không hiển thị. –

Trả lời

19

Có một cách khác để chọn một yếu tố dựa trên nội dung văn bản không?

Hãy thử điều này:

$('.js-rating-labelText').filter(function(){ 
    return (/unrated/i).test($(this).text()) 
}).css('visibility', 'hidden'); 
+0

Vâng! Tôi đặt giá trị dựa trên lớp của cha mẹ và sử dụng phương thức .hide() nhưng điều này làm việc cho tôi. Cảm ơn bạn rất nhiều! $ ('. Js-kit-rating'). Filter (function() {return (/Unrated/i).test ($ (this) .text())}). Hide(); –

+0

Bạn được chào đón. Vui mừng nó cuối cùng đã làm việc. – brianpeiris

0

Đảm bảo mã của bạn đang chạy sau chức năng js-kit đã điền văn bản chứ không phải trước văn bản.

+0

Nó thực hiện theo các cuộc gọi script js-kit. Cảm ơn. –

-1

Dưới đây là một số trong những html đến từ chức năng javascript:

<div class="js-kit-rating" id="ratingDiv" style="width: 86px; visibility: hidden;" jk$initialized="true" path="/business/blogger-com" permalink="/businessblogger-com" freeze="yes" starcolor="Golden"> 
    <table class="js-ratings-tableWrapper" border="0" cellSpacing="0" cellPadding="0"> 
    <tbody> 
     <tr> 
     <td> 
      <div class="js-ratingWrapper" style="width: 80px;"> 
      <div style="float: left; cssfloat: left;"> 
       <div style="width: 80px; height: 15px;"> 
<div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png"> 
    <img style="display: none;" src="//js-kit.com/images/stars/golden.png" complete="complete"/> 
<div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png"/> 
<div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png"/> 
<div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/gray.png"> 
    <img style="display: none;" src="//js-kit.com/images/stars/gray.png" complete="complete"/> 
<div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/gray.png"/> 
<div class=" js-rating-labelText"> 
+0

Từ những gì bạn đã nói với chúng tôi cho đến nay, tôi thấy không có lý do tại sao nó không nên làm việc. Sẽ rất hữu ích nếu bạn muốn, để sao chép sự cố trên máy chủ lưu trữ công khai (ví dụ: jsbin.com). – brianpeiris

0

Bạn có thể xem xét sử dụng hide()/show() phương pháp là tốt.

$(".js-rating-labelText:contains('unrated')").hide() 
+0

$ (". Js-rating-labelText: contains ('Chưa được xếp hạng'))"). Hide(); Làm cho cả văn bản được xếp hạng và chưa được phân loại đều biến mất. –

7

Có thể vấn đề là với phần :contains('Unrated') của hàm. Như thay đổi các văn bản đối với bất kỳ giá trị ngẫu nhiên tạo ra kết quả tương tự:

$("#ratingDiv:contains('somerandomtext')").hide(); 
+0

Có cách nào khác để chọn một phần tử dựa trên nội dung văn bản không? –

+0

phải là '$ (" # ratingDiv: contains ('somerandomtext') "). Hide();' không có dấu đóng ngoặc bên trong? – muyueh

0

Dựa trên mã HTML mà bạn cung cấp, tôi không thấy nơi văn bản 'unrated' bạn đang thử nghiệm cho là đến từ.

Tuy nhiên, nếu đó là toàn bộ văn bản trong div đó, chỉ cần kiểm tra trực tiếp.

if ($('.js-rating-labelText').text() == 'unrated'){ 
    $(this).hide(); 
} 
+0

Đó không phải là bộ chọn. :/ –

+0

Vậy, bạn của tôi! –

+2

Không biết khi nào tôi viết điều đó hoặc tại sao lol. –

21

Bạn có thể tạo các phương pháp chọn của riêng bạn

Ví dụ, nếu bạn muốn để có thể làm như sau:

$('.js-rating-label:hasText(unrated)'); 

Bạn có thể xác định phương pháp hasText như sau

$.expr[':']['hasText'] = function(node, index, props){ 
    return node.innerText.contains(props[3]); 
} 

props[3] chứa văn bản bên trong dấu ngoặc sau ': hasText'.

+0

Câu trả lời hay, điều này sẽ rất hữu ích! – CurlyPaul

+1

Đây là một câu trả lời tuyệt vời. Tôi phải thay đổi hàm trả về thành: return node.innerText.indexOf (props [3])> -1; – mrmillsy

0

Cách tốt nhất để giải thích chủ đề này là bằng cách cho một ví dụ và một liên kết tham khảo: -

Ví dụ: - Cú pháp selector jQuery sau đây chọn phần tử đầu tiên hay thứ n từ tập các đã chọn (phù hợp) các phần tử HTML.

$("selector:contains(searchText)") 

Html: -

<table> 
<tr><td>John Smith</td><td>Marketing</td></tr> 
<tr><td>Jane Smith</td><td>Sales</td></tr> 
<tr><td>Mike Jordon</td><td>Technology</td></tr> 
<tr><td>Mary Jones</td><td>Customer Support</td></tr> 
</table> 
Search: <input id="txtSearch" type="text"> 
<input id="btnTestIt" type="button" value="Test It"> 
<input id="btnReset" type="reset" value="Reset"> 

Jquery: -

$(document).ready(function(){ 
    $("#btnTestIt").click(function(){ 
     var searchText = $("#txtSearch").val(); 
     $("td:contains('" + searchText + "')").css("background-color", "yellow"); 
    }); 
    $("#btnReset").click(function(){ 
     $("td").css("background-color", "white"); 
    }); 
}); 
0

Một biến thể nhẹ về câu trả lời tuyệt vời @ tgmdbm của. Sự khác biệt duy nhất là nó chỉ chọn các nút có một nút văn bản con duy nhất khớp chính xác với đối số hasText(). Trong khi đó, .innerText trả về kết nối của tất cả các nút văn bản con cháu.

if(! $.expr[':']['hasText']) { 
    $.expr[':']['hasText'] = function(node, index, props) { 
     var retVal = false; 
     // Verify single text child node with matching text 
     if(node.nodeType == 1 && node.childNodes.length == 1) { 
     var childNode = node.childNodes[0]; 
     retVal = childNode.nodeType == 3 && childNode.nodeValue === props[3]; 
     } 
     return retVal; 
    }; 
    } 
Các vấn đề liên quan