2009-05-02 2 views
10

Tôi đang cố gắng sắp xếp lại mã của mình và làm cho mã không rõ ràng hơn.Chức năng nhấp chuột jQuery vs inline onclick

Chủ yếu, có một liên kết để thực hiện một hành động. Nếu bạn nhấp vào liên kết, hành động được thực hiện thông qua ajax (mã ajax không có trên mã ở đây) và văn bản được thay thế bằng văn bản khác, cung cấp cho người dùng khả năng hoàn tác tác vụ. Nếu người dùng nhấp vào liên kết Hoàn tác, ajax sẽ khôi phục tình huống trước đó và văn bản cung cấp cho người dùng thực hiện tác vụ được hiển thị lại.

Tôi đã tạo một phiên bản đơn giản hơn về sự cố của mình trong một tệp html (mã bên dưới). Có hai đoạn văn. Nếu bạn nhấp vào liên kết của đoạn đầu tiên, sử dụng lệnh gọi onclick nội tuyến, mã hoạt động như mong đợi. Nhưng nếu bạn nhấp vào liên kết của đoạn thứ hai, sử dụng chức năng jQuery onclick, liên kết Hoàn tác không hoạt động và tôi không thể hiểu tại sao.

Bất kỳ trợ giúp nào? Cảm ơn rất nhiều!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 
    <title></title> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
    <script> 
     $(function() {  
      $(".add2").click(function(){ 
       var placeId = $(this).parents(".place").attr("id"); 
       $("#" + placeId + " .add2").remove(); 
       $("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>"); 
       return false; 
      }) 
      $(".undoadd2").click(function(){ 
       var placeId = $(this).parents(".place").attr("id"); 
       $("#" + placeId + " .actions").find("span.added, a.add2").remove(); 
       $("#" + placeId + " .actions").append("<a class='add2' onclick='copyPlace(\"" + placeId + "\"); return false;' href='#'>Add place</a>"); 
       return false; 
      }) 
     }); 

     function addPlace(placeId){ 
      $("#" + placeId + " .add").remove(); 
      $("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" onclick=\"undoAddPlace('" + placeId + "'); return false;\">Undo</a>"); 
      return false; 
     } 

     function undoAddPlace(placeId){ 
      $("#" + placeId + " .actions").find("span.added, a.undoadd").remove(); 
      $("#" + placeId + " .actions").append("<a class='add' onclick='addPlace(\"" + placeId + "\"); return false;' href='#'>Add place</a>"); 
      return false; 
     } 
    </script> 

</head> 
<body id="home"> 
    <div class="place" id="3435910"> 
     <p class="actions"><a href="#" onclick="addPlace('3435910'); return false;" class="add">Add place</a></p> 
    </div> 

    <div class="place" id="3435912"> 
     <p class="actions"><a href="#" class="add2">Add place</a></p> 
    </div> 
</body> 
</html> 

Trả lời

15

Vì bạn đang tự động thêm vào các mục mới vào DOM, bạn sẽ phải đăng ký handler nhấp chuột một lần nữa trên các mặt hàng mới.

Bạn có thể sử dụng .live cho việc này.


Cập nhật cách

Kể từ jQuery 1.7, phương pháp .on được ưa chuộng để làm điều này.

Vì jQuery 1.9 phương thức .live đã bị xóa.

+0

Live sẽ chỉ làm việc nếu chọn là giống hệt nhau. Trong trường hợp này, tôi nghĩ bộ chọn là duy nhất cho mỗi phần tử DOM. – tvanfosson

+0

Cảm ơn @wolfr. Tôi không biết điều này tồn tại. –

+0

Câu trả lời hay. Tôi biết mã js của tôi làm việc, nhưng không thể tìm ra những gì đã xảy ra ... sau khi đọc câu trả lời của bạn, tôi nhận ra rằng tôi đã gắn kết với các thẻ được hiển thị thông qua web proxy asp.net asp.net ... một lần nữa, cảm ơn sự giúp đỡ @Wolfr –

2

Vì bạn được tự động thêm các mục mới vào DOM, bạn sẽ phải đăng ký xử lý click một lần nữa trên các mặt hàng mới. jQuery đặt trình xử lý khi bạn gọi $('...').click(...).

1

Trình xử lý nhấp chuột không được chọn khi bạn thêm phần tử vào DOM. Hãy thử sử dụng jQuery để đăng ký xử lý nhấp chuột bằng cách thay đổi dòng (s) mà hình như:

$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" onclick=\"undoAddPlace('" + placeId + "'); return false;\">Undo</a>") 

Để

$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" >Undo</a>"); 
$('#' + placeId + " .actions").find("span:last").find("a").click(function() { 
    undoAddPlace(placeId); 
    return false; 
}); 

Bạn có thể có thể làm điều đó đơn giản hơn, nhưng có vẻ như bạn có thể được thêm nhiều hơn một khoảng để đoạn văn vì vậy tôi đã bảo thủ. Bạn cũng có thể chuỗi tắt phụ thêm, nhưng tôi nghĩ việc chọn lại làm cho điểm rõ ràng hơn.

2

Wow !! Cảm ơn tất cả các bạn!

Tôi đã đọc về các sự kiện trực tiếp và mã làm việc cuối cùng là:

$(function() {  
      $(".add2").click(function(){ 
       var placeId = $(this).parents(".place").attr("id"); 
       $("#" + placeId + " .add2").hide(); 
       $("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>"); 
       return false; 
      }) 
      $('.undoadd2').live('click', function(){ 
       var placeId = $(this).parents(".place").attr("id"); 
       $("#" + placeId + " .actions").find("span.added, a.undoadd2").remove(); 
       $("#" + placeId + " .add2").show(); 
       return false; 
      }); 

Trước đây tôi sử dụng remove() cho xóa các văn bản cung cấp để thực hiện các hành động. Tôi đã thay đổi nó cho ẩn/hiển thị vì vậy tôi không phải sử dụng trực tiếp cũng trong chức năng đầu tiên.

Cảm ơn bạn lần nữa!

4

Chỉ cần chứng minh việc sử dụng END() cho một giải pháp linh hoạt hơn:

$(function() {   
    $(".add2").click(function(){ 
      return $(this).parents(".place") 
       .find(".add2") 
        .hide() 
       .end() 
       .find(".actions") 
        .append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>"); 
    }); 
    $('.undoadd2').live('click', function(){ 
      return $(this).parents(".place") 
       .find(".actions") 
        .find("span.added, a.undoadd2") 
         .remove() 
        .end() 
       .end() 
       .find(".add2") 
        .show(); 
    }); 
});