jQuery забиндить несколько обработчиков на одно событие

Статус
В этой теме нельзя размещать новые ответы.

registered

Создатель
Регистрация
13 Апр 2012
Сообщения
45
Реакции
4
собственно, вопрос: как забиндить несколько обработчиков на одно событие?
в частности, интересует jQuery(document).mousemove();
пробую вот такой код, использующий собственное пространство имён для каждого нового обработчика:
Код:
    doBind = function(){
        for (var key in settings.element) {
            if (typeof(callerObj[key]) != 'undefined'){
                var eventStr = 'mousemove.' + settings.element[key]['selector'];
                jQuery(document).bind(eventStr, function(e){
                    alert('забиндили функцию # ' + key + ' на document.' + eventStr);
                    //ну и что-то ещё делаем
                });    //end of bind
            }
        }    //end of for
    }
settings - это объект с параметрами, с которыми я вызываю плагин.
он организован в массив, так как событие должно влиять на несколько объектов.
в частности, там содержится селектор объекта, которому достанется от перемещения мыши.
callerObj - массив инициализационных параметров для каждого объекта, ну и сами объекты там есть.

однако, срабатывает только последний bind.
то есть, если
Код:
settings.element[0]['selector'] = 'body';
и
Код:
settings.element[1]['selector'] = '#some_selector';
то сработает только
Код:
jQuery(document).bind('mousemove.#some_selector', function(e){
//code
});
 
Вроде бы у тебя все правильно написано
Там у тебя выполняется один alert() последнего бинда, остальные alertы блокируются так как открылся первый и страница больше не владеет фокусом. Попробуй заменить alert() на console.log().
Код ниже работает нормально:
Код:
jQuery('.someSelector').mousemove(function(e){
console.log(1);
});
jQuery('.someSelector').mousemove(function(e){
console.log(2);
});
будет по очереди выдавать 1 2 1 2 1 2 ....
 
забавно.
если прописать руками так, как вы предлагаете, то даже и alert работает.
а вот в цикле почему-то не получается...
 
Код:
    var object = new Object();
    object[1] = 15;
    object[0] = 20;
    object[3] = new Object();
    object[3].obj = 115;
    for(var key in object){
        jQuery(document).bind('mousemove', function(){
            alert(key + ' ' + object[key]);
            console.log(key + ' ' + object[key]);
        });
    }
видмо, я чего-то недопонимаю...
 
а теперь внимание, правильный ответ:
при навешивании обработчиков в цикле необходимо использовать замыкание, в противном случае все обрабочтики будут использвать последний индекс из цикла.
таким образом, рабочий код:
Код:
    var object = new Array();
    object[1] = 15;
    object[0] = 20;
    object[3] = new Object();
    object[3].obj = 115;
    for(var key in object){
        (function(key){jQuery(document).bind('mousemove', function(){
            alert(key);
            console.log(key + ' ' + object[key]);
            });
        })(key);
    }
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху