Phương thức JQuery .on () có nhiều trình xử lý sự kiện cho một bộ chọn


139

Cố gắng tìm ra cách sử dụng phương thức Jquery .on () với một bộ chọn cụ thể có nhiều sự kiện liên quan đến nó. Trước đây tôi đã sử dụng phương thức .live (), nhưng không hoàn toàn chắc chắn làm thế nào để thực hiện cùng một kỳ công với .on (). Xin vui lòng xem mã của tôi dưới đây:

$("table.planning_grid td").live({
  mouseenter:function(){
     $(this).parent("tr").find("a.delete").show();
  },
  mouseleave:function(){
     $(this).parent("tr").find("a.delete").hide();        
  },
  click:function(){
    //do something else.
  }
});

Tôi biết tôi có thể chỉ định nhiều sự kiện bằng cách gọi:

 $("table.planning_grid td").on({
    mouseenter:function(){  //see above
    },
    mouseleave:function(){ //see above
    }
    click:function(){ //etc
    }
  });

Nhưng tôi tin rằng việc sử dụng .on () đúng cách sẽ như vậy:

   $("table.planning_grid").on('mouseenter','td',function(){});

Có cách nào để hoàn thành nó không? Hoặc thực hành tốt nhất ở đây là gì? Tôi đã thử mã dưới đây, nhưng không có xúc xắc.

$("table.planning_grid").on('td',{
   mouseenter: function(){ /* event1 */ }, 
   mouseleave: function(){ /* event2 */ },
   click: function(){  /* event3 */ }
 });

Cảm ơn trước!

Câu trả lời:


252

Đó là cách khác . Bạn nên viết:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    click: function() {
        // Handle click...
    }
}, "td");

1
Tại sao không phải là bộ chọn $("table.planning_grid td")?
Muers

11
@Muers, nó cũng sẽ hoạt động và người hỏi thừa nhận như vậy, nhưng cũng tin rằng anh ta nên ràng buộc sự kiện trên <table>thay vì từng <td>yếu tố riêng lẻ , đó thực sự là con đường đúng đắn.
Frédéric Hamidi

37
Có một lý do chính đáng để sử dụng .on trên <bảng> chứ không phải trên <td> và đó là nếu bạn tự động thêm <td> s sau này. $ ('bảng td'). trên ... sẽ chỉ ảnh hưởng đến <td> trong bảng ngay khi bạn gọi hàm này. $ ('bảng'). on (..., 'td', hàm ...) sẽ ảnh hưởng đến bất kỳ <td> nào bạn sẽ thêm vào bảng này sau.
Raanan

8
@Raanan, thực sự, và ngoài ra mỗi trình xử lý sự kiện, một thanh ghi có một chi phí, mặc dù rất nhỏ. Khi bạn đang xử lý hàng ngàn ô, việc đăng ký một trình xử lý <table>thay vì một trình xử lý cho mỗi <td>phần tử trở thành bắt buộc để đạt được hiệu suất có thể sử dụng.
Frédéric Hamidi

1
Đã đồng ý. Rất khó để google câu hỏi này vì 'trên' là một từ phổ biến và hầu hết các kết quả đều liên quan đến .bind.live. Câu trả lời hay, đúng như những gì tôi đang tìm kiếm: D @ Frédéric - Liên kết của bạn không liên kết đến một tiêu đề idtrên trang tài liệu jquery nữa. Có lẽ là kết quả của tài liệu cập nhật. Nhưng tôi không thể tìm thấy câu trả lời này trên trang đó.
nzifnab

186

Ngoài ra, nếu bạn có nhiều trình xử lý sự kiện được gắn vào cùng một bộ chọn thực thi cùng chức năng, bạn có thể sử dụng

$('table.planning_grid').on('mouseenter mouseleave', function() {
    //JS Code
});

5
đây là những gì tôi đang tìm kiếm
RozzA

... và sau đó lấy loại sự kiện bị sa thải thực tế bằng e.type (sau khi thêm sự kiện dưới dạng tham số, tức là ... hàm (e) ...
William T. Mallard

24

Nếu bạn muốn sử dụng cùng chức năng cho các sự kiện khác nhau, khối mã sau có thể được sử dụng

$('input').on('keyup blur focus', function () {
   //function block
})

11

Tôi đã học được một cái gì đó thực sự hữu ích và cơ bản từ đây .

Các hàm chuỗi rất hữu ích trong trường hợp này hoạt động trên hầu hết các Hàm jQuery kể cả trên đầu ra hàm.

Nó hoạt động vì đầu ra của hầu hết các hàm jQuery là các bộ đối tượng đầu vào để bạn có thể sử dụng chúng ngay lập tức và làm cho nó ngắn hơn và thông minh hơn

function showPhotos() {
    $(this).find("span").slideToggle();
}

$(".photos")
    .on("mouseenter", "li", showPhotos)
    .on("mouseleave", "li", showPhotos);

7

Và bạn có thể kết hợp các sự kiện / chức năng tương tự theo cách này:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    'click blur paste' : function() {
        // Handle click...
    }
}, "input");

1

Hãy thử với đoạn mã sau:

$("textarea[id^='options_'],input[id^='options_']").on('keyup onmouseout keydown keypress blur change', 
  function() {

  }
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.