Bir seçiciye birden çok olay işleyici içeren JQuery .on () yöntemi


139

Jquery .on () yönteminin kendisiyle ilişkilendirilmiş birden çok olaya sahip belirli bir seçiciyle nasıl kullanılacağını anlamaya çalışmak. Daha önce .live () yöntemini kullanıyordum, ancak .on () ile aynı başarıyı nasıl yapacağımı tam olarak bilmiyordum. Lütfen aşağıdaki koduma bakın:

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

Arayarak birden fazla olay atayabileceğimi biliyorum:

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

Ancak .on () yönteminin doğru şekilde kullanılmasının şöyle olacağını düşünüyorum:

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

Bunu başarmanın bir yolu var mı? Veya buradaki en iyi uygulama hangisidir? Aşağıdaki kodu denedim, ama zar yok.

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

Şimdiden teşekkürler!

Yanıtlar:


252

Bu tam tersi . Yazmalısınız:

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

1
Seçici neden olmasın $("table.planning_grid td")?
Muers

11
@Muers, aynı zamanda işe yarayacak ve soru soran da bunu kabul edecek, ancak aynı zamanda olayı , gerçekten doğru yol olan <table>her bir <td>öğenin yerine bağlaması gerektiğine inanıyor .
Frédéric Hamidi

37
.On öğesini <table> yerine <table> üzerinde kullanmak için iyi bir neden vardır ve <td> 'leri daha sonra dinamik olarak eklerseniz. $ ('table td'). on ... yalnızca bu işlevi çağırdığınızda tablodaki <td> öğesini etkiler. $ ('table'). on (..., 'td', function ...) bu tabloya daha sonra ekleyeceğiniz <td> 'i etkileyecektir.
Raanan

8
@Raanan, gerçekten, ve ek olarak, bir kişinin kaydettiği her olay işleyicisinin küçük de olsa bir maliyeti vardır. Binlerce hücre ile uğraşırken, kullanılabilir performans elde etmek için eleman <table>başına bir işleyici yerine tek bir işleyici kaydetmek <td>zorunlu hale gelir.
Frédéric Hamidi

1
Kabul. 'Açık' olarak bu soruyu google çok zor böyle bir yaygın bir kelimedir ve çoğu sonuçları ile ilgili idi .bindve .live. İyi cevap, sadece aradığım şey: D @ Frédéric - Bağlantınız idartık jquery docs sayfasındaki bir başlığa bağlantı vermiyor . Muhtemelen güncellenmiş belgelerin bir sonucu. Ama bu cevabı o sayfada bulamadım.
Ocak'ta nzifnab

186

Ayrıca, aynı işlevi yürüten aynı seçiciye bağlı birden çok olay işleyiciniz varsa,

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

5
aradığım şey bu
RozzA

... ve sonra e.type ile gerçek ateşlenen olay türünü alın (olayı parametre olarak ekledikten sonra, yani ... function (e) ...
William T. Mallard

24

Aynı işlevi farklı olaylarda kullanmak istiyorsanız, aşağıdaki kod bloğu kullanılabilir

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

11

Buradan gerçekten yararlı ve temel bir şey öğrendim .

zincirleme işlevleri dahil olmak üzere çoğu jQuery Fonksiyonlar çalışır bu durumda çok yararlıdır üzerinde çok fonksiyon çıkışı.

Çoğu jQuery işlevinin çıktısı giriş nesneleri kümeleri olduğu için çalışır, böylece bunları hemen kullanabilir ve daha kısa ve daha akıllı hale getirebilirsiniz

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

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

7

Aynı olayları / işlevleri bu şekilde birleştirebilirsiniz:

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

1

Aşağıdaki kodu deneyin:

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

  }
);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.