2010-02-01 14 views
121

Nếu tôi đã điều sau đây:Sử dụng 'bắt đầu với' selector trên tên lớp cá nhân

<div class="apple-monkey"></div> 
<div class="apple-horse"></div> 
<div class="cow-apple-brick"></div> 

tôi có thể sử dụng bộ chọn sau đây để tìm hai DIV đầu tiên:

$("div[class^='apple-']") 

Tuy nhiên, nếu tôi có điều này:

<div class="some-other-class apple-monkey"></div> 
<div class="apple-horse"></div> 
<div class="cow-apple-brick"></div> 

Nó sẽ chỉ tìm DIV thứ hai, vì lớp div đầu tiên được trả về dưới dạng chuỗi (tôi nghĩ) và không thực sự bắt đầu với 'apple-' mà là 'some-'

Một con đường xung quanh đó là không sử dụng bắt đầu với, nhưng thay vì chứa:

$("div[class*='apple-']") 

Vấn đề với đó là nó cũng sẽ lựa chọn thứ 3 DIV trong ví dụ của tôi.

Câu hỏi: Thông qua jQuery, cách thích hợp để sử dụng bộ chọn biến vị ngữ trên tên lớp riêng lẻ, thay vì toàn bộ thuộc tính lớp như là một chuỗi là gì? Là nó chỉ là vấn đề lấy CLASS, sau đó tách nó thành một mảng và sau đó looping qua từng cá nhân với regex? Hoặc là có một giải pháp thanh lịch hơn/ít tiết?

Trả lời

231

Lớp học bắt đầu bằng "apple-" cộng với các lớp học có chứa "apple-"

$("div[class^='apple-'],div[class*=' apple-']") 
+4

+1. Mặc dù tôi đồng ý với gợi ý @parrots rằng "quả táo" nên là lớp riêng của nó ở đây, vì nó rõ ràng chồng chéo nhiều div nhưng là một thực thể riêng biệt. Nhưng điều này không giải quyết được vấn đề. – jvenema

+0

Hmm ... thông minh! Tôi đã không nghĩ đến việc sử dụng không gian trong đó. Có thể sử dụng toán tử boolean trong bộ chọn jquery không? Lý tưởng nhất, ở trên sẽ là 'OR' để tránh trường hợp (hiếm và có thể tránh được) khi có nhiều hơn một lớp nhìn chằm chằm với 'apple-' –

+0

Không chắc tôi hiểu, nhưng nếu bạn chỉ muốn sử dụng công cụ chọn thứ hai khi selector đầu tiên trả về các phần tử zero, bạn có thể làm một cái gì đó như thế này: 'var divs = $ (" div [class^= 'apple-'] "); if (divs.length == 0) divs = $ ("div [class * = 'apple -']"); ' –

10

Tôi khuyên bạn nên tạo "quả táo" là lớp riêng. Bạn nên tránh bắt đầu với/kết thúc-với nếu bạn có thể bởi vì có thể chọn bằng cách sử dụng div.apple sẽ nhanh hơn rất nhiều. Đó là giải pháp thanh lịch hơn. Đừng ngại chia nhỏ mọi thứ ra thành các lớp riêng biệt nếu nó làm nhiệm vụ đơn giản/nhanh hơn.

+0

Làm thế nào để bạn hình dung nó sẽ nhanh hơn rất nhiều? Nó vẫn phải quét toàn bộ DOM và đánh giá thuộc tính lớp. Nó sẽ nhanh hơn một chút (tốt nhất) vì nó sẽ không phải xâu chuỗi thuộc tính lớp. Không đủ điều kiện. –

+1

http: // www.componenthouse.com/article-19: Nếu bạn nhìn vào phần get by class, việc sử dụng cú pháp dấu chấm thường là nhanh hơn một chút so với việc xử lý lớp như là một thuộc tính. Thêm tìm kiếm chuỗi con (và công việc bổ sung mà anh ta sẽ phải làm để phá vỡ các phần tử có nhiều tên lớp) và nó sẽ bổ sung thêm một khoản tiết kiệm hiệu năng khá. – Parrots

+0

Tôi đồng ý. Việc nắm bắt được rằng chúng tôi vẫn hỗ trợ rất nhiều IE6 và nó không hỗ trợ các bộ chọn hợp chất trong CSS: .class1.class2.class3 như vậy, chúng tôi dựa vào việc sử dụng các tên lớp dài hơn trong đó 'tham số' được chia cho dấu gạch ngang. –

2

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

$("div[class]").filter(function() { 
    var classNames = this.className.split(/\s+/); 
    for (var i=0; i<classNames.length; ++i) { 
     if (classNames[i].substr(0, 6) === "apple-") { 
      return true; 
     } 
    } 
    return false; 
}) 
+0

cảm ơn vì điều đó. Đó cũng là khuynh hướng của tôi - tôi chỉ phải chia nó ra. –

2
<div class="apple-monkey"></div> 
<div class="apple-horse"></div> 
<div class="cow-apple-brick"></div> 

trong trường hợp này là câu hỏi Josh Stodola câu trả lời là đúng Các lớp bắt đầu bằng "apple-" cộng với các lớp học có chứa "apple-"

$("div[class^='apple-'],div[class*=' apple-']") 

nhưng nếu nguyên tố có nhiều lớp học như thế này

<div class="some-class apple-monkey"></div> 
<div class="some-class apple-horse"></div> 
<div class="some-class cow-apple-brick"></div> 

sau đó giải pháp Josh Stodola sẽ không làm việc
cho việc này phải làm một số điều như thế này

$('.some-parent-class div').filter(function() { 
    return this.className.match(/\bapple-/);// this is for start with 
    //return this.className.match(/apple-/g);// this is for contain selector 
}).css("color","red"); 

có thể nó sẽ giúp một số một else thanks

2

đây là tiền tố có

$("div[class^='apple-']")

này là dành cho bắt đầu với, do đó bạn không cần phải có '-' char trong đó

$("div[class|='apple']")

bạn có thể tìm thấy một loạt các biến thể mát mẻ khác của jQuery selector đây https://api.jquery.com/category/selectors/

0

Trong khi câu trả lời hàng đầu ở đây là giải pháp cho trường hợp cụ thể của người hỏi, nếu bạn đang tìm kiếm giải pháp để thực sự sử dụng 'bắt đầu bằng' trên từng tên lớp:

Bạn có thể sử dụng công cụ chọn jQuery tùy chỉnh này, mà tôi gọi là :acp() cho "Tiền tố lớp." Mã nằm ở cuối bài đăng này.

var test = $('div:acp("starting_text")'); 

này sẽ chọn bất kỳ và tất cả <div> yếu tố đó có ít nhất một tên lớp bắt đầu với chuỗi nhất định ("starting_text" trong ví dụ này), cho dù lớp đó là ở đầu hoặc ở nơi khác trong lớp chuỗi thuộc tính.

<div id="1" class="apple orange lemon" /> 
<div id="2" class="orange applelemon banana" /> 
<div id="3" class="orange lemon apple" /> 
<div id="4" class="lemon orangeapple" /> 
<div id="5" class="lemon orange" /> 

var containsapp = $('div:acp("app")'); 

này sẽ trở lại các yếu tố 1, 2, và 3, nhưng không 4 hoặc 5.

Đây là tuyên bố cho selector :acp tùy chỉnh, mà bạn có thể đặt ở bất cứ đâu:

$(function(){ 
    $.expr[":"].acp = function(elem, index, m){ 
      var regString = '\\b' + m[3]; 
      var reg = new RegExp(regString, "g"); 
      return elem.className.match(reg); 
    } 
}); 

Tôi đã thực hiện điều này vì tôi thực hiện rất nhiều trang web GreaseMonkey mà tôi không có quyền kiểm soát phụ trợ, vì vậy tôi thường cần tìm các phần tử có tên lớp có hậu tố động. Nó rất hữu ích.

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