我按下输入键时始终编写以下代码:
$("#selectorid").keypress(function (e) {
if (e.keyCode == 13) {
var targetType = e.originalTarget
? e.originalTarget.type.toLowerCase()
: e.srcElement.tagName.toLowerCase();
if (targetType != "textarea") {
e.preventDefault();
e.stopPropagation();
// code to handler enter key pressed
}
}
});
有没有办法扩展jQuery,以便我可以写:
$("#selectorid").enterKeyPress(fn);
答案 0 :(得分:5)
您可以将jquery扩展为:
jQuery.fn.returnPress = function(x) {
return this.each(function() {
jQuery(this).keypress(function(e) {
if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
x();
return false;
}
else {
return true;
}
});
});
};
可以调用:
$('selector').returnPress(function() { alert('enter pressed'); });
答案 1 :(得分:4)
你可以做大卫G所说的,但也许最正确的方法是写一个自定义事件:
$(document).keypress(function(evt){
if(evt.keyCode==13) $(evt.target).trigger('enterPress');
});
可以这样绑定:
$(document).bind('enterPress', fn);
请在此处查看示例:http://jquery.nodnod.net/cases/1821/run
这种方法的优点是你可以像jQuery中的任何其他事件一样绑定,解除绑定,命名空间和触发事件。
答案 2 :(得分:2)
您可以将其定义为插件,其代码少一点:
jQuery.fn.enterKeyPress = function(callback) {
return this.not("textarea").keypress(function (e) {
if (e.keyCode == 13) {
callback($(this));
return false;
}
});
};
像这样使用:
$("input").enterKeyPress(function() { alert('hi'); });
这种方法仍然忽略<textarea>
,但我们不会检查每次击键,而是永远不会将keypress
事件绑定到任何textarea。
答案 3 :(得分:0)
这是我用来捕获任何表单元素上的回车键,并将其转换为选项卡。我已经这样做了,因此输入键在textarea中正常工作,以及提交,重置和按钮元素。
$.fn.focusNext = function(e) {
var t = $(this);
if ( t.is(":submit")==true || t.is(":reset")==true || t.is("textarea")==true || t.is("button")==true ) { exit(); }
if (e.which==13 || e.which==3) {
return this.each(function() {
e.preventDefault();
var fields = $(this).parents("form:eq(0)").find(":input:visible");
var index = fields.index( this );
if ( index > -1 && ( index + 1 ) < fields.length ) { fields.eq( index + 1 ).focus(); }
});
}
return true;
};
要使用它,就像这样调用
$(":input").keypress(function(e) { $(this).focusNext(e); });
OR
$(":input").live("keypress", function(e) { $(this).focusNext(e); });