jQuery beberapa peristiwa untuk memicu fungsi yang sama

977

Apakah ada cara untuk memiliki keyup, keypress, blur, dan changeperistiwa memanggil fungsi yang sama dalam satu baris atau yang harus saya lakukan secara terpisah?

Masalah yang saya miliki adalah bahwa saya perlu memvalidasi beberapa data dengan pencarian db dan ingin memastikan validasi tidak dilewatkan dalam hal apa pun, apakah itu diketik atau disisipkan ke dalam kotak.

shaneburgess
sumber

Jawaban:

1794

Anda dapat menggunakan .on()untuk mengikat fungsi ke beberapa acara:

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

Atau hanya meneruskan fungsi sebagai parameter ke fungsi acara normal:

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)
Tatu Ulmanen
sumber
3
Dengan peristiwa yang dipisahkan ruang, bagaimana Anda juga memasukkan spasi nama? .on('keyup.foo keypress.foo blur.foo change.foo', …)atau .on('keyup keypress blur change .foo', …)?
Sukima
24
Masalah dengan ini adalah bahwa myFunction mungkin akan dipanggil beberapa kali, yang mungkin ingin Anda cegah.
Esger
2
Bagaimana saya bisa melewatkan parameter dalam fungsi ini?
kushalvm
@ Eger Lagi pula untuk melakukan ini? Di ponsel, saya selalu perlu on('click tap', e => {...}). Pendengar mungkin terpicu dua kali, saya hanya ingin memicu sekali, bagaimana saya bisa kode dalam fungsi pendengar?
tomision
9
@Tomlsion Mungkin menambahkan className 'sibuk' ke elemen dalam fungsi yang disebut, dan kemudian $('#element:not(.busy)').on('keyup keypress blur change', function(e){…});akhirnya menghapus className 'sibuk'.
Esger
60

Pada jQuery 1.7, .on()metode ini adalah metode yang disukai untuk melampirkan penangan acara ke dokumen. Untuk versi sebelumnya, .bind()metode ini digunakan untuk melampirkan pengendali acara langsung ke elemen.

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})
lesyk
sumber
1
Ini dilakukan untuk acara yang didelegasikan, itu akan berhasil, tapi itu bukan cara paling sederhana untuk melakukannya, juga bukan yang paling efisien.
Ben Taliadoros
1
Delegasi acara penting, dan mungkin (atau mungkin tidak) diperlukan tergantung pada saat skrip dimuat / dijalankan, dan jika elemen ada di DOM pada saat skrip dimuat / dijalankan.
random_user_name
45

Saya sedang mencari cara untuk mendapatkan jenis acara ketika jQuery mendengarkan beberapa acara sekaligus, dan Google menempatkan saya di sini.

Jadi, bagi mereka yang tertarik, event.typeadalah jawaban saya:

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

Info lebih lanjut di dokumen jQuery .

Alain Tiemblo
sumber
24

Anda dapat menggunakan metode bind untuk melampirkan fungsi ke beberapa acara. Cukup berikan nama acara dan fungsi penangan seperti dalam kode ini:

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

Pilihan lain adalah menggunakan dukungan chaining api jquery.

Giorgi
sumber
9
Pada jQuery 1.7, metode .on () adalah metode yang disukai untuk melampirkan penangan acara ke dokumen.
Dzhuneyt
18

Jika Anda melampirkan pengendali acara yang sama ke beberapa acara, Anda sering mengalami masalah lebih dari satu dari mereka yang menembak sekaligus (misalnya tab pengguna menekan setelah mengedit; keydown, mengubah, dan blur mungkin semua api).

Kedengarannya seperti apa yang sebenarnya Anda inginkan adalah sesuatu seperti ini:

$('#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.
});
Dave Ward
sumber
14

Beginilah cara saya melakukannya.

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

Anda bisa mendefinisikan fungsi yang ingin Anda gunakan kembali seperti di bawah ini:

var foo = function() {...}

Dan nantinya Anda dapat mengatur berapa banyak pendengar acara yang Anda inginkan pada objek Anda untuk memicu fungsi tersebut menggunakan on ('event') meninggalkan ruang di antaranya seperti yang ditunjukkan di bawah ini:

$('#selector').on('keyup keypress blur change paste cut', foo);
Coder Of The Galaxy
sumber
3
Secara umum Anda harus menjelaskan jawaban Anda. Cukup menempel kode tidak membantu OP memahami masalah mereka atau solusi Anda.
leigero
bagaimana jika saya perlu argumen pertama dalam fungsi pelanggan acara jquery (acara)? Bagaimana cara menggunakannya?
Dr.X
Tidak apa-apa, Anda bisa mendeklarasikan fungsi dengan parameter event dan kemudian mengaksesnya dari dalam metode. Peristiwa ini akan melewati objek dalam diri mereka sendiri. Saya harap ini membantu. var foo = function (event) {console.log (event); } $ ('# selector'). on ('keyup penekanan tombol blur cut paste cut', foo);
Coder Of The Galaxy
7

Jawaban oleh Tatu adalah bagaimana saya secara intuitif akan melakukannya, tetapi saya telah mengalami beberapa masalah di Internet Explorer dengan cara ini bersarang / mengikat peristiwa, meskipun itu dilakukan melalui .on()metode.

Saya belum bisa menentukan dengan tepat versi jQuery yang mana masalahnya. Tapi kadang-kadang saya melihat masalah di versi berikut:

  • 2.0.2
  • 1.10.1
  • 1.6.4
  • Seluler 1.3.0b1
  • Seluler 1.4.2
  • Seluler 1.2.0

Solusi saya adalah pertama mendefinisikan fungsi,

function myFunction() {
    ...
}

dan kemudian menangani acara secara individual

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

Ini bukan solusi tercantik, tetapi itu bekerja untuk saya, dan saya pikir saya akan menaruhnya di sana untuk membantu orang lain yang mungkin tersandung masalah ini

Squazz
sumber
5
$("element").on("event1 event2 event..n", function() {
   //execution
});

Tutorial ini adalah tentang menangani beberapa acara.

Tamu
sumber
4

Apakah ada cara untuk memiliki keyup, keypress, blur, dan changeperistiwa memanggil fungsi yang sama dalam satu baris?

Mungkin menggunakan .on(), yang menerima struktur berikut:, .on( events [, selector ] [, data ], handler )sehingga Anda dapat meneruskan beberapa peristiwa ke metode ini. Dalam kasus Anda, tampilannya akan seperti ini:

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

Dan inilah contohnya:

$('#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">

Bunuh Diri Komersial
sumber
2

Sangat mudah untuk menerapkan ini dengan metode DOM bawaan tanpa pustaka besar seperti jQuery, jika Anda mau, itu hanya membutuhkan sedikit lebih banyak kode - beralihlah ke array nama acara, dan tambahkan pendengar untuk masing-masing:

function validate() {
  // ...
}

const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
  element.addEventListener(eventName, validate);
});
Performa Tertentu
sumber