История изменнения вопроса «Проблема с назначением функции обработчика события в JS (jQuery)»

  • 3
    Исправлен результат работы alert'а [ "i = 6" => "i = 5" ]
    изменил 823 дня назад Аватор пользователя KeyKeeper KeyKeeper
    34 2

    Проблема с назначением функции обработчика события в JS (jQuery)

    Проблема заключается в следующем.
    У меня есть функция, которая в цикле обходит пять тегов area, и каждого задаёт обработчик события "click". Проблема в том, что обработчик содержит параметры (i, k), которые меняются при каждой итерации и в обработчике (внутри цикла) приходится указывать эти переменные. Но, что для меня стало открытием, при создании обработчика, он берёт не конкретное значение i и k, а ссылку на них, и в итоге я получаю 5 обработчиков с одинаковыми параметрами.
    Ниже пример, где для наглядности, функцию, вызываемую в обработчике, я заменил на alert(). При click'е на любом area сообщение одно и то же (i = 5).

    var k    = Id;
    for( var i = 0; i < 5; i++ )
    {
        $j( '#area_' + i ).unbind( "click" );
        $j( '#area_' + i )
            .bind( "click", function(event){
                alert( 'i = ' + i + ', k = ' + k );
                return false;
            } )
            .attr( 'alt', aImgs[k][0] );
    
        k++;
        if( undefined == aImgs[k] )
        {
            k   = 0;
        }
    }
    

    Собственно, суть вопроса: как сделать так, чтобы для каждого обработчика alert выдавал те числа, которые были указаны ему при задании обработчика?

  • 2
    Версия №2
    изменил 823 дня назад Аватор пользователя KeyKeeper KeyKeeper
    34 2

    Проблема с назначением функции обработчика события в JS (jQuery)

    Проблема заключается в следующем.
    У меня есть функция, которая в цикле обходит пять тегов area, и каждого задаёт обработчик события "click". Проблема в том, что обработчик содержит параметры (i, k), которые меняются при каждой итерации и в обработчике (внутри цикла) приходится указывать эти переменные. Но, что для меня стало открытием, при создании обработчика, он берёт не конкретное значение i и k, а ссылку на них, и в итоге я получаю 5 обработчиков с одинаковыми параметрами.
    Ниже пример, где для наглядности, функцию, вызываемую в обработчике, я заменил на alert(). При click'е на любом area сообщение одно и то же (i = 6).5).

    var k    = Id;
    for( var i = 0; i < 5; i++ )
    {
        $j( '#area_' + i ).unbind( "click" );
        $j( '#area_' + i )
            .bind( "click", function(event){
                alert( 'i = ' + i + ', k = ' + k );
                return false;
            } )
            .attr( 'alt', aImgs[k][0] );
    
        k++;
        if( undefined == aImgs[k] )
        {
            k   = 0;
        }
    }
    

    Собственно, суть вопроса: как сделать так, чтобы для каждого обработчика alert выдавал те числа, которые были указаны ему при задании обработчика?

  • 1
    823 дня назад Аватор пользователя KeyKeeper KeyKeeper
    34 2

    Проблема с назначением функции обработчика события в JS (jQuery)

    Проблема заключается в следующем.
    У меня есть функция, которая в цикле обходит пять тегов area, и каждого задаёт обработчик события "click". Проблема в том, что обработчик содержит параметры (i, k), которые меняются при каждой итерации и в обработчике (внутри цикла) приходится указывать эти переменные. Но, что для меня стало открытием, при создании обработчика, он берёт не конкретное значение i и k, а ссылку на них, и в итоге я получаю 5 обработчиков с одинаковыми параметрами.
    Ниже пример, где для наглядности, функцию, вызываемую в обработчике, я заменил на alert(). При click'е на любом area сообщение одно и то же (i = 6).

    var k    = Id;
    for( var i = 0; i < 5; i++ )
    {
        $j( '#area_' + i ).unbind( "click" );
        $j( '#area_' + i )
            .bind( "click", function(event){
                alert( 'i = ' + i + ', k = ' + k );
                return false;
            } )
            .attr( 'alt', aImgs[k][0] );
    
        k++;
        if( undefined == aImgs[k] )
        {
            k   = 0;
        }
    }
    

    Собственно, суть вопроса: как сделать так, чтобы для каждого обработчика alert выдавал те числа, которые были указаны ему при задании обработчика?