jQuery .on () วิธีการที่มีตัวจัดการเหตุการณ์หลายตัวในตัวเลือกเดียว


142

พยายามหาวิธีใช้เมธอด Jquery .on () กับตัวเลือกเฉพาะที่มีหลายเหตุการณ์ที่เกี่ยวข้อง ก่อนหน้านี้ฉันใช้เมธอด. live () แต่ไม่ค่อยแน่ใจว่าจะทำสำเร็จแบบเดียวกันกับ. on () ได้อย่างไร โปรดดูรหัสของฉันด้านล่าง:

$("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.
  }
});

ฉันรู้ว่าสามารถกำหนดกิจกรรมต่างๆได้โดยโทร:

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

แต่ฉันเชื่อว่าการใช้. on () อย่างเหมาะสมจะเป็นเช่นนั้น:

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

มีวิธีที่จะทำให้สำเร็จหรือไม่? หรือแนวทางปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ฉันลองใช้รหัสด้านล่าง แต่ไม่มีลูกเต๋า

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

ขอบคุณล่วงหน้า!

คำตอบ:


256

นั่นเป็นรอบวิธีอื่นคุณควรเขียน:

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

1
ทำไมไม่เลือก$("table.planning_grid td")?
Muers

12
@Muers มันก็ใช้ได้เช่นกันและผู้ถามก็รับทราบเช่นกัน แต่ก็เชื่อด้วยว่าเขาควรผูกเหตุการณ์ไว้ที่<table>แทนที่จะเป็น<td>องค์ประกอบของแต่ละบุคคลซึ่งเป็นวิธีที่ถูกต้อง
Frédéric Hamidi

37
มีเหตุผลที่ดีที่จะใช้. บน <table> ไม่ใช่บน <td> และถ้าคุณเพิ่ม <td> แบบไดนามิกในภายหลัง $ ('table td'). on ... จะมีผลเฉพาะ <td> ที่อยู่ในตารางเมื่อคุณเรียกใช้ฟังก์ชันนี้ $ ('table'). on (... , 'td', function ... ) จะมีผลกับ <td> ใด ๆ ที่คุณจะเพิ่มลงในตารางนี้ในภายหลัง
Raanan

8
@Raanan แน่นอนและนอกจากนี้ตัวจัดการเหตุการณ์ทุกคนการลงทะเบียนมีค่าใช้จ่ายแม้ว่าจะเล็ก เมื่อคุณจัดการกับเซลล์หลายพันเซลล์การลงทะเบียนตัวจัดการเดียวบน<table>ตัวจัดการหนึ่งตัวต่อหนึ่ง<td>องค์ประกอบจะกลายเป็นข้อบังคับเพื่อให้ได้ประสิทธิภาพที่ใช้งานได้
Frédéric Hamidi

1
เห็นด้วย ยากมากที่จะ google คำถามนี้เป็น 'ที่' เป็นเช่นคำทั่วไปและผลส่วนใหญ่ที่เกี่ยวข้องกับการและ.bind .liveคำตอบที่ดีคือสิ่งที่ฉันกำลังมองหา: D @ Frédéric - ลิงก์ของคุณจะไม่เชื่อมโยงไปยังส่วนหัวidในหน้าเอกสาร jquery อีกต่อไป อาจเป็นผลมาจากเอกสารที่อัปเดต แต่ฉันไม่พบคำตอบนี้ในหน้านั้น
nzifnab

187

นอกจากนี้หากคุณมีตัวจัดการเหตุการณ์หลายตัวที่เชื่อมต่อกับตัวเลือกเดียวกันที่เรียกใช้ฟังก์ชันเดียวกันคุณสามารถใช้

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

6
นี่คือสิ่งที่ฉันกำลังมองหา
RozzA

1
... จากนั้นรับชนิดเหตุการณ์ยิงจริงด้วย e.type (หลังจากเพิ่มเหตุการณ์เป็นพารามิเตอร์เช่น ... function (e) ...
William T. Mallard

24

หากคุณต้องการใช้ฟังก์ชันเดียวกันในเหตุการณ์ที่แตกต่างกันสามารถใช้บล็อกโค้ดต่อไปนี้ได้

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

11

ผมได้เรียนรู้สิ่งที่มีประโยชน์จริงๆและพื้นฐานจากที่นี่

ผูกมัดฟังก์ชั่นที่มีประโยชน์มากในกรณีนี้ซึ่งทำงานในส่วนฟังก์ชั่น jQuery รวมทั้งในการส่งออกฟังก์ชั่นมากเกินไป

ทำงานได้เนื่องจากเอาต์พุตของฟังก์ชัน jQuery ส่วนใหญ่เป็นชุดวัตถุอินพุตเพื่อให้คุณสามารถใช้งานได้ทันทีและทำให้สั้นลงและชาญฉลาดขึ้น

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

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

7

และคุณสามารถรวมเหตุการณ์ / ฟังก์ชันเดียวกันด้วยวิธีนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.