madmages
@madmages
Человек прямоходящий

Почему Jquery так отрабатывает?

Это даже не вопрос а недопонимание как работает логика этого кода, код вощем вот

$('input.d-autocomplitter').live('keypress', function (e) {
        var thisInput = $(this);
        var thisId = $(this).attr('id');
        if (typeof AddProductTimer!='undefined') {
            clearTimeout(AddProductTimer);
            AddProductTimer = undefined;
        }
        AddProductTimer = setTimeout(function () {
            var sendData = {};
            sendData.product_info = thisInput.val();
            $(".d-autocomplitter-data").html('');
            $.post(apiUrl('categorylist', 'productSearch'), sendData, function (data) {
                var html = '';
                for (var i = 0; i < data.length; i++) {
                    html += 'много элементов c классом auto-item ';
                }
                $(".d-autocomplitter-data").html(html);
                $('.auto-item').live('click', function () {
                    var product_id = $(this).attr('product_id');
                    var thoseInp = $('input#'+thisId);
                    thoseInp.attr('product_id', product_id).val($(this).html());
                    thisId=undefined; // странная штука, если оставить не тронутым эту переменную то при изменении инпутов будут меняться все ранее измененные инпуты
                })
            }, 'json')
        }, 1000);
    }).live('keydown',function () {
        $(this).trigger('keypress'); // на случай если сделают ctrl+v
    }).live('focus',function () {
        setTimeout(function () {
            $(".d-autocomplitter-data").html('');
        }, 200)
    });


На странице есть несколько инпутов с классом d-autocomplitter. У этих инпутов разные id. При набирании чегонить в этих инпутах делается запрос на сервер и сервер отдает массив данных которые разбираются на элементы с классом auto-item, на эти элементы сразу вешается событие клика при котором что-то делается.
Соль вощем вот в чем : когда меняется первый инпут то все хорошо, когда меняется второй и последующие инпуты то каждый последующий меняет все предыдущие инпуты которые были изменены, но не меняет нетронутые инпуты. Строчку var thoseInp = $('input#'+thisId); добавил чтобы посмотреть что происходит в дебаггере хромовом, и вот что интересно: при изменении второго и последующих инпутов строчка выше всегда возкращает все инпуты что были изменены ранее или сейчас, но не те что еще не трогались. Вощем странно и не понятно. Решение для себя нашел, он в виде комментария в коде.
  • Вопрос задан
  • 2545 просмотров
Пригласить эксперта
Ответы на вопрос 1
@andreyqin
Вынесите обработчик события click за keypress
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы