2012-03-14 35 views
5

Tôi đang cố gắng tìm ra cách tốt nhất để loại bỏ trình xử lý sự kiện ẩn danh bằng cách sử dụng jQuery.Gỡ bỏ đúng trình xử lý sự kiện ẩn danh

tôi xác định một biến để giữ đối tượng của tôi jQuery:

var dom = $('#private-module'); 

Sau đó trong đối tượng của tôi:

run: function() { 
    var button, that = this; 

    button = dom.append('<button class="btn">Click Me</button>'); 
    button.on('click', function(event) { 
     console.log('Clicked!'); 
     that.destroy(); 
    }); 
    }, 

    destroy: function() { 
    var button; 

    button = dom.find('.btn'); 
    button.off('click'); 
    } 

Không có vấn đề gì tôi làm, tôi không thể giết handler nhấp chuột vào nút. Cảm giác như sự hiểu biết của tôi ở đây về phạm vi là thiếu sót. Cách ưa thích, trong tình huống này để loại bỏ xử lý là gì? Tôi đã cố gắng đặt tên cho các sự kiện và tất cả các loại nhưng không may mắn vì vậy tôi đoán nó là một cái gì đó đơn giản mà tôi đã bỏ qua. Có lẽ tôi thậm chí không nên sử dụng các hàm ẩn danh cho trình xử lý sự kiện.

Chỉ cần bolt một cái gì đó vào lập luận của tôi cho việc sử dụng .append:

http://jsperf.com/jquery-append-vs-appendto

Dưới đây là giải pháp cuối cùng:

dom.append('<button class="btn">Send Message</button>'); 
button = dom.find('.btn'); 
button.on('click', function (event) { 
    sendTestMessage(); 
    that.destroy(); 
}); 

Tôi cũng đồng ý và hiểu về việc sử dụng phương pháp .Một . Cảm ơn vì điều đó.

+1

Trên thực tế, bạn nên gõ 'one' chức năng cho việc này. – noob

Trả lời

7
button = dom.append('<button class="btn">Click Me</button>'); 

trả về số không, vì vậy bạn đã ràng buộc trình xử lý sự kiện trên dom.

Thay đổi:

button = $('<button class="btn">Click Me</button>').appendTo(dom); 

Và đây là working demo.

+0

Cảm ơn lời giải thích và ví dụ làm việc. Làm cho cảm giác hoàn toàn với tôi. – backdesk

1

vấn đề là buttondom và không .btn:

button = dom.append('<button class="btn">Click Me</button>'); 

//a console.log(button) here reveals that button is "dom" 

//and thus you are adding a handler to "dom 
button.on('click', function(event) { 
    console.log('Clicked!'); 
    that.destroy(); 
}); 

một cách để làm điều này nhờ vào sức mạnh đoàn .on() là thêm chọn con của nguyên tố này bạn muốn để ràng buộc xử lý như tham số thứ hai.

button.on('click', '.btn' function(event) { 
    //the value of "this" in here is the ".btn" 
    console.log('Clicked!'); 
    that.destroy(); 
}); 

trong phá hủy, chúng tôi sử dụng .off() với một tham số thứ hai liên quan đến .btn:

button.off('click', '.btn'); 
+0

Cảm ơn Joseph. Ví dụ bạn cung cấp dường như không hoạt động đối với tôi, có lẽ tôi đã nhầm lẫn điều gì đó. Xem ở trên cho những gì tôi định cư. – backdesk

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