2012-01-15 28 views
8

Vì một số lý do jQuery.off ('click') dường như không hoạt động ở đây. Khi nút 'Có' được nhấp vào mô hình, một mô hình khác chỉ bật lên. Tôi đang làm gì sai?jQuery.off() không loại bỏ ràng buộc

mã:

$(function(){ 

    //If there are warnings on the page bind alert 
    if ($('.renewal-warning').length > 0){ 

    (function(){ 

     $('#signRentalContainer').on('click', '.renewal-warning', function(e){ 

     var buttonHandle = this; 

     //Prevent submission 
     e.preventDefault(); 

     //Show warning model 
     $.modal({ 
      content: $('#renewalWarning').html(), 
      title: "Order Renewal Warning", 
      buttons: { 
      'Yes': function(win) { $(buttonHandle).off('click').click(); }, 
      'No': function(win) { win.closeModal(); } 
      }, 
      maxWidth: 250, 
      closeButton: false 
     }); 
     }); 
    })(); 
    } 
}); 

Trả lời

10

Đẹp, chắc chắn bạn sẽ cần phải cung cấp cho nó cùng một nguyên tố, cũng như chọn tương tự.

$('#signRentalContainer').off('click', '.renewal-warning'); 

Trong xử lý .on(), this là yếu tố '.renewal-warning' mà được nhấp, không phải là yếu tố #signRentalContainer.


Nếu có một số các yếu tố '.renewal-warning', và bạn chỉ muốn vô hiệu hóa một lúc, cách đơn giản nhất là thay đổi lớp của nó để nó không còn phù hợp với selector.

$(this).removeClass('renewal-warning') 
     .addClass('renewal-warning-disabled'); 
+0

Tại sao bộ xử lý không hoạt động trong trường hợp này? Tôi nghĩ jQuery đã thay đổi phạm vi để phù hợp với sự kiện này? – Steven

+0

@Steven: Ồ, đó là lý do tại sao bạn đang thực hiện '.off()'? Tôi đoán sự kiện là sủi bọt. Thay vì 'off()', hãy thử thêm 'e.stopPropagation()' vào trình xử lý. –

+0

... hoặc có thể là do '.click()' mà bạn đang thực hiện trên phần tử đã được nhấp. Tại sao lại có? Thử xóa nó đi. –

3

this tham khảo các nội dung của hàm xử lý, không phải là chức năng riêng của mình.

Cố gắng làm cho nó một hàm có tên, sau đó đề cập đến nó khi bạn gọi off:

$("body").off("click", '#signRentalContainer', buttonHandle);

BTW, lý do nào đó chúng tôi không thể sử dụng unbind trực tiếp ở đây?

$("#signRentalContainer").unbind("click");

+2

lý do không sử dụng unbind: Chỉ cần thử gắn bó với những gì mà nhóm jQuery đề xuất. "Kể từ jQuery 1.7, .on() và.Các phương thức off() được ưu tiên để đính kèm và loại bỏ các trình xử lý sự kiện trên các phần tử. "[Nguồn] (http://api.jquery.com/unbind/) – Steven

+0

@Steven nhận nó :) – satoru

+1

@Steven" ưa thích ".. đó là Tôi không muốn nghe về tài liệu, đó là cách để làm hoặc không phải là cách để làm .. "ưa thích" nghe có vẻ điên rồ –

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