2009-04-20 1 views
19

Khi tôi replaceWith một yếu tố để đưa một trong DOM, sau đó replaceWith nó trở lại, các sự kiện đã đăng ký để nó không kích hoạt. Tôi cần sự kiện để giữ nguyên vẹn.Sự kiện không đăng ký sau khi thay thếWith

Dưới đây là Javascript tôi:

var replacement = $(document.createElement('span')); 
var original = $(this).replaceWith(replacement); 

replacement 
    .css('background-color', 'green') 
    .text('replacement for ' + $(this).text()) 
    .click(function() { 
     replacement.replaceWith(original); 
    }); 

Live demo

Trong bản demo, khi bạn nhấp vào một phần tử, nó được thay thế bằng một yếu tố khác sử dụng replaceWith. Khi bạn nhấp vào phần tử mới, phần tử mới được thay thế bằng phần tử gốc bằng cách sử dụng replaceWith. Tuy nhiên, trình xử lý nhấp chuột không hoạt động nữa (nơi tôi nghĩ là cần).

+1

Bạn đã kết thúc bằng cách sử dụng tính năng kết nối lại sự kiện hay bạn có thể đưa sự kiện trực tiếp vào hoạt động không? Tôi đang làm điều tương tự, và rất thích học hỏi từ kinh nghiệm của bạn. –

+0

@Erick T, tôi xin lỗi, nhưng tôi thành thật không thể nhớ được. Tôi đã hỏi câu hỏi này gần hai năm trước. Tôi nghĩ rằng việc sử dụng '$ .fn.live' không hoạt động vì tôi đang xử lý các phần tử thực, chứ không phải là một bộ chọn. ('$ .fn.delegate' (không tồn tại sau đó) có thể làm việc cho bạn như là một thay thế' live'.) Vì câu trả lời tôi đã chọn, tôi cho rằng tôi đã kết thúc việc gắn lại trình xử lý sự kiện. Bạn có thể thử nhân bản sâu phần tử (IIRC có thể giữ các trình xử lý sự kiện trong jQuery mới nhất). – strager

Trả lời

11

Vì khi bạn thay thế phần tử gốc, các sự kiện được liên kết với nó sẽ bị xóa. Bạn sẽ cần phải tái đính kèm xử lý sự kiện trên clickoriginal sau khi cuộc gọi đến replacement.replaceWith(original):

$(function() 
{ 
    function replace() 
    { 
     var replacement = $(document.createElement('span')); 
     var original = $(this).replaceWith(replacement); 

     replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .click(function() 
     { 
      replacement.replaceWith(original); 
      original.click(replace); 
     }); 
    } 

    $('.x').click(replace); 
}); 
+2

Tôi muốn có một cách tự động/thanh lịch để làm điều này. Tôi đoán giải pháp này sẽ phải làm. – strager

+1

@strager: Bạn có thể thử đề xuất sự kiện trực tiếp của Matt hoặc triển khai phiên bản được nhắm mục tiêu cho mục đích của riêng bạn. Có những tác dụng phụ nghiêm trọng (và khó chịu) trong * các trình duyệt nhất định * nếu bạn không tách các sự kiện khỏi các phần tử tách rời, vì vậy bạn thực sự muốn nó hoạt động theo cách này. – Shog9

+0

Điều này không có ý nghĩa. Các phần tử có thể có các sự kiện mà không được đính kèm với DOM, vậy tại sao chúng sẽ xóa chúng khỏi DOM loại bỏ các sự kiện? Phải là một số quyết định cụ thể về hiệu suất, tốt ... – Alex

3

live events là những gì bạn đang tìm kiếm

+0

Có thể là những gì tôi cần. Tôi sẽ xem xét nó. – strager

+0

Dường như không hoạt động. Odd. = S – strager

+1

Không còn hoạt động như jQuery 1.9 – YaDa

4

CẬP NHẬT: live()bind() đã bị phản đối, trong ủng hộ on().

Bạn có thể sử dụng live()bind() sự kiện, đây là mã mới của bạn:

$(function() { 
$('.x').live('click', function() { 
    var replacement = $(document.createElement('span')); 
    var original = $(this).replaceWith(replacement); 

    replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .bind('click', function() { 
      replacement.replaceWith(original); 
     }); 
}); 
}); 

kiện -Live làm việc với jQuery 1.3 và cao hơn.

-nếu bạn muốn ngừng sử dụng chức năng tuyên truyền trực tiếp die().