【问题标题】:Warn user before leaving web page if changes haven't been saved如果更改尚未保存,请在离开网页前警告用户
【发布时间】:2018-12-11 06:14:12
【问题描述】:

在搜索未保存更改时在离开网页前警告用户的方法时,我找到了这个解决方案:https://stackoverflow.com/a/48238659/9512437,但即使用户点击保存按钮也会弹出警告。我尝试在用户单击提交按钮时添加一个事件以设置一个变量以防止出现警告,但现在警告永远不会出现。

这是我尝试过的:

<script>
    "use strict";
    var btn_click = false;

    (() => {
    const modified_inputs = new Set;
    const defaultValue = "defaultValue";
    // store default values
    addEventListener("beforeinput", (evt) => {
        const target = evt.target;
        if (!(defaultValue in target || defaultValue in target.dataset)) {
            target.dataset[defaultValue] = ("" + (target.value || target.textContent)).trim();
        }
    });
    // detect input modifications
    addEventListener("input", (evt) => {
        const target = evt.target;
        let original;
        if (defaultValue in target) {
            original = target[defaultValue];
        } else {
            original = target.dataset[defaultValue];
        }
        if (original !== ("" + (target.value || target.textContent)).trim()) {
            if (!modified_inputs.has(target)) {
                modified_inputs.add(target);
            }
        } else if (modified_inputs.has(target)) {
            modified_inputs.delete(target);
        }
    });
    addEventListener("beforeunload", (evt) => {
        if (modified_inputs.size && !btn_click) {
            const unsaved_changes_warning = "Changes you made may not be saved.";
            evt.returnValue = unsaved_changes_warning;
            return unsaved_changes_warning;
        }
    });
    addEventListener("")
    })();

    document.getElementById("submit").onclick = function save() {
        btn_click = true;
    }
</script>

知道我做错了什么吗?

【问题讨论】:

  • 保存时是否清除了修改后的输入集?我在这里看不到它,但如果你不是,那将是罪魁祸首。
  • 由于我没有使用 AJAX,我认为我不需要(如果我错了,请纠正我)。我最终在发布后就弄清楚了(尽管我仍然不能 100% 确定到底是什么导致了问题)。

标签: javascript


【解决方案1】:

原来我做错了几件事。我的猜测是在"use strict" 下添加document.getElementById("submit").onclick 会导致错误(https://www.w3schools.com/js/js_strict.asp)或导致检测出现问题,因为即使没有&amp;&amp; !btn_click 也只是简单地添加函数会导致它无法工作。我还必须将if (modified_inputs.size &amp;&amp; !btn_click) { 更改为if (modified_inputs.size &gt;&gt; 0 &amp;&amp; !btn_click) {

最后,最终为我工作的解决方案如下:

<script>
    var btn_click = false;

    function save() {
        btn_click = true;
    }

    "use strict";
    (() => {
    const modified_inputs = new Set;
    const defaultValue = "defaultValue";
    // store default values
    addEventListener("beforeinput", (evt) => {
        const target = evt.target;
        if (!(defaultValue in target || defaultValue in target.dataset)) {
            target.dataset[defaultValue] = ("" + (target.value || target.textContent)).trim();
        }
    });
    // detect input modifications
    addEventListener("input", (evt) => {
        const target = evt.target;
        let original;
        if (defaultValue in target) {
            original = target[defaultValue];
        } else {
            original = target.dataset[defaultValue];
        }
        if (original !== ("" + (target.value || target.textContent)).trim()) {
            if (!modified_inputs.has(target)) {
                modified_inputs.add(target);
            }
        } else if (modified_inputs.has(target)) {
            modified_inputs.delete(target);
        }
    });
    addEventListener("beforeunload", (evt) => {
        if (modified_inputs.size >> 0 && !btn_click) {
            const unsaved_changes_warning = "Changes you made may not be saved.";
            evt.returnValue = unsaved_changes_warning;
            return unsaved_changes_warning;
        }
    });
    addEventListener("")
    })();
</script>

然后将您的 onclick 添加到元素:

<button type="submit" class="w3-button w3-right w3-theme" id="button" onclick="save()">Save</button>

【讨论】:

  • 我喜欢这个解决方案,因为它是我见过的唯一一个不使用 jquery 的解决方案。
  • 遇到了同样的问题。谢谢。
猜你喜欢
  • 2019-06-18
  • 2016-06-25
  • 2017-12-30
  • 1970-01-01
  • 2019-03-21
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多