2009-01-22 40 views
9

Có phương pháp tích hợp sẵn hoặc plugin mặc định defacto cho phép bạn tự động chỉ định một ID duy nhất cho một phần tử trong jQuery hay bạn cần thực hiện một cái gì đó như thế này không? Tôi đang tìm jQuery tương đương với Prototype's identify methodjQuery có tương đương với Element.identify của Prototype không?

Đây là một ví dụ. Tôi có một số cấu trúc HTML trên một trang có dạng như thế này

<span id="prefix_1">foo bar</span> 
... 
<div id="foo"> 
    <span></span> 
    <span></span> 
    <span></span> 
</div> 

Tôi muốn chỉ định từng ID sẽ là duy nhất cho trang. Vì vậy, sau khi gọi một cái gì đó như thế này

$('#foo span').identify('prefix'); //fake code, no such method 

DOM render sẽ giống như thế này

<span id="prefix_1">foo bar</span> 
... 
<div id="foo"> 
    <span id="prefix_2"></span> 
    <span id="prefix_3"></span> 
    <span id="prefix_4"></span> 
</div> 

Có điều gì chính thức-ish/mạnh mẽ cho jQuery, hoặc là một cái gì đó này hầu hết các nhà phát triển jQuery cuộn của riêng mình ?

+2

Tôi chưa bao giờ cần bất cứ điều gì như thế này ... Bạn sẽ sử dụng nó để làm gì? Lưu ý: jQuery làm việc với các bộ phần tử, trong khi Prototype làm việc với các phần tử riêng lẻ - bạn có thể điều chỉnh logic của mình tốt hơn để phù hợp với mô hình này. – Shog9

+0

Đó là một điểm thực sự tốt; Tôi đã dành 6 tháng cuối cùng với nguyên mẫu. Ban đầu tôi đã viết một tiện ích/plugin jQuery hoạt động trên một phần tử trang đơn, sử dụng trình xử lý #id để xử lý hookup. Tôi đã tìm ra cách dễ nhất để mở rộng mã của tôi để hoạt động trên một tập hợp sẽ là một hàm xác định.Sai rõ ràng –

+0

Thả nhận xét của bạn trong câu trả lời nếu bạn vẫn quan tâm đến đại diện ở phía bên kia của 10k. –

Trả lời

22
jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if(this.id) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while($('#' + id).length > 0);    
     $(this).attr('id', id);    
    }); 
}; 

$('span').identify('test'); 

Tested này trên:

<span id='test_2'></span> 
<span>test1</span> 
<span>test2</span> 
<span>test3</span> 

Turned nó để:

<span id="test_2"></span> 
<span id="test_1">test1</span> 
<span id="test_3">test2</span> 
<span id="test_4">test3</span> 
+1

Mã hoạt động và được đánh giá cao, nhưng tôi vẫn đang tìm kiếm thứ gì đó đã tồn tại một thời gian và tự chứng minh trong tự nhiên (không có cách nào chỉ trích mã được cung cấp của bạn) –

+0

Tôi poked quanh trang web jQuery trước khi viết và tôi không thể tìm thấy bất cứ điều gì, nhưng tôi nhận được nó từ nơi bạn đến. Tôi nghĩ rằng tôi đã bao quát mọi thứ. –

+0

Thực hiện tốt Paolo. – Prestaul

3

Không phải là tôi biết, nhưng bạn có thể tự làm điều này bằng cách thêm thuộc tính id và cung cấp GUID.

Để thêm thuộc tính:

$(foo).attr("id", createGuid()); 

Đối với việc thực hiện createGuid(), see this question.

Lưu ý rằng bạn có thể dễ dàng biến điều này thành jQuery plug-in để chức năng này (thậm chí bạn có thể đặt tên là identify()) có sẵn trên bất kỳ biểu thức $- nào.

+0

Vâng, nó không * quá * khó khăn một khái niệm để thực hiện. Một cách tiếp cận khác là lưu trữ một số tham chiếu về hàm plugin và tăng nó mỗi khi nó được gọi. Tôi đã/đang hy vọng cho một cái gì đó chính thức hơn mà sẽ bắt bất kỳ trường hợp cạnh tôi đã không nghĩ đến. –

+0

Hiểu và đồng ý về việc có được một phương pháp "bản địa" hơn! Tôi cũng quan tâm đến một câu trả lời tốt hơn ... –

+0

(Thông tin/mã được đánh giá cao và đáng để bỏ phiếu, trong trường hợp không rõ ràng) –

-1

Có thể thử

$("#foo span").each(function(){ 
    $(this).attr("id", "prefix_" + $(this).parent().index($(this))); 
}); 
+0

Những thông tin đó sẽ không độc đáo trên toàn cầu, mà bạn thường muốn trong một ID. –

2

Dựa trên Paolo của giải pháp:

jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if($(this).attr('id')) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while($('#' + id).length > 0);    
     $(this).attr('id', id);    
    }); 
}; 

$('span').identify('test'); 

Một thay đổi nhỏ sẽ tránh tính lại các id đã sử dụng.

+0

Đây là cách tôi đã có nó ban đầu, nhưng nếu chỉ có phần tử có tên 'test_2', nó sẽ nhảy thẳng đến 'test_3' mà không bao giờ làm 'test_1' - Tôi không chắc chắn rằng điều đó là mong muốn hay không. –

+0

Đúng, đó là vì đối số "i" trong cuộc gọi "từng". Tôi đã xóa nó để tránh vấn đề này. – gizmo

+0

Yup. Cũng đến đó. –

1

Tôi muốn thay đổi chức năng cho một chút và làm cho nó:

jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if($(this).attr('id')) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while(document.getElementById(id) != null);    
     $(this).attr('id', id);    
    }); 
}; 

ID có thể chứa các ký tự đặc biệt mà sẽ yêu cầu thoát để hoạt động đúng với động cơ CSS selector của jQuery - như "". Vì vậy, thay vì tìm kiếm chúng và thoát chúng, nó đơn giản và nhanh hơn để thay thế nó bằng phương thức tài liệu.

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