1. 程式人生 > >js將字串作為函式名呼叫,實現input文字框等form表單元素回車鍵統一事件響應

js將字串作為函式名呼叫,實現input文字框等form表單元素回車鍵統一事件響應

  通過給文字框<input enterKey=“fnName” />設定enterKey=“fnName”,頁面載入完後會自動繫結input的keydown事件,捕捉到回車鍵則呼叫fnName函式,如select等其它form元素也可以。要實現form表單元素回車鍵統一事件響應,js需要做以下事情:
  1)在頁面window.onload事件統一繫結含有enterKey="fnName"屬性的form表單元素的keydown事件;
  2)在keydown事件中判斷是否為回車鍵,如果是則呼叫fnName

1、html+js程式碼段

<!DOCTYPE html>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Form表單元素回車鍵統一響應</title> <script src="http://res.maben.com/ly-assets/assets/js/lib/jquery-1.11.1.min.js"></script> <link rel="stylesheet" href="http://res.maben.com/ly-assets/assets/bootstrap/css/bootstrap.min.css"
>
</head> <body> <div class="container" style="margin-top: 30px;"> <div class="form-horizontal"> <div class="form-group"> <label class="col-xs-2">Input框:</label> <div class="col-xs-4"> <input class="form-control" id="user_name"
enterKey="doSubmit" placeholder="輸入姓名">
</input> </div> </div> <div class="form-group"> <label class="col-xs-2">Select下拉框:</label> <div class="col-xs-4"> <select class="form-control" id="user_title" enterKey="doSubmit()"> <option value="講師">講師</option> <option value="副教授">副教授</option> <option value="教授">教授</option> </select> </div> </div> <div class="form-group"> <div class="col-xs-2 col-sm-offset-2"> <button class="btn btn-primary" type="button" onclick="doSubmit()">提交</button> </div> </div> </div> </div> <script type="text/javascript"> function doSubmit() { alert("name: " + $("#user_name").val() + "\ntitle: " + $("#user_title").val()); } $(window).on("load",function(){ $("[enterKey]").each(function(i, elem){ var funcName = $(elem).attr("enterKey"); if(! funcName) return false; $(elem).bind("keydown", function(e){ if(e.keyCode == 13) { eval(funcName.indexOf("(") >=0 ? funcName : funcName+"();"); } }); }); }); </script> </body> </html>

2、截圖

在這裡插入圖片描述
在這裡插入圖片描述

程式碼說明:
1)enterKey = “”, 可以是函式名,也可以是函式呼叫字串,甚至可以帶引數;

  • enterKey=“doSubmit”
  • enterKey=“doSubmit()”
  • enterKey=“doSubmit(‘arg0’)”

2)$(window).on(“load”,function()…這段程式碼最好放到一個獨立的js檔案,所有頁面引入該js檔案即可實現enterKey,form表單元素回車統一響應處理。

3、程式碼優化

  文中使用eval表示式解析字串函式,存在影響程式碼作用域的風險,從而可能影響程式碼安全性,為此,需要用其它程式碼實現來替換eval表示式,改進後的程式碼如下:

$(window).on("load",function(){
  $("[enterKey]").each(function(i, elem){
    var funcName = $(elem).attr("enterKey");
      if(! funcName) return false;
      $(elem).bind("keydown", function(e){
	if(e.keyCode == 13) {
	  // eval(funcName.indexOf("(") >=0 ? funcName : funcName+"();");
	  (new Function("return " + funcName.indexOf("(") >=0 ? funcName : funcName+"();"))();
	}
      });
  });
});