0

以下のコードの何が問題なのか、誰か説明してもらえますか? パブリック変数を宣言して setTimeout に設定しています。null でない場合は、再度設定される前にタイムアウトをクリアしています。タイムアウトをクリアしようとすると、未定義になるため、タイムアウトが引き続き実行されます。

var usernameCheckTimeout = null;

$(document).ready(function(){
    $("#username").on("keyup", function(e){ 
        if($(this).val().length >= 6)
        {
            if(usernameCheckTimeout != null)
            {
                clearTimeout(usernameCheckTimeout);
            }
            usernameCheckTimeout = setTimeout(isUsernameAvailable($(this).val()), 1000);
        }
    });
});

function isUsernameAvailable(username)
{
    $.ajax({
        url : "/account/username-check",
        method : "POST",
        dataType : 'json',
        data : {
            'username' : username
        }
    }).done(function(data) {
        console.log(data);
    });
};
4

3 に答える 3

3

null チェックを行う必要はありません。 また、 の周りthisにクロージャを作成する必要がありthisますthis

var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
    if ($(this).val().length >= 6) {
        clearTimeout(usernameCheckTimeout);
        var that = this;
        usernameCheckTimeout = setTimeout(function () {
            isUsernameAvailable($(that).val();
        }, 1000);
    }
});

いつものようにいくつかのjsfiddle が大好きです。

于 2013-03-29T14:20:55.067 に答える
2

タイムアウトをクリアしています。問題は、関数を に渡すのではなく、すぐに関数を呼び出していることですsetTimeout

setTimeout(isUsernameAvailable($(this).val()), 1000);

isUsernameAvailable($(this).val())が呼び出され、この呼び出しの結果が に渡されsetTimeoutます。

代わりに、この関数を呼び出す関数を渡す必要があります。

this編集: @Mark が言ったように、期待どおりではないことに対処する必要もあります。

var value = $(this).val();

setTimeout(function(){
    isUsernameAvailable(value)
}, 1000);
于 2013-03-29T14:19:02.817 に答える
1

いくつかの問題があります。巨大な最初の問題は、すぐに実行 isUsernameAvailable($(this).val())して戻り値を渡すsetTimeoutことです。これを匿名関数に移動して、タイムアウトによって匿名関数が呼び出されるまで実行されないようにする必要があります。

usernameCheckTimeout = setTimeout(function () {
    isUsernameAvailable($(this).val());
}, 1000);

JavaScript のタイムアウト関数は、数値 ID に依存して機能します。nullorまたはその他のテストは避けundefined、代わりに数値をテストする必要があります。

// leave it as undefined
var usernameCheckTimeout;

...

if (typeof usernameCheckTimeout === 'number') {
    clearTimeout(usernameCheckTimeout);
}
于 2013-03-29T14:22:05.283 に答える