一个非常奇怪的Javascript行为:onLoad和$(document).ready()

时间:2012-03-22 15:10:10

标签: javascript jquery document-ready onload-event

我正在为输入字段构建自动检查用户名可用性功能,我遇到了这个非常奇怪的事情。

当我将自动检查功能作为$(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事件(<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 :(得分:0)

您获得之前的值是因为{<1}}事件在字符实际添加到文本框之前被触发了。

您应该处理keydown事件,这是在值更新后引发的:

keyup

Live test case

至于$('#username').keyup(function(){ clearTimeout(timer); var usercheck = $(this).val(); timer = setTimeout(function () { checkUserName(usercheck); }, 1000); }); 无效,可能是一些语法错误导致$(document).ready()<script>标记之间的整个代码失败。