【问题标题】:Stop html form submission停止 html 表单提交
【发布时间】:2013-05-22 13:40:58
【问题描述】:

嗨,我有一个 HTML 表单,我有一个 onclick 事件,它会提示用户,例如如果确定是/否。如果选择否,则它假设停止提交表单,但它似乎正在处理,因为对话框被称为异步。我正在使用 jquery 插件 http://marcosesperon.es/apps/messi/ 来显示我的提示。

下面是我的代码的 sn-p:

    <div id="buttonCommnads">
        <button type="submit" class="k-button cancel" id="save" value="Save" title="Save inspection so it may be submitted at a later time" onclick="processCommand(COMMAND.SAVE);">Save</button>
        <button type="submit" class="k-button" id="Submit" value="Submit" title="Submit inspection" onclick="return processCommand(COMMAND.SUBMIT);">Submit</button>
        @*<button type="submit" class="k-button" id="email" title="Generate draft email for inspection photos" onclick="processCommand(COMMAND.EMAIL);">Email</button>*@
        <button type="button" class="k-button" id="cancel" title="Discard changes" onclick="location.href='@Url.Action("Index", "Inspections")'">Cancel</button>
    </div>

然后是javascript函数:

<script>

var COMMAND = {
    SAVE: { value: 0, name: "Save", tense: "saved" },
    EMAIL: { value: 1, name: "Email", tense: "emailed" },
    SUBMIT: { value: 2, name: "Submit", tense: "submitted" },
};

function processCommand(command) {
    if (command == COMMAND.EMAIL) {

    }
    else if (command == COMMAND.SAVE) {
        $('#Submit').val(command.name);
        $('#inspectionForm').submit();
    }
    else if (command == COMMAND.SUBMIT) {
        $('#Submit').val(command.name);
        var photosAttached = '@Model.Survey.SitePhotoes.Count()';
        console.log('processCommand: submit - begin');
        if (photosAttached >= 1) {
            console.log('processCommand: submit photos attached.');
            return true;
        } else {
            console.log('processCommand: prompt messi.');
            new Messi('Are you sure you wish to submit as no inspections photos are currently attached?', {
                title: command.name + ' Inspection',
                buttons: [{ id: 0, label: 'Yes', val: 'Y', btnClass: 'btn-success' },
                            { id: 1, label: 'No', val: 'N', btnClass: 'btn-danger' }],
                modal: true,
                callback: function (val) {
                    if (val == 'Y') {
                        console.log('processCommand: yes.');
                        return true;
                    }
                    else {
                        console.log('processCommand: no.');
                        return false;
                    }
                }
            });
        }
        console.log('processCommand: submit - end');
    }

}

我正在使用 ASP.NET MVC 4,而且我对 Web 开发还很陌生,所以请原谅我的无知。非常感谢任何帮助。

文斯。

【问题讨论】:

    标签: javascript jquery jquery-plugins forms http-post


    【解决方案1】:

    对话框是异步操作的,没有办法阻止这种情况。但是您可以做的是确保在单击按钮时不提交表单,而是在适当的情况下从回调中提交:

    HTML:

    <button type="submit" class="k-button" id="email" title="Generate draft email for inspection photos" onclick="(function() {processCommand(COMMAND.EMAIL);return false;})()">Email</button>
    

    Javascript:

    function processCommand(command) {
        if (command == COMMAND.EMAIL) {
    
        }
        else if (command == COMMAND.SAVE) {
            $('#Submit').val(command.name);
            $('#inspectionForm').submit();
        }
        else if (command == COMMAND.SUBMIT) {
            $('#Submit').val(command.name);
            var photosAttached = '@Model.Survey.SitePhotoes.Count()';
            console.log('processCommand: submit - begin');
            if (photosAttached >= 1) {
                console.log('processCommand: submit photos attached.');
                return true;
            } else {
                console.log('processCommand: prompt messi.');
                new Messi('Are you sure you wish to submit as no inspections photos are currently attached?', {
                    title: command.name + ' Inspection',
                    buttons: [{ id: 0, label: 'Yes', val: 'Y', btnClass: 'btn-success' },
                                { id: 1, label: 'No', val: 'N', btnClass: 'btn-danger' }],
                    modal: true,
                    callback: function (val) {
                        if (val == 'Y') {
                            console.log('processCommand: yes.');
                            $("form:first").submit();
                        }
                        else {
                            console.log('processCommand: no.');
                        }
                    }
                });
            }
            console.log('processCommand: submit - end');
        }
    

    【讨论】:

    • 感谢您的回复,我输入了您的更改,现在我收到以下错误:函数语句需要名称。你知道是什么问题吗?
    • 抱歉,我在 html 行中遗漏了一些括号。请立即尝试
    • 感谢您的帮助。我还必须添加 event.preventDefault();
    【解决方案2】:

    您通过阻止submit 事件的默认操作来停止表单提交。 click 事件不太合适,因为表单也可以使用键盘提交。

    在 jQuery 中是:

    $('form').on('submit', function(){
        return false;
    })
    

    由于您的提示是异步的,当用户按下“是”时,您总是必须停止正常提交并使用form.submit() 强制提交。

    【讨论】:

    • 感谢您的回复,所以在我的情况下,我将有两个功能?一个是你的功能,例如$('form').on('submit', function(){ return false; }) 然后在我的原始函数中,如果用户回答是,我会输入 form.submit?
    • 如果您总是阻止默认操作并在需要时由 jQuery 触发它,为什么还要让按钮成为提交按钮?正如我在回答中建议的那样,将其更改为普通按钮(不是提交按钮),然后您不必阻止任何内容。
    • 感谢您的回复。我还很新,所以我对 javascript 的了解并不多,只是边学边学。
    • @Iljaas @vinceanon 如果您使用常规按钮,则仅单击该按钮(鼠标,显式键盘选项卡)将激活提示,但使用 Enter 键(或任何其他机制)提交表单像密码管理器)将绕过处理程序。所以唯一可靠的方法是使用onsubmit 并在任何地方提交按钮。
    【解决方案3】:
    event.preventDefault();
    

    使用它来防止默认行为。

    More info

    【讨论】:

    • 感谢您的回复,在我当前的代码中,我没有将事件传递给我的函数。我是否只是将其放在函数的开头,然后在用户单击“是”时提交我的表单?
    【解决方案4】:

    我会将提交按钮更改为普通按钮(将type="submit" 更改为type="button")。然后,在按钮触发的函数中,如果您评估用户已按下“是”,则使用 jQuery 提交表单:

    ('#yourFormID').submit();

    否则只需return false

    编辑:我注意到您已经使用 jQuery 触发了submit(),因此该按钮不需要是submit 类型。如果您只是将按钮 type 更改为 button 而不是 submit 并添加 return false 以防您不想提交任何内容,会发生什么情况?这不是你在问题中的意思吗?

    【讨论】:

    • 是的,你的权利可以纠正它。我对javascript等还很陌生,所以边走边学。感谢大家提供的帮助,这些信息对于尝试了解正在发生的事情以及事情的流程非常有帮助。
    猜你喜欢
    • 2019-07-09
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2018-09-14
    相关资源
    最近更新 更多