jQuery หลายเหตุการณ์เพื่อเรียกใช้ฟังก์ชันเดียวกัน


976

มีวิธีที่จะมีkeyup, keypress, blurและchangeเหตุการณ์เรียกใช้ฟังก์ชันเดียวกันในหนึ่งบรรทัดหรือฉันจะต้องทำพวกเขาแยกกัน?

ปัญหาที่ฉันมีคือฉันต้องตรวจสอบความถูกต้องของข้อมูลด้วยการค้นหา db และต้องการให้แน่ใจว่าการตรวจสอบความถูกต้องไม่พลาดในทุกกรณีไม่ว่าจะพิมพ์หรือวางลงในกล่อง

คำตอบ:


1792

คุณสามารถใช้.on()เพื่อผูกฟังก์ชันกับหลายเหตุการณ์:

$('#element').on('keyup keypress blur change', function(e) {
    // e.type is the type of event fired
});

หรือเพียงแค่ส่งผ่านฟังก์ชันเป็นพารามิเตอร์ไปยังฟังก์ชันเหตุการณ์ปกติ:

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)

3
ด้วยช่องว่างคั่นเหตุการณ์คุณจะรวมการเว้นวรรคชื่อได้อย่างไร .on('keyup.foo keypress.foo blur.foo change.foo', …)หรือ.on('keyup keypress blur change .foo', …)?
Sukima

24
ปัญหาเกี่ยวกับเรื่องนี้คือฟังก์ชั่นของฉันอาจจะถูกเรียกหลายครั้งซึ่งคุณอาจต้องการป้องกัน
Esger

2
ฉันจะส่งพารามิเตอร์ในฟังก์ชั่นนี้ได้อย่างไร
kushalvm

@Esger ยังไงกับการทำเช่นนี้? on('click tap', e => {...})ในมือถือของผมมักจะต้อง ผู้ฟังอาจถูกทริกเกอร์สองครั้งฉันแค่ต้องการทริกเกอร์หนึ่งครั้งฉันจะรหัสในฟังก์ชั่นการฟังได้อย่างไร
tomision

9
@Tomlsion อาจเพิ่ม className 'busy' ให้กับองค์ประกอบในฟังก์ชั่นที่เรียกใช้จากนั้น$('#element:not(.busy)').on('keyup keypress blur change', function(e){…});ในที่สุดก็ลบ className 'busy'
Esger

60

ในฐานะของ jQuery 1.7 .on()วิธีการเป็นวิธีที่ต้องการสำหรับการแนบตัวจัดการเหตุการณ์กับเอกสาร สำหรับเวอร์ชันก่อนหน้า.bind()วิธีการนี้ใช้สำหรับแนบตัวจัดการเหตุการณ์กับองค์ประกอบโดยตรง

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})

1
สิ่งนี้ทำสำหรับเหตุการณ์ที่มอบหมายแล้วมันจะทำงานได้ แต่ไม่ใช่วิธีที่ง่ายที่สุดในการทำหรือไม่มีประสิทธิภาพมากที่สุด
Ben Taliadoros

1
การมอบหมายกิจกรรมเป็นสิ่งสำคัญและอาจจำเป็น (หรืออาจไม่) ขึ้นอยู่กับว่าสคริปต์นั้นถูกโหลด / รันและถ้าองค์ประกอบมีอยู่ใน DOM ณ เวลาที่สคริปต์ถูกโหลด / รัน
random_user_name

45

ฉันกำลังมองหาวิธีที่จะได้รับประเภทเหตุการณ์เมื่อ jQuery ฟังหลายเหตุการณ์ในครั้งเดียวและ Google ทำให้ฉันอยู่ที่นี่

ดังนั้นสำหรับผู้ที่สนใจevent.typeคำตอบของฉันคือ:

$('#element').on('keyup keypress blur change', function(event) {
    alert(event.type); // keyup OR keypress OR blur OR change
});

ข้อมูลเพิ่มเติมในเอกสาร jQuery


24

คุณสามารถใช้วิธีเชื่อมโยงเพื่อแนบฟังก์ชั่นเข้ากับกิจกรรมต่างๆ เพียงส่งชื่อเหตุการณ์และฟังก์ชั่นการจัดการเช่นเดียวกับในรหัสนี้:

$('#foo').bind('mouseenter mouseleave', function() {
  $(this).toggleClass('entered');
});

ตัวเลือกอื่นคือใช้การสนับสนุนการโยงของ jquery api


9
ตั้งแต่ jQuery 1.7 เมธอด. on () เป็นวิธีที่ต้องการสำหรับการแนบตัวจัดการเหตุการณ์กับเอกสาร
Dzhuneyt

18

