@AlikDex

Сколько можно навесить eventListener на одной странице?

И второй вопрос, насколько сильно будет лагать?
Задавался кто-нибудь вопросом?

Интересует аттач через jquery и нативным js.

Допустим охота сделать для дерева категорий просмотр и редактирование, в списке 10к категорий. Если их всех вывести в свернутом виде но на каждую навесить листенер для модала(не забываем что еще есть expand и collapse дочернего списка), это дурацкая идея или нет?
  • Вопрос задан
  • 289 просмотров
Решения вопроса 2
@Vovchikvoin
Конечно дурацкая, для таких вещей придумано делегирование.
Ответ написан
qmax
@qmax
программер
Я недавно делал сильно интерактивный макетопрототип сайта, и чтобы сильно не париться, вообще все события вешал на body, с делегированиям по селектору.
Для этого специально наговнокодил jquery-plugin.
При использовании в хроме у меня сложилось впечатление, что никаких ограничений нет.

А конкретно для вашей задачи достаточно одного биндинга на корень дерева, с разбирательством внутри хэнлера на тему какой именно элемент кликнут (он передаётся в хэндлер толи в event.target, толи вообще в this).

Вот, например, моя реализация для хитробиндинга:
$.fn.xon = function(type, selector, handler) {
    /** tricky binding
     * 
     * userfull for global binding.
     * 
     * if selector starts with parent selector:
     * matching parent element is retrieved for handler
     * otherwise, it is $(this)
     *
     * if selector ends with [attr]:
     * attribute or data value is retrieved for handler
     *
     * if target is input, value is retrieved
     *
     * event trigger calls handler(event, $parent, $this, value)
     */
    var parent, attr, data;

    if( selector.indexOf(" ") != -1 ) {
        var parts = selector.split(" ");
        parent = parts[0];
    }

    if( selector.slice(-1) == "]" ) {
        var a = selector.substring(selector.lastIndexOf("[")+1, selector.lastIndexOf("]"));
        if( a.indexOf("=") == -1) {
            if( a.slice(0,5) == "data-" ) {
                data = a.slice(5);
            } else {
                attr = a;
            }
        }
    }
    
    this.on(type, selector, function(ev) {
        var $t = $(this),
            $p = parent ? $t.parents(parent).eq(0) : $t,
            v = null;
        if( data ) v = $t.data(data);
        else if( attr ) v = $t.attr(attr);
        else if( $t.is(":input") ) v = $t.val();
        handler(ev, $p, $t, v);
    });

    return this;
};


пример использования:
$("body")
        .xon('click', ".panel-heading [x-line-toggle-options]", function(ev, $parent, $target, value) {
// $parent = то, что .panel-heading
// $target = то, что имеет атрибут x-line-toggle-options
// value = значение атрибута
        })
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы