2009-10-13 40 views
19

Nếu tôi cần chỉ định một chức năng nhấp tự động, có cách nào để đảm bảo chức năng nhấp chuột chỉ được gán một lần và không được sao chép không?jquery ngăn chức năng trùng lặp được gán

this.click(function(){ 
    alert('test'); 
}) 

Trả lời

34

Bạn có thể unbind sự kiện click trước khi bạn gắn nó một lần nữa, như vậy bạn sẽ chỉ có một sự kiện gắn liền với nó:

//assuming this is a jquery object. 
this.unbind("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

Tính đến jQuery 1.7, nhấp bây giờ sử dụng .Trên (http://api.jquery.com/click/) vì vậy, mã đúng là bây giờ

//assuming this is a jquery object. 
this.off("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

Điều này sẽ hủy tất cả các sự kiện nhấp chuột (bao gồm cả những sự kiện được tạo bởi bất kỳ plugin nào bạn có thể đang sử dụng). Để đảm bảo bạn chỉ hủy liên kết sự kiện sử dụng không gian tên của mình. (http://api.jquery.com/off/)

//assuming this is a jquery object. 
this.off("click.myApp"); 
this.on("click.myApp", function(){ 
    alert("clicked once"); 
}); 

Ở đây myApp là không gian tên.

+0

Hoàn hảo, thực hiện chính xác những gì tôi muốn . Cảm ơn! – Roger

9

Tôi muốn thêm vào answer--

Trong tránh trùng lặp bindings Marius của bạn không muốn vô tình unbind một cái gì đó nếu có được coi là nhiều hơn một chức năng liên kết với một sự kiện. Điều này đặc biệt quan trọng khi bạn đang làm việc trên một cái gì đó với nhiều nhà phát triển. Để ngăn chặn điều này, bạn có thể sử dụng tính năng đặt tên sự kiện:

//assuming this is a jquery object. 
var alertEvent = 'click.alert' 
this.unbind(alertEvent).bind(alertEvent,function(){ 
    alert('clicked once'); 
}); 

'Cảnh báo' này là tên của không gian tên cho sự kiện nhấp của bạn và chỉ các chức năng của bạn bị ràng buộc với không gian tên đó sẽ bị vô hiệu.

15

Với jQuery .on() bạn có thể làm một cái gì đó như thế:

//removes all binding to click for the namespace "myNamespace" 
$(document).off('click.myNamespace'); 

$(document).on('click.myNamespace', '.selector', function(event) {...}); 

//this will be also removed (same namespace) 
$(document).on('click.myNamespace', '.anotherSelector', function(event) {...}); 
+1

Cảm ơn bạn đã trả lời câu hỏi này, sieppl. Chỉ cần kiểm tra tài liệu jQuery và nó nêu rõ: 'Như của jQuery 1.7, phương thức .on() là phương thức ưa thích để gắn các trình xử lý sự kiện vào một tài liệu. Đối với các phiên bản trước, phương thức .bind() được sử dụng để gắn một trình xử lý sự kiện trực tiếp vào các phần tử. Các trình xử lý được gắn với các phần tử hiện đang được chọn trong đối tượng jQuery, vì vậy các phần tử đó phải tồn tại tại thời điểm cuộc gọi đến .bind() xảy ra. Để kết nối sự kiện linh hoạt hơn, hãy xem phần thảo luận về sự kiện ủy nhiệm trong .on() hoặc .delegate(). ' Kết luận của tôi: đối với hầu hết các trường hợp, nó tốt hơn .bind() –

+0

@esco_: Có, tôi đã chuyển sang () hoàn toàn. Tôi không bao giờ sử dụng bind() mặc dù, nhưng ngừng sử dụng live() và delegate(). – sieppl

0

giả định rằng yếu tố đang được bổ sung vào html và bạn muốn thêm một sự kiện chỉ dành cho các yếu tố bổ sung:

function addEvents2Elements()//prevent Duplicate 
{ 
    //this will add the event to all elements of class="ele2addevent" 
    $('.ele2addevent').not('.clickbind').on('click',function(){alert('once');}) 

    //this will add a class an then the class="ele2addevent clickbind" 
    $('.ele2addevent').not('.clickbind').addClass('.clickbind'); 
    //all elements of class="... clickbind" will not be catched anymore in the first line because of .not() every time you call this function 
} 
addEvents2Elements(); 

được shure mà bạn chỉ thêm vào với class = "ele2addevent", bởi vì sau khi liên kết nó sẽ là class = "ele2addevent clickbind" và không bị bắt lại ...

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