簡體   English   中英

jQuery鍵盤事件在錯誤的輸入字段上觸發

[英]jQuery keyboard event fires on wrong input fields

與之前運行腳本相比,我正在創建不直接提交的簡單表單。 因此,經典點擊Enter將不會發送表格。 但是,由於用戶經常按Enter鍵來發送表單,因此我創建了用於單擊Enter的簡單擴展,即單擊按鈕時將調用腳本。

例如,我有一個簡單的表格:

<form id="testForm">
  <input type="email" id="email" />
  <input type="password" id="pass" />
  <button id="btnLogin" type="button">Login</button>
</form>

我創建的擴展名為:

(function($){
    $.fn.noEnter=function(options){
        let settings=$.extend({btn:""},options);
        function _init(){
            $(this).on("keypress",function(event){
                if(event.keyCode === 13) {
                    event.preventDefault();
                    $("#"+settings.btn).click();
                    return false;
                }
            });
        }
        this.each(function(){_init();});
        return{}
    };
}(jQuery));

然后在腳本中,我這樣調用:

$("#email").noEnter({btn:"btnLogin"});
$("#pass").noEnter({btn:"btnLogin"});
$("#btnLogin").click(function(){
.....
});

這正在工作。 問題是 ,對於每個輸入字段,它都工作兩次 看起來其他輸入字段正在接受按鍵(或按鍵按下)事件。 還是我錯過了什么?

使用event.stopPropagation(); 以防止進一步執行。

$(this).on("keypress",function(event){
                if(event.keyCode === 13) {
                    event.stopPropagation();
                    event.preventDefault();
                    $("#"+settings.btn).click();
                    return false;
                }
            });

問題是this是在_init函數中引用窗口對象,以避免嘗試以下代碼

(function($){
    $.fn.noEnter=function(options){
        let settings=$.extend({btn:""},options);
        var self = this;
        function _init(){
            $(self).on("keypress",function(event){
                if(event.keyCode === 13) {
                    event.preventDefault();
                    $("#"+settings.btn).click();
                    return false;
                }
            });
        }
        this.each(function(){_init();});
        return{}
    };
}(jQuery));

$("#email").noEnter({btn:"btnLogin"});
$("#pass").noEnter({btn:"btnLogin"});
$("#btnLogin").click(function(e){
    console.log('righty');
});

如果您想嘗試的話,有一個工作示例是jsfiddle

暫無
暫無

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

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