JQuery добавить обработчик событий для объектов в массиве - PullRequest
2 голосов
/ 25 ноября 2011

На основе this Я пытаюсь добавить обработчик события click в массив объектов, написав это:

function addEventHandler(array, type, func) {
      var len = array.length;
      for (var i = 0; i < len; i++) {
         array[i].bind(type, func);
      }
   }

sections = $('#sponsorship > div .section')

addEventHandler(sections, 'click', function() {
      console.log(this);
});

Однако я получаю сообщение об ошибке:

array[i].bind is not a function

Могу ли я использовать фактические селекторы только для метода связывания? Есть предложения?

Ответы [ 6 ]

5 голосов
/ 25 ноября 2011

Возможно, вам понадобится преобразовать ваш элемент в объект jQuery.

$(array[i]).bind
3 голосов
/ 25 ноября 2011

попробуйте

function addEventHandler(array, type, func) {
      var len = array.length;
      for (var i = 0; i < len; i++) {
         array.eq(i).bind(type, func);
      }
   }
1 голос
/ 25 ноября 2011

Полученное вами сообщение об ошибке - именно то, что вы получите, пытаясь запустить функции jQuery на объектах, не являющихся jQuery.Вы можете легко исправить это, используя индекс цикла for для доступа к объектам jQuery в переменной array:

function addEventHandler(array, type, func) {
      var len = array.length;
      for (var i = 0; i < len; i++) {
         array.eq(i).bind(type, func);
      }
   }

sections = $('#sponsorship > div .section')

addEventHandler(sections, 'click', function() {
      console.log(this);
});

Изменение array[i].bind(type, func); на array.eq(i).bind(type, func); обеспечивает доступ к объекту jQuery, а не к обычномуJS-объект, который удалит полученную ошибку.

Вот jsfiddle вышеуказанного изменения вашего кода: http://jsfiddle.net/jfUpB/1/

0 голосов
/ 13 февраля 2013

.each() сильно влияет на производительность и считается «ленивым» даже по стандартам jQuery.

0 голосов
/ 25 ноября 2011

Я бы заменил for (int ...) на функцию jQuery $ .each, поскольку вы будете иметь дело с элементом массива, а не с попыткой получить элемент по индексу. Кроме того, чтобы использовать любую функцию jQuery, ваш объект внутри массива должен быть объектом jQuery, поэтому я бы сделал это:

function addEventHandler(array, type, func) {
    var len = array.length;
    $(array).each(function(index, item) {
        $(item).bind(type, func);
    });
}
0 голосов
/ 25 ноября 2011
$('#sponsorship > div .section').click(function (event) {
   console.log(event.target);
});

или

$('#sponsorship > div .section').each(function(index,item) {
    $(item).click(function (event) {
       console.log(event.target);
    });
});

Что с этим не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...