Код запуска, когда пользовательское событие связывается в jQuery - PullRequest
0 голосов
/ 23 августа 2011

JQuery имеет отличную поддержку пользовательских событий - .bind("foo", function(e).... Однако что, если механизм запуска события еще не готов и должен быть построен только на тех элементах, с которыми связано событие?

Например, я хочу событие scrollin, которое запускается, когда элемент прокручивается в область просмотра. Чтобы сделать это, я onscroll должен проверить все элементы и trigger scrollin на тех, которые были вне области просмотра, а теперь находятся внутри. Это не приемлемо.

Есть несколько приемов, чтобы ускорить его. Например, один из плагинов для этого проверяет все элементы в «private» $.cache и проверяет только те элементы, для которых scrollin привязано к событию.

Но это тоже безобразно. Мне нужен дополнительный обратный вызов для привязки события (дополнительно к обратному вызову для обработки), который позаботится об управлении прокруткой, то есть поместить элемент (ы) в некоторый elementsCheckOnScrol кеш-массив.

Я ищу что-то вроде:

$.delegateBind("scrollin", function(jqSelection) { ... });
element.bind("scrollin", function(e) {..}); //Calls ^ after internal bind management

Редактировать: Это было бы хорошо API!

$.bind("bind", function(onWhat) { ... }) 

: -)

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Я нашел $.event.special API, но я не знаю, насколько он публичный.Это не в документах и ​​было изменено, по крайней мере, один раз прежде.http://benalman.com/news/2010/03/jquery-special-events/

0 голосов
/ 23 августа 2011

Если я вас не правильно понял, вы можете исправить метод bind следующим образом:

(function($) {
    var oldBind = $.fn.bind;

    $.fn.bind = function(name) { 
        if(name === "scrollin") {
             delegateFunction(this);
        }

        oldBind.apply(this, arguments);
    };
})(jQuery);

Что он делает, проверяет, привязан ли scrollin, и если да, вызываетВаша функция делегата.После этого он просто вызывает исходную функцию связывания, которая делает все jQuery регулярно, как обычно.

После добавления этого кода вы можете использовать его следующим образом: http://jsfiddle.net/pimvdb/g4k2G/.

function delegateFunction(selection) {
    alert(selection.length);
}

$('a').bind('scrollin', function() {});

Обратите внимание, что это не поддерживает объектные литералы, передаваемые в .bind (только (name, func)), но вы также можете реализовать это.

...