2012-03-16 40 views
6
var $obj1 = $('a#one'); 
var $obj2 = $('a#two'); 
var $obj3 = $('a#three'); 

// Assume $('a#one, a#two, a#three') wasn't an option. 

Làm cách nào để gán một (cùng) trình xử lý sự kiện, ví dụ: click() cho ba đối tượng jQuery đó? Về cơ bản, tôi đang tìm kiếm một cách hiệu quả hơn thực hiện:Kết hợp/chuỗi nhiều đối tượng jQuery

$obj1.click(function() { /* Code A */ }); 
$obj2.click(function() { /* Code A */ }); 
$obj3.click(function() { /* Code A */ }); 
+1

'delegate' là bạn của bạn. – c69

+1

Tại sao không thêm lớp vào tất cả các đối tượng và sử dụng làm công cụ chọn? '$ ('a.codeA'). Click (function() {/ * Mã A * /});' –

Trả lời

7

Chỉ (rất) nhẹ ngắn hơn, nhưng:

$([$obj1, $obj2, $obj3]).click(function() { }); 

Bạn sẽ muốn xác định xử lý của bạn bên ngoài đầu tiên chức năng ẩn danh, vì vậy bạn thực sự có thể tốt hơn với phương pháp của Jonas H. Chỉ cần ném một đề xuất khác ra khỏi đó.

Lưu ý: bạn về mặt kỹ thuật có thể làm một lai, nhưng nó khá dài:

var f = function() { }; 
$([$obj1, $obj2, $obj3]).click(f); 

Thật câu hỏi này chỉ hữu ích nếu bạn muốn tránh $ a.click (f) hơn và hơn nữa, mà thực sự là một lựa chọn tốt hơn so với sự lạm dụng jQuery này. :)

+2

Bạn không cần vòng lặp '.each', bởi vì trình xử lý nhấp chuột được gắn vào tất cả các phần tử trong bộ sưu tập hiện tại. Xem ví dụ đầu tiên tại đây http://api.jquery.com/click/ –

+0

Oh bạn đã đúng! Tôi luôn luôn quên rằng các bộ chọn jQuery trả về các mảng thông thường. Sẽ chỉnh sửa. – Corbin

+2

Chỉ cần một lưu ý bỏ thuốc lá, cú pháp mảng trên không hoạt động nếu bạn đang chuỗi một hàm (ít nhất, trong jQuery 1.7.2) giống như hàm 'data' của jQuery. Vì vậy, điều này sẽ không hoạt động: '$ ([$ obj1, $ obj2]). Data (" property ", true);' nhưng điều này sẽ: '$ ($ obj1, $ obj2) .data (" property ", true);Hy vọng rằng sẽ giúp một ai đó. –

1
var myFunction = function() { /* Code A */ }; 

$obj1.click(myFunction); 
$obj2.click(myFunction); 
$obj3.click(myFunction); 
0

nhận vùng chứa chính và sử dụng jQuery .on() trên đó.

<div id="parent"> 
    <a href="#" id="one">1</a> 
    <a href="#" id="two">2</a> 
    <a href="#" id="three">3</a> 
</div> 

//any <a> clicked under parent executes this function 
$('#parent').on('click','a#one, a#two, a#three',function(){ 
    //do stuff 
}); 

phần tốt nhất của nó là: nó chỉ là một xử lý và đó là trong các phụ huynh. bạn không đặt nhiều trình xử lý trên nhiều phần tử. Ngoài ra, khi bạn sửa đổi trình xử lý, nó sẽ có hiệu lực cho tất cả. không cần phải thay đổi từng bộ xử lý cho từng phần tử có nó. demo here


http://api.jquery.com/on/

Ngoài khả năng của họ để xử lý các sự kiện trên các yếu tố hậu duệ chưa tạo ra, một lợi thế của sự kiện được giao là tiềm năng của họ cho overhead thấp hơn nhiều khi có nhiều yếu tố phải được theo dõi. Trên một bảng dữ liệu có 1.000 hàng trong tbody của nó, ví dụ này gắn một trình xử lý cho 1.000 phần tử:

Cách tiếp cận sự kiện được ủy quyền chỉ gắn một trình xử lý sự kiện cho chỉ một phần tử, và sự kiện chỉ cần bong bóng lên một cấp (từ tr nhấp vào để tbody)

+0

Và nếu anh ta có liên kết trong các container anh ta không muốn hoạt động trên? – Corbin

+0

anh ấy có thể thêm chúng vào tham số thứ hai, nhưng vẫn là một trình xử lý duy nhất. – Joseph

+0

Và sau đó ông chủ yếu làm những gì ông nói ông không muốn làm :) – Corbin

2

Hmm, luôn có .add(), nhưng cá nhân tôi thích viết ra .click() chức năng từng người một, nếu tôi bắt đầu ra với các biến riêng biệt nào. Không cần phải có thêm chi phí tạo các đối tượng jQuery mới cho các chức năng tầm thường như vậy.

$obj1.add($obj2).add($obj3).on('click' , function() { }); 
// not sure if $obj1.add($obj2, $obj3) will work as well 
+0

'$ obj1.add ($ obj2, $ obj3)' không hoạt động tức là trình xử lý sẽ không được gắn vào '$ obj3'. Mẫu: http://jsfiddle.net/sikusikucom/VsVcy/ – moey

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