当前位置: 代码迷 >> JavaScript >> 如何在 onbeforeunload 事件期间提取目标主机名
  详细解决方案

如何在 onbeforeunload 事件期间提取目标主机名

热度:46   发布时间:2023-06-13 12:30:48.0

当他/她的项目未保存时,当他/她试图离开我的 web 应用程序时,我想警告用户。 目前我不关心当前正在编辑的编辑框。 我从会话中知道项目的脏状态。

我很快意识到,如果我为 window.onbeforeunload 设置一个函数,即使他/sh 导航到我的 web 应用程序中的另一个页面,它也会打扰用户。 在这种情况下不需要干扰,会话将仍然有效。

我尝试了从派生的解决方案

window.onbeforeunload = function (e) {
    var targetHost = new URL(e.target.URL).hostname;
    if (targetHost != window.location.host)
        return "Project is unsaved!!!";
    else
        return null;
};

new URL(e.target.URL).hostname结果(至少在 IE11 上):

JavaScript 运行时错误:对象不支持此操作

new URL(e.target.URL).hostname是,我无法通过任何搜索找到有关没有new URL(e.target.URL).hostname的任何信息。

但同时我希望这不是不可能的,我无法相信其他人没有经历过。

您的脚本中有两个问题:

window.onbeforeunload = function (e) {
    var targetHost = new URL(e.target.URL).hostname;
    if (targetHost != window.location.host) {
        return "Project is unsaved!!!";
    else
        return null;
};

首先是你没有关闭你的if 第二个是e.target.URL显然不受 IE 支持。 你需要有一个 A 和一个 B 计划。

A计划:适用于e.target.URL存在的情况。 在这种情况下,您将按照最初实施的方式处理该案例,但使用上面提到的语法修复。

B计划:适用于e.target.URL不存在的情况。 对于这种情况,您应该假设用户离开了站点。 当用户使用您的控件进行导航时,您可以通过添加知识来改进该方法,例如,您知道给定的锚点将留在网站上。 在这种情况下,您可以定义一个单击事件并将布尔值设置为true (并且该布尔值的默认值应为false ...),以便稍后您的onbeforeunload事件将知道您的用户留在网站上,即使他或她使用 IE。

所以你需要一个这样的逻辑:

var targetHost = !!e.target.URL ? (new URL(e.target.URL).hostname) : ((myFlag) ? (window.location.hostname) : ("elsewhere"));