Js先觸發失去焦點事件再執行點選事件解決方法
阿新 • • 發佈:2019-02-02
最近在做公司的某個從專案,基本設計和淘寶登陸頁類似:
1)文字框內容為空是,文字框右側無清除按鈕,當有內容時立即顯示清除按鈕;
2)當文字框失去焦點時,清除按鈕消失,獲取焦點時若文字框內有內容,則顯示清除按鈕,否則不顯示;
3)文字框再有內容且獲取焦點的情況下,點選清除按鈕,文字框內容置空,且清除按鈕消失。
隨後想了想,感覺是個很簡單的需求,只要結合使用keyup和blur以及click時間就可以解決了,然而,結果卻不是我想要的,程式碼如下:
html程式碼:
<div class="input-group">
<input type="text" id ="mobile" class="form-control" placeholder="請輸入手機號" autocomplete="off" />
<div class="input-group-addon icon-clear"></div>
</div>
js程式碼:
//繫結監聽手機號文字框內容按鈕事件
$('#mobile').keyup(function() {
var clearBtn = $(this).parent().find('.icon-clear');
if($(this).val() == '') { clearBtn.hide(); }
else { clearBtn.css('display', 'table-cell'); }
});
//手機號輸入框失去焦點,去除清除按鈕;獲取焦點時,若有值則顯示清除按鈕
$('#mobile').blur(function() {
$('#mobile').parent().find('.icon-clear').hide();
}).focus(function(){
if($(this).val() != ''){
$(this).parent().find('.icon-clear').css('display', 'table-cell');
}
});
//清除文字框內容事件
$('.icon-clear').click(function() {
$(this).parent().find('input').val('');
$(this).hide();
});
這樣看著像是什麼問題都沒有的樣子,其實不然,執行之後發現,在文字框中輸入內容後文本框獲取焦點,這個時候我想要去點選清除按鈕來清除剛才我寫的東西,發現,文字框內容沒有置空,清除按鈕卻先消失了,很納悶啊。
後來經查閱發現,是先執行的失去焦點事件,那麼如何去解決呢?
而後,我在失去焦點事件中對其中的方法進行了延遲處理,如下所示:
//驗證碼輸入框失去焦點,去除清除按鈕;獲取焦點時,若有值則顯示清除按鈕
$('#auth_code').blur(function() {
setTimeout(function() { //進行延時處理,時間單位為千分之一秒
$('#auth_code').parent().find('.icon-clear').hide();
}, 100)
}).focus(function(){
if($(this).val() != ''){
$(this).parent().find('.icon-clear').css('display', 'table-cell');
}
});
如此操作後就可以完美解決了,目前未發現任何副作用。