js將字串作為函式名呼叫,實現input文字框等form表單元素回車鍵統一事件響應
阿新 • • 發佈:2018-11-04
通過給文字框<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+"();"))();
}
});
});
});