我正在尝试消除type=text
上的“输入事件”默认值,这会触发表单上的提交。我是这样做的:
var onEnter = function(values){
$("#"+values['id']).keydown(function(e){
if (e.which == 13) {
event.preventDefault();
var function_to_call = window[values['function']];
if(typeof function_to_call === 'function'){
if(values['parameters']!= null){
parameters = values['parameters'];
var args;
if(typeof parameters === 'string')
args = parameters.split(',');
else
args = new Array(parameters);
function_to_call.apply(window, args);
}
else function_to_call();
}
return false;
}
});
}
取消默认事件的代码是
event.preventDefault();
return false;
其余代码只调用带参数或无参数的函数。问题是,在调用的函数内部,有一个触发警报的条件。这是交易:
[enter]
不会触发表单提交每个type=text
调用的函数都是相同的,这是警报条件:
......
if(!regex_match(item)){
alert("Solo son posibles los siguientes caracteres: '.' ',' 'a-z' 'a-Z' '0-9' y ' '");
return;
}
.....
var regex_match = function(text){
regex = /^[_., 0-9a-záéíóúñ]+$/i;
return regex.test(text);
}
事情尝试了:
return false;
之后alert(...)
”; 我是javascript的新手,有人能指出为什么会发生这种情况吗?提前谢谢!
答案 0 :(得分:0)
我对此感到非常惊讶(并期望你会发现浏览器之间的行为各不相同),但alert
是一个有趣的野兽,与其他浏览器环境有些不一致,所以......
由于您总是希望停止默认行为,我建议:
不要使用alert
,这无论如何都是相当丑陋的(使用jQuery的许多“模态”对话框插件中的任何一个,或者只使用风格化,绝对定位的div
{1}})或
从事件处理序列中取出alert
,如下所示:
var onEnter = function (values) {
$("#" + values['id']).keydown(function (e) {
if (e.which == 13) {
setTimeout(finishHandling, 0);
return false;
}
function finishHandling() {
var function_to_call = window[values['function']];
if (typeof function_to_call === 'function') {
if (values['parameters'] != null) {
parameters = values['parameters'];
var args;
if (typeof parameters === 'string')
args = parameters.split(',');
else
args = new Array(parameters);
function_to_call.apply(window, args);
} else function_to_call();
}
}
});
}
第二个选项的作用是在调用alert
之前让事件处理程序完成,通过安排回调到finishHandling
几乎立即发生,但在事件处理完成之后。 (我也删除了对event.preventDefault()
的调用,因为来自jQuery事件处理程序的return false;
执行event.preventDefault()
和event.stopPropagation()
。alert
时可能需要它在那里,但你没有它。)