Чрезвычайно странное поведение Javascript: onLoad и $ (document) .ready () - PullRequest
2 голосов
/ 22 марта 2012

Я строил функцию автоматической проверки имени пользователя для поля ввода и натолкнулся на эту чрезвычайно странную вещь.

Когда я сделал функцию автоматической проверки как $(document).ready(),

$(document).ready(function(){
    //JohnyP keydowntimer
    var timer = null;
    $('#username').keydown(function(){
        clearTimeout(timer);
        var usercheck = $(this).val();
        timer = setTimeout(function () {
    checkUserName(usercheck);}, 1000);
    });
    //http://www.itechroom.com
    function checkUserName(usercheck){
            $('#usercheck').html('<img src="images/ajax-loader.gif" />');
            $.post("checkuser.php", {username: usercheck} , function(data){
                if (data != '' || data != undefined || data != null){
                    $('#usercheck').html(data);
                }
            });
    }
})

Независимо от того, где я его разместил (до </head> или после <body>), это не могло сработать.

Однако, когда я выполнил функцию как событие загрузки тела (<body onLoad="loadthis()">)

function loadthis(){
    //JohnyP keydowntimer
    var timer = null;
    $('#username').keydown(function(){
        clearTimeout(timer);
        var usercheck = $(this).val();
        timer = setTimeout(function () {
    checkUserName(usercheck);}, 1000);
    });
    //http://www.itechroom.com
    function checkUserName(usercheck){
            $('#usercheck').html('<img src="images/ajax-loader.gif" />');
            $.post("checkuser.php", {username: usercheck} , function(data){
                if (data != '' || data != undefined || data != null){
                    $('#usercheck').html(data);
                }
            });
    }
    }

Работало, но каждый раз, когда автоматически проверялось, появлялся предыдущий результат.

например. Вводя имя «Arch», предполагается, что сообщение «это имя пользователя уже существует», но вместо этого «это имя пользователя доступно», и следующим результатом будет «это имя пользователя уже существует» независимо от чего-либо. Это всегда предыдущий результат.

Итак, я попытался выполнить функцию check_user_name как событие onblur, и все заработало нормально, в checkuser.php нет ничего плохого.

Может кто-нибудь объяснить мне, почему это происходит? Я новичок в jQuery .. Большое спасибо !!!

1 Ответ

0 голосов
/ 24 марта 2012

Вы получаете предыдущее значение, потому что событие keydown инициируется до , когда символ фактически добавляется в текстовое поле.

Вместо этого вам следует обработать событие keyup, котороевозникает после обновления значения:

$('#username').keyup(function(){
    clearTimeout(timer);
    var usercheck = $(this).val();
    timer = setTimeout(function () {
        checkUserName(usercheck);
    }, 1000);
});

Живой тестовый пример .

Что касается $(document).ready(), не работающего, возможно, какая-то синтаксическая ошибка, вызывающая весь кодмежду тегами <script> и </script> произойдет сбой.

...