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

Тема в разделе "JavaScript", создана пользователем registered, 16 июл 2012.

Статус темы:
Закрыта.
Модераторы: ZiX
  1. registered

    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
    });
     
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Вроде бы у тебя все правильно написано
    Там у тебя выполняется один 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 ....
     
    registered нравится это.
  3. registered

    registered Создатель

    Регистр.:
    13 апр 2012
    Сообщения:
    45
    Симпатии:
    4
    забавно.
    если прописать руками так, как вы предлагаете, то даже и alert работает.
    а вот в цикле почему-то не получается...
     
  4. registered

    registered Создатель

    Регистр.:
    13 апр 2012
    Сообщения:
    45
    Симпатии:
    4
    Код:
        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]);
            });
        }
    
    видмо, я чего-то недопонимаю...
     
  5. registered

    registered Создатель

    Регистр.:
    13 апр 2012
    Сообщения:
    45
    Симпатии:
    4
    а теперь внимание, правильный ответ:
    при навешивании обработчиков в цикле необходимо использовать замыкание, в противном случае все обрабочтики будут использвать последний индекс из цикла.
    таким образом, рабочий код:
    Код:
        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);
        }
    
     
Статус темы:
Закрыта.