2009-02-16 34 views
10

Tôi có một loạt hình thu nhỏ của hình ảnh trong một trang. Chúng được tạo ra bằng cách sử dụng sprites css.Tìm tên lớp phù hợp trong jQuery

<div class="galleryImg1"></div> 
<div class="galleryImg2 featured"></div> 
<div class="galleryImg3"></div> 

tôi ban đầu được sử dụng id="galleryImg1" nhưng thay đổi để sử dụng class="galleryImg1" vì những hình ảnh có thể xuất hiện ở nhiều vị trí trên cùng một trang và tôi muốn tránh id trùng lặp.

Tôi có bộ chọn jQuery để đính kèm các sự kiện nhấp vào tất cả các lớp này.

$("[class^=galleryImg]").click(function() { 
    // how do i get 'galleryImg2' and '2' here? 
} 

Điều tôi đang tự hỏi là có cách dễ dàng để tìm ra className bắt đầu bằng 'galleryImg' đã được nhấp vào. Tôi sẽ phải sử dụng một biểu thức chính quy hoặc có cách 'thông minh hơn' không?

(có nếu tôi đang sử dụng bộ chọn #ID thì tôi chỉ có thể nói 'this.id' nhưng như đã đề cập tôi không muốn sử dụng ID vì tôi muốn hiển thị nhiều bản sao của cùng một hình ảnh.)

Trả lời

19

Theo như tôi biết, bạn sẽ cần một biểu thức chính quy khá cơ bản, như vậy:

$("[class^=galleryImg]").click(function(Event) { 
    var id = this.className.match(/galleryImg(\d+)/)[1]; 
    console.log(id); 
}); 

Tuy nhiên, nếu bạn đặc biệt không thích điều này, bạn có thể sử dụng một cái gì đó như thế này, điều này sẽ không hợp lệ nhưng sẽ hoàn thành công việc.

<div class="galleryImg1" image_id="1"></div> 
<div class="galleryImg2 featured" image_id="2"></div> 
<div class="galleryImg3" image_id="3"></div> 

<script> 
$("[class^=galleryImg]").click(function(Event) { 
    var id = $(this).attr('image_id'); 
    console.log(id); 
}); 
</script> 

Vì tôi giả sử bạn có toàn quyền kiểm soát HTML của mình và bạn biết rằng thư việnTôi sẽ luôn tuân theo ID mà tôi không nghĩ biểu hiện chính quy ở đây là tà ác. Chỉ cần đi với nó!

+0

công việc thực hiện :-) cảm ơn. cộng với tôi không bao giờ nhớ cú pháp của các biểu thức thông thường trong javascript mặc dù khá thành thạo với chúng trong .NET :-) –

+0

Nếu bạn có nhiều lớp trong thuộc tính lớp của thẻ thì điều này có thể không hoạt động như mong đợi. Đây không phải là tìm kiếm từng lớp riêng lẻ mà đúng hơn là thuộc tính lớp. Ký tự đại diện chứa '* =' rất hữu ích trong trường hợp đó. –

1

Bạn có thể sử dụng Regex, nhưng việc chia nhỏ và lập chỉ mục sẽ được hiểu bởi nhiều lập trình viên hơn. Ngoài ra đối với một cái gì đó rất đơn giản, có lẽ tốt hơn để tránh Regex.

Trong xử lý sự kiện sử dụng jQuery bình thường đối tượng sự kiện:

$("[class^=galleryImg]").click(function(Event) { 
    var classAttribute=Event.target.className 

    var classes=classAttribute.split(" "); 

    for (var i=0;i<classes.length;i++) 
    { 
     if (classes[i].indexOf('targetClassNamePrefix')==0) 
     { 
      // This element has the required class, do whatever you need to. 

     } 
    } 
} 
+0

Ông muốn đưa ra ID ra khỏi đó, mặc dù. –

+0

@ash vấn đề với điều này là có thể có nhiều lớp. Tôi quên * đề cập rõ ràng nhưng đó là lý do tại sao tôi đặt tên một lớp với 'galleryImg2' –

+0

Tôi biết bạn có tên lớp nhiều, tôi chỉ mặc dù bạn đã hỏi về việc thực sự nhận được lớp cho phần tử được nhấp. Tôi cũng đã cập nhật câu trả lời của tôi, Regex là chậm hơn sau đó chỉ cần sử dụng chia Javascript và sau đó, indexOf() == 0. – Ash

2

Những gì tôi làm là một cái gì đó như thế này:

<div class="galleryImg 1"></div> 
<div class="galleryImg 2 featured"></div> 
<div class="galleryImg 3"></div> 

<script> 
$(".galleryImg").click(function(Event) { 
    var Class = $(this).attr('class').split(" "); 
    var id = Class[1] 
}); 
</script> 
+0

Không có cách nào để đảm bảo rằng số lượng sẽ là lớp thứ hai trong danh sách, đặc biệt là nếu bạn thao tác dom theo bất kỳ cách nào. Điều này có thể được sửa đổi bởi jQuery hoặc thậm chí có thể diễn giải khác nhau giữa các trình duyệt. – redbmk

+0

Ngoài ra, đối với hồ sơ, bạn không thể (hợp lệ) bắt đầu một tên lớp với một số. – James

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