JQuery .on () метод с несколькими обработчиками событий для одного селектора


139

Попытка выяснить, как использовать метод 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 */ }
 });

Заранее спасибо!

Ответы:


252

Это наоборот . Вы должны написать:

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

1
Почему не селектор $("table.planning_grid td")?
Muers

11
@Muers, это также сработает, и спрашивающий признает это, но также считает, что он должен связать событие <table>вместо каждого отдельного <td>элемента, что действительно является правильным путем.
Фредерик Хамиди

37
Есть веская причина использовать .on в <table>, а не в <td>, и это если вы динамически добавляете <td> позже. $ ('table td'). on ... влияет только на <td>, которые находятся в таблице в тот момент, когда вы вызываете эту функцию. $ ('table'). on (..., 'td', function ...) будет влиять на любые <td>, которые вы добавите в эту таблицу позже.
Раанан

8
@Raanan, действительно, и, кроме того, каждый регистрируемый обработчик событий имеет стоимость, хотя и крошечную. Когда вы имеете дело с тысячами ячеек, регистрация одного обработчика <table>вместо одного обработчика на <td>элемент становится обязательной для достижения полезной производительности.
Фредерик Хамиди

1
Согласовано. Гуглить этот вопрос очень сложно, так как слово «вкл.» Такое распространенное слово, и большинство результатов было связано с .bindи .live. Хороший ответ, именно то, что я искал: D @ Frédéric - Ваша ссылка больше не ссылается на заголовок idна странице документации jquery. Вероятно, результат обновленной документации. Но я не мог найти этот ответ на этой странице.
nzifnab

186

Кроме того, если к одному и тому же селектору, выполняющему одну и ту же функцию, подключено несколько обработчиков событий, вы можете использовать

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

5
это то, что я искал
RozzA

... и затем получить фактический тип события с помощью e.type (после добавления события в качестве параметра, то есть ... function (e) ...
Уильям Т. Маллард,

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");

1

Попробуйте с помощью следующего кода:

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

  }
);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.