AJAX 提交表单,页面为什么会刷新?

2018-10-16 11:26:16 +08:00
 simadad

AJAX 提交表单,页面为什么会刷新?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TTT</title>
</head>
<body>
    <form id="f" method="get">
        <input type="text" placeholder="A">
        <button type="submit">B</button>
    </form>
    <script>
    document.getElementById('f').onsubmit = function (e) {
        console.log(e);
        const xhr = new XMLHttpRequest();
        xhr.open('get', '', true);
        xhr.send();
    };
    </script>
</body>
</html>

上面这段简短的代码,点击按钮,预期应该是在 console 里打印出提交事件,然后页面不刷新,结果 TM 每次点击按钮整个页面都刷新一次————

已尝试方法

onsubmit 函数最后加上 return false 可以做到异步提交,不刷新网页。

但是

但是,我很确定我以前实现的异步提交从来都没用过 return false,不知道为什么这次突然就不行了,有没有大神能够回答?

附上之前没加 return false 仍然成功的代码————

function post_tab() {
        // 提交标签打印数量
        document.getElementById('work_form').onsubmit = function (e) {
            e.preventDefault();
            const xhr = new XMLHttpRequest(),
                f = e.target,
                formData = new FormData(f),
                log = $('#print_log');
            xhr.open('POST', f.action, true);
            xhr.responseType = 'json';
            xhr.onreadystatechange = function () {
                if(xhr.readyState === 4 && xhr.status === 200){
                    const data = xhr.response;
                    console.log(data);
                    print_tab(data['qrs'], log[0]);
                    log.scrollTop(log[0].scrollHeight - log.height());
                    input_clean('input_qr');
                }
            };
            xhr.send(formData);
        }
    }

该函数 post_tab 使用 onclick 绑定在提交按钮上————

<button class="btn btn-success form-control" onclick="post_tab()">开始打印</button>

为什么这段代码每加 return false 仍然能够异步提交不刷新网页呢?

2144 次点击
所在节点    问与答
5 条回复
CoderEQ
2018-10-16 11:39:10 +08:00
第一段代码有<button type="submit">B</button> type 属性表示属于 form 表单元素。第二段<button class="btn btn-success form-control" onclick="post_tab()">开始打印</button> 仅仅是一个 button,跟 form 无关,所以不触发
no502zhang
2018-10-16 11:41:11 +08:00
form 中的 button 为 submit, 默认就会提交 form
form 的 action 不写, 默认就是当前页
simadad
2018-10-16 13:29:33 +08:00
@CoderEQ 第二段省略了 `type`,chrome 的缺省值就是 submit,我刚刚测试了一下,把第二段的 `type="submit"` 加上,仍然不触发
iNaru
2018-10-16 13:39:37 +08:00
e.preventDefault();
阻止了浏览器的提交这个默认行为
simadad
2018-10-16 13:46:27 +08:00
@iNaru 原来如此,感谢大佬!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/498048

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX