Реализация jQuery Live в прототипе - PullRequest
3 голосов
/ 05 марта 2010
Element.implement({
    addLiveEvent: function(event, selector, fn){
        this.addEvent(event, function(e){
            var t = $(e.target);

            if (!t.match(selector)) return false;
                fn.apply(t, [e]);
        }.bindWithEvent(this, selector, fn));
    }
});

$(document.body).addLiveEvent('click', 'a', function(e){ alert('This is a live event'); });

Приведенный выше код был сделан в подобном вопросе для реализации поведения .live в Mootools Я прочитал вопрос: Эквивалент прототипа для живой функции jQuery .

Как мне реализовать это в Prototype? Вероятно, что-то, что можно реализовать следующим образом:

document.liveobserve('click', 'a', function(e){ alert('This is a live event');

Отредактировано, чтобы прояснить вопрос.

1 Ответ

0 голосов
/ 26 июня 2011

Самый простой (и, возможно, не самый быстрый или лучший) способ выглядит примерно так:

Element.live = function(evType, evSelector, evBlock) {
  var mySelector = evSelector;
  var myBlock = evBlock;
  this.observe(evType, function(ev) {
    if (ev.target.match(mySelector)) {
      evBlock(ev);
    }
  });
};

Параметры evSelector и evBlock назначаются локальным переменным, поэтому они доступны обработчику событий (это закрытие). Переданный блок evBlock получает переданный объект события точно так же, как обычный обработчик события Prototype.

Следует отметить, что это будет обрабатывать каждое событие типа 'evType', поэтому если это mouseMove / mouseOver, это замедлит вашу страницу. Также FireBug, вероятно, просто уснет на вас из-за количества событий, которые он должен пройти за один шаг.

РЕДАКТИРОВАТЬ: Изменено в соответствии с комментариями

...