问题描述
当他/她的项目未保存时,当他/她试图离开我的 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
的任何信息。
但同时我希望这不是不可能的,我无法相信其他人没有经历过。
1楼
您的脚本中有两个问题:
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"));