หากคุณแนบตัวจัดการเหตุการณ์เดียวกันกับหลาย ๆ เหตุการณ์คุณมักพบปัญหามากกว่าหนึ่งรายการที่เกิดขึ้นพร้อมกัน (เช่นผู้ใช้กดที่แท็บหลังจากแก้ไขแล้วการกดแป้นการเปลี่ยนแปลงและการเบลออาจเป็นไปได้)

ดูเหมือนสิ่งที่คุณต้องการจริง ๆ คืออะไรเช่นนี้:

$('#ValidatedInput').keydown(function(evt) {
  // If enter is pressed
  if (evt.keyCode === 13) {
    evt.preventDefault();

    // If changes have been made to the input's value, 
    //  blur() will result in a change event being fired.
    this.blur();
  }
});

$('#ValidatedInput').change(function(evt) {
  var valueToValidate = this.value;

  // Your validation callback/logic here.
});

14

นี่คือวิธีที่ฉันทำ

$("input[name='title']").on({
    "change keyup": function(e) {
        var slug = $(this).val().split(" ").join("-").toLowerCase();
        $("input[name='slug']").val(slug);
    },
});

11

คุณสามารถกำหนดฟังก์ชั่นที่คุณต้องการนำมาใช้ใหม่ได้ดังนี้:

var foo = function() {...}

และในภายหลังคุณสามารถตั้งค่าได้หลายฟังเหตุการณ์ที่คุณต้องการในวัตถุของคุณเพื่อเรียกใช้ฟังก์ชั่นที่ใช้ใน ('เหตุการณ์') ออกจากช่องว่างในระหว่างที่แสดงด้านล่าง:

$('#selector').on('keyup keypress blur change paste cut', foo);

3
โดยทั่วไปคุณควรอธิบายคำตอบของคุณ การวางโค้ดเพียงอย่างเดียวไม่ช่วยให้ OP เข้าใจถึงปัญหาหรือวิธีแก้ไขของพวกเขา
leigero

ถ้าฉันต้องการอาร์กิวเมนต์แรกในฟังก์ชันสมาชิก jquery event (event) วิธีใช้งาน
Dr.X

ไม่เป็นไรคุณสามารถประกาศฟังก์ชันด้วยพารามิเตอร์เหตุการณ์แล้วเข้าถึงจากภายในวิธีการ เหตุการณ์เหล่านี้จะผ่านวัตถุในตัวเอง ฉันหวังว่านี่จะช่วยได้. var foo = ฟังก์ชั่น (เหตุการณ์) {console.log (เหตุการณ์); } $ ('# selector'). on ('keyup keypress key blur change paste cut', foo);
Coder Of The Galaxy

7

คำตอบของ Tatu คือวิธีที่ฉันจะทำอย่างสังหรณ์ใจ แต่ฉันประสบปัญหาบางอย่างใน Internet Explorer ด้วยวิธีนี้ในการทำรัง / ผูกเหตุการณ์แม้ว่ามันจะทำผ่าน.on()วิธีการ

ฉันไม่สามารถระบุได้อย่างชัดเจนว่าเวอร์ชันของ jQuery นี้เป็นปัญหาของอะไร แต่บางครั้งฉันก็เห็นปัญหาในรุ่นต่อไปนี้:

  • 2.0.2
  • 1.10.1
  • 1.6.4
  • มือถือ 1.3.0b1
  • มือถือ 1.4.2
  • มือถือ 1.2.0

การแก้ปัญหาของฉันคือการกำหนดฟังก์ชั่นก่อน

function myFunction() {
    ...
}

แล้วจัดการเหตุการณ์แต่ละรายการ

// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);

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



4

มีวิธีที่จะมีkeyup, keypress, blurและchangeเหตุการณ์เรียกใช้ฟังก์ชันเดียวกันในหนึ่งบรรทัด?

เป็นไปได้ที่จะใช้.on()ซึ่งยอมรับโครงสร้างต่อไปนี้: .on( events [, selector ] [, data ], handler )เพื่อให้คุณสามารถส่งหลายเหตุการณ์ไปยังวิธีนี้ ในกรณีของคุณควรมีลักษณะเช่นนี้:

$('#target').on('keyup keypress blur change', function(e) {
    // "e" is an event, you can detect the type of event using "e.type"
});

และนี่คือตัวอย่างสด:

$('#target').on('keyup keypress blur change', function(e) {
  console.log(`"${e.type.toUpperCase()}" event happened`)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="target">


2

มันง่ายที่จะใช้สิ่งนี้กับวิธี DOM ที่มีอยู่ภายในโดยไม่มีไลบรารี่ขนาดใหญ่เช่น jQuery ถ้าคุณต้องการก็แค่ใช้โค้ดเพิ่มอีกนิดหน่อย - วนซ้ำชื่ออาร์เรย์ของเหตุการณ์และเพิ่ม listener สำหรับแต่ละตัว:

function validate() {
  // ...
}

const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
  element.addEventListener(eventName, validate);
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.