0

フォームで送信をトリガーする「入力イベント」のデフォルト値を削除しようとしています。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. アラートがトリガーされた場合、フォーム送信がトリガーされます

every で呼び出される関数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を初めて使用しますが、なぜこれが起こっているのか誰か指摘できますか? 前もって感謝します!

4

1 に答える 1

0

私はこれにかなり驚いています (そして、ブラウザーによって動作が異なることがわかると思います) がalert、ブラウザー環境の他の部分とはやや相容れない面白い獣なので、...

常にデフォルトの動作を停止したいので、次のいずれかをお勧めします。

  1. alertとにかくかなり醜い を使用しないでください(jQuery 用の多くの「モーダル」ダイアログ プラグインのいずれかを使用するか、スタイル付きの絶対配置の を使用して独自のプラグインを使用してくださいdiv)、または

  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();
                }
            }
        });
    }
    

    この 2 番目のオプションが行うことは、 を呼び出す前にイベント ハンドラーを完了させることです。これは、 へのコールバックがほぼ即座に発生するalertようにスケジュールすることによって、イベント処理が完了した後に行われます。(また、jQuery イベント ハンドラーから と の両方を実行するためfinishHandling、 の呼び出しも削除しました。event.preventDefault()return false;event.preventDefault()event.stopPropagation()alert

于 2013-06-28T07:28:39.877 に答える