簡體   English   中英

阻止jQuery鍵盤延遲觸發

[英]Stop jQuery keyup from triggering with delay

我正在嘗試創建一個電子郵件驗證字段,如果該電子郵件不符合標准,則會顯示一條錯誤消息。 為此,我使用了keyup作為事件,因此一旦用戶輸入了錯誤的電子郵件,該消息便會可見。

但是通過這種方式,每當用戶輸入消息顯示的字符時,我想我會添加一個延遲並為此找到一個功能,但這確實增加了延遲,但是每次觸發消息時仍然顯示。

有人知道如何確保事件在用戶停止一定時間后僅被調用一次嗎?

JSFiddle

<table>
    <tr>
        <td>Email</td>
        <td>
            <input type="text" class="email" value="supplier@supplier.com">
        </td>
        <td><span class="message"></span></td>
    </tr>
</table>
function isEmail(email) {
    var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return regex.test(email);
}

$('.email').on('keyup', function() {
    var delay = (function() {
        var timer = 0;
        return function(callback, ms) {
            clearTimeout(timer);
            timer = setTimeout(callback, ms);
        };
    })();

    var email = $('.email').val();
    $(this).closest('tr').find('.message').hide();

    if (isEmail(email) == false) {
        delay(function() {
            $('.email').closest('tr').find('.message').hide().html('Invalid email.').fadeIn('fast');
        }, 1000);
    } else {
        $(this).closest('tr').find('.message').hide();
    }
});

超時的邏輯在上面有一些缺陷。 請注意,一種更好的方法,允許用戶首次輸入其電子郵件而無需驗證,這是在輸入模糊時檢查電子郵件的有效性。 如果需要,可以在第一次模糊事件發生后的每次按鍵后檢查電子郵件的有效性。 像這樣:

function checkEmailValidity($el) {
    var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    var $msg = $el.closest('tr').find('.message').hide();
    if (!regex.test($el.val()))
        $msg.html('Invalid email.').fadeIn('fast');
}

var timer;    
$('.email').on({ 
    blur: function() {
        $(this).data('hasBlurred', true);
        checkEmailValidity($(this));
    },
    keyup: function() {
        clearTimeout(timer);
        timer = setTimeout(function() {
            $(this).data('hasBlurred') && checkEmailValidity($(this)); 
        }.bind(this), 250);
    }
});

工作實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM