2012-02-14 25 views
6

Đây là một ví dụ được cô đặc.Khi thực hiện một .replaceVới() trong jQuery, các ràng buộc sự kiện không được giữ nguyên

Hãy nhớ rằng lớp .chat-reply có trình xử lý sự kiện nhấp chuột được liên kết với nó.

HTML (Reply Button):

<div class="container"> 
    <a href="#" class="btn small chat-reply">Reply</a> 
</div> 

chức năng jQuery này được gọi là khi ai đó nhấp khác nút đó gửi một thông điệp đến máy chủ để được lưu trong cơ sở dữ liệu. Điều này được thực hiện thông qua ajax và được thực hiện thành công. Trong sự thành công nói trên .ajax()() gọi lại chức năng này được gọi là:

$.ajax({ 
     type  : 'GET', 
     url  : '/some_controller/some_method', 
     success : function(data) { 

     $('.container').replaceWith(data); 
    } 
}); 

Các 'dữ liệu' trong khi gọi lại thành công trên sẽ thay thế toàn bộ div .container bao gồm cả con nút .chat trả lời. Sau hàm replaceWith() này, sự kiện click không còn bị ràng buộc với nút nữa.

Về mặt logic, tôi đang cố gắng để người dùng cuối đăng thông báo lên dòng thời gian, sau đó hiển thị thông báo đó trong dòng thời gian mà không cần cần làm mới màn hình.

Trả lời

1

Quyết định về một giải pháp khá không-để-tao nhã một phần nhờ vào bài đăng này: Events not registering after replaceWith

Tôi tạo ra một chức năng gọi là wireUpChatReply() mà liên kết với một sự kiện click vào nút .chat trả lời.

Sau khi thay thế bằng(), tôi thực hiện cuộc gọi đến wireUpChatReply() để rebind các sự kiện.Tôi thực hiện cuộc gọi này với wireUpChatReply trên document.ready.

Nó không đẹp nhưng nó hoạt động.

3

Grab jquery 1.7 mà bây giờ sử dụng 'bật' để ràng buộc: http://blog.jquery.com/2011/09/28/jquery-1-7-beta-1-released/

Hoặc nếu < 1,7 sử dụng 'sống' thay vì 'ràng buộc' vì nó sẽ tìm kiếm những thay đổi DOM và áp dụng lại các sự kiện của nội dung đã thay đổi . Nếu không, bạn có thể đăng ký lại sự kiện trên cuộc gọi lại của mình.

Api cũ để thay thế để liên kết với trình xử lý sự kiện loại trực tiếp sau khi thay đổi DOM.

$ (selector) .live này (sự kiện, fn)

trở thành $ (document) .Trên này (sự kiện, chọn, fn)

Hoặc trong mã

Điều này

$(".container a.chat-reply").live("click", function(){ 
// do it live! 
}); 

Trở thành điều này trong 1.7

$(".container").on("click", "a.chat-reply", function(event){ 
// do it live! 
}); 

Với các tùy chọn khác nhau để chọn đối tượng bạn muốn.

+0

của bạn ví dụ mã là một chút bối rối với tôi. Nếu bạn không nhớ làm rõ một chút, điều đó sẽ rất tuyệt. – generalopinion

+0

Sry khối đã chỉ chỉ từ cũ 'sống' để 'trên' nhưng ví dụ của Vigrond là làm thế nào bạn làm một 'trên'. Nó sẽ gần như tốt hơn để đính kèm sự kiện sau khi nhận được html trong cuộc gọi lại của bạn. –

2

Trong handler nhấp chuột của bạn, sử dụng .Trên() như là một đại biểu thay

$("div.container").on("click", "a.chat-reply", function(even){ 
    //click handler here 
}); 

sự kiện sẽ 'bong bóng' lên đến container, và nếu nó phù hợp với a.chat-replay nó sẽ kích hoạt.

+0

Các "bubbling lên" làm việc tuy nhiên một khi tôi làm một replaceWith(), những ràng buộc sự kiện đã biến mất - vẫn còn. – generalopinion

+0

tất nhiên. xấu của tôi, replaceWith sẽ thay thế toàn bộ phần tử. Thay vào đó, bạn có thể làm .html (nội dung) không? Điều đó sẽ thay thế nội dung của nó, không phải là phần tử .container. Nếu không, bạn sẽ phải bắt đầu xem xét tổ tiên của .container để đính kèm trình xử lý sự kiện .on vào. – Vigrond

+0

Ewww. Điều đó có thể trở nên khó chịu. Tôi đã tìm thấy một bài đăng khác đề xuất có chức năng "kết nối" sự kiện ràng buộc. Sau đó gọi lại sau SAU thay thế(). Nó không đẹp nhưng tôi có thể không có nhiều sự lựa chọn. – generalopinion

0

Hai câu trả lời liên quan đến sự kiện trực tiếp không khắc phục được sự cố, vì chính vùng chứa được thay thế và sự kiện ràng buộc đã biến mất.

Thay vì rebinding các sự kiện, trong trường hợp bạn cần phải biết những sự kiện đã bị ràng buộc, bạn có thể làm như sau:

$(".container").parent().on("click", ".container a.chat-reply", function(){ 
    // do something 
}); 

hoặc, nếu có một số container:

$(document.body).on("click", ".container a.chat-reply", function(){ 
    // do something 
}); 
Các vấn đề liên quan