alert()触发表单提交

时间:2013-06-28 07:22:19

标签: javascript javascript-events

我正在尝试消除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;

其余代码只调用带参数或无参数的函数。问题是,在调用的函数内部,有一个触发警报的条件。这是交易:

  1. 如果未触发提醒,则[enter]不会触发表单提交
  2. 如果触发提醒,则会触发表单提交
  3. 每个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的新手,有人能指出为什么会发生这种情况吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我对此感到非常惊讶(并期望你会发现浏览器之间的行为各不相同),但alert是一个有趣的野兽,与其他浏览器环境有些不一致,所以......

由于您总是希望停止默认行为,我建议:

  1. 不要使用alert,这无论如何都是相当丑陋的(使用jQuery的许多“模态”对话框插件中的任何一个,或者只使用风格化,绝对定位的div {1}})或

  2. 从事件处理序列中取出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时可能需要它在那里,但你没有它。)