2013-08-09 25 views
16

Ai đó có thể giải thích sự khác biệt giữa event.preventDefault()event.stopPropagation() là gì?event.preventDefault vs event.stopPropagation

Tôi có bảng và bên trong bảng đó tôi có thẻ img.

Khi tôi nhấp vào thẻ img, tôi muốn xem cửa sổ bật lên.

Nhưng tôi cũng muốn để ngăn chặn sự lựa chọn của nhiều hàng, vì vậy tôi sử dụng:

$("table.items tbody tr").click(function(event) { 
     event.stopPropagation(); 
    }); 

Khi tôi sử dụng mã js, popup không xuất hiện;

Nếu tôi xóa mã js, cửa sổ bật lên sẽ hoạt động.

$(".info").live("click",function(e){ 
    //console.log('ok'); 
    e.stopPropagation(); 
    var elem = $(this); 
    var id = $(this).attr("id").replace("image_","container_"); 
    $('#'+id).toggle(100, function() { 
     if($(this).css('display') == 'block') { 
      $.ajax({ 
       url: "$url", 
       data: { document_id:elem.attr('document_id') }, 
       success: function (data) { 
        $('#'+id).html(data); 
       } 
      }); 
      } 
     }); 
}); 

Tại sao?

+2

Điều này sẽ giúp bạn http://davidwalsh.name/javascript-events – L10

+1

Vui lòng hiển thị cấu trúc html của bạn để chúng tôi biết vị trí hình ảnh có liên quan đến cấu trúc bảng – Huangism

+0

Quá muộn để dừng lựa chọn khi nhấp vào 'nhấp chuột'; sử dụng 'mousedown'. – canon

Trả lời

35

Tôi không phải là một chuyên gia về Javascript nhưng như xa như tôi biết:

stopPropagation được sử dụng để đảm bảo sự kiện này không làm bong bóng lên chuỗi. ví dụ. nhấp chuột vào thẻ <td> cũng sẽ kích hoạt các sự kiện nhấp chuột trên đó là phụ huynh <tr> và sau đó nhấp chuột vào phụ huynh <table>, v.v. stopPropagation ngăn điều này xảy ra.

preventDefault được sử dụng để dừng hoạt động bình thường của một phần tử, ví dụ: preventDefault trong trình xử lý nhấp chuột trên liên kết sẽ ngừng liên kết được theo dõi hoặc trên nút gửi sẽ ngừng gửi biểu mẫu.

+0

@CrisimIlNumenoreano nhận xét của bạn không có ý nghĩa. Câu trả lời của sevenseacat trông chính xác 100% đối với tôi và có thể được kiểm tra với câu trả lời trên [câu hỏi dup] (http://stackoverflow.com/questions/5963669/whats-the-difference-between-event-stoppropagation-and-event- preventdefault) cũng như với tài liệu jQuery cho [event.preventDefault()] (http://api.jquery.com/event.preventdefault/) và [event.stopPropagation()] (https: //api.jquery. com/event.stoppropagation /). – Trisped

+0

stopPropagation cũng dừng giai đoạn bắt giữ? –

+0

Tôi nghĩ rằng sự nhầm lẫn xung quanh hai chức năng (ba nếu bạn đếm 'stopImmediatePropagation') là một nghi ngờ về việc liệu tuyên truyền dừng tự động ngăn chặn mặc định quá. Nó có vẻ như nó có thể. – doug65536

6

Event preventDefault From W3C:

Các event.preventDefault() phương pháp dừng lại hành động mặc định của một phần tử xảy ra. Ví dụ:

Ngăn chặn một nút gửi từ nộp một mẫu đơn Ngăn chặn một liên kết từ sau URL

Event stopPropagation From W3C:

Phương pháp event.stopPropagation() dừng bọt của sự kiện cho yếu tố gốc, ngăn không cho bất kỳ trình xử lý sự kiện cha mẹ nào được thực thi .

7
  • stopPropagation trên một con sẽ dừng sự kiện đó xảy ra trên mẹ (toàn bộ tổ tiên)
  • preventDefault trên một con sẽ dừng sự kiện trên con nhưng nó sẽ xảy ra trên đó là cha mẹ (và cả tổ tiên nữa!)

Bây giờ trong mã của bạn là cha mẹ? đó là đứa trẻ?img là con tr là cha mẹ (cũng là ông bà thành thật), Vì vậy, hãy đoán xem mã stopPropagation nên ở đâu.

+0

Tôi nhận được ấn tượng điều này là sai. Tôi nghĩ stopPropagation KHÔNG ngừng hành động của đứa trẻ xảy ra? – user1884155

+0

Có thể bạn đang nói về preventDefault, nhưng nhận xét của tôi là nhằm vào giải thích stopPropagation. Người dùng rps đã sửa câu trả lời của mình sau bình luận của tôi. – user1884155

+0

@Trisped, @ user1884155 đúng, ví dụ bạn đang nói có vẻ là 'preventDefault'. Và ban đầu tôi đã mắc sai lầm khi nói rằng 'stopPropagation' sẽ ngăn chặn bất kỳ sự kiện nào của trẻ quá mà sau đó được sửa bởi @ user1884155. – rps