javascript - 使用 preventDefault() 提交表单但保留浏览器自动完成功能

标签 javascript jquery html ajax

我正在使用 ajax 发送表单数据,因此要覆盖我使用 preventDefault() 的默认浏览器行为,但我想保留浏览器功能以记住为 future 的自动完成。

这有可能吗?

HTML

<form id="form-login" action="/padrao/Login/executaLoginAjax" method="post">
    <input type="text" id="usuario" name="usuario[email]" class="entradas" placeholder="Usuário" maxlength="80" required />
    <input type="password" id="senha" name="usuario[senha]" class="entradas" placeholder="Senha" maxlength="12" required />
    <input type="submit" id="btn-logar" value="Acessar o sistema" />
</form>

Javascript

$('#form-login').submit(function(event){

    event.preventDefault();

    var action = $(this).attr('action');
    var dados  = $(this).serialize();

    $.ajax({
        type: "POST",
        url: action,
        data: dados,
        dataType: "json",

        success: function(json){

            if(json.sucesso){
                window.location.href = 'http://' + location.host + '/home';
            }else{
                alert('fail');
            }

        }

    });

});

最佳答案

简答

更正我上面的评论。在监听 native 表单提交时使用 preventDefault() 方法时,这是不可能的。 AJAX 与此无关,只是作为首先使用 preventDefault() 的常见原因。

长答案

截至目前,网络浏览器的自动填充或自动完成数据存储仅在表单实际通过常规提交过程并触发数据序列化时触发。

使用 event.preventDefault(); 可防止浏览器达到此状态,因此它永远不知道要保存表单数据以备后用。

可能的补救措施

  1. 设置 var allowNativeSubmit = false; 标志,在成功验证并保存表单后设置 allowNativeSubmit = true;,手动调用提交触发器并构建如果此标志为真,则在跳过 AJAX 提交的逻辑中。将表单数据发送到不对数据执行任何操作的成功页面。

  2. 每次成功提交表单时,您都可以将数据保存到本地存储并实现 jQuery UI 自动完成功能以模拟浏览器的自动填充功能。

我之前实现过#1,效果很好。

#1 示例

$(document).ready(function () {

    var allowNativeSubmit = false;

    $('#form-login').on('submit', function (e) {

        if (!allowNativeSubmit) {

            e.preventDefault();

            var formTarget = $(this);

            $.ajax({
                type: formTarget.attr('method'),
                url: formTarget.attr('action'),
                data: formTarget.serialize(),
                dataType: "json",
                success: function (data) {

                    if (data.sucesso) {

                        // set the action to success page
                        formTarget.attr('action', 'success.html');

                        // allow native browser submit
                        allowNativeSubmit = true;

                        // call the native browser submit
                        formTarget.submit();

                    } else {

                        alert('form validation failed!');

                    }
                }
            });
        }
    });
});

关于javascript - 使用 preventDefault() 提交表单但保留浏览器自动完成功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861640/

相关文章:

javascript - Node.js fs.accessSync 无法正常工作

javascript - 如何在 TypeScript 中导出对象?

javascript - 猫头鹰 slider 在响应式移动模式下显示三个元素而不是一个

c# - getJSON 在页面刷新 (F5) 时中断。怎么修?

javascript - 滚动到最近的 href 选项卡 jquery

c# - 如何在没有用户确认的情况下从 C# 或 javascript 打印 HTML 文档?

javascript - 在 Laravel 5.1 中访问页面 Javascript 中的 env 值

javascript - 如何从 Controller 返回对象列表并使用 JQuery(Spring MVC、ajax)显示它们

xml - 图像/按钮上的文字

javascript - 使用angularJS将页面动态加载到div中