如果网页处理window.onbeforeunload事件,则底层 MSHTML 引擎会显示此消息。通常,它的存在是有原因的,让用户知道他/她的输入尚未保存或提交。您链接的答案中的提示抑制脚本不适用于页面使用addEventListener("beforeonload", handler)
或的情况attachEvent("onbeforeunload", handler)
。我认为没有一种可靠的方法可以做到这一点,而无需使用低级 Windows 挂钩。
[更新]以下脚本(查找“注入此脚本”)是一种 hack,它onbeforeunload
通过setInterval
. 它应该在 99% 的情况下工作,但它仍然留下空白让页面onbeforeonload
在导航之前覆盖。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title></title>
<script type="text/javascript">
window.attachEvent("onbeforeunload", function (ev) {
window.event.returnValue = "onbeforeunload via window.attachEvent()";
});
window.addEventListener("beforeunload", function (ev) {
window.event.returnValue = "onbeforeunload via window.addEventListener()";
});
window.onbeforeunload = function (ev) {
window.event.returnValue = "onbeforeunload via window.onbeforeunload";
};
</script>
<script type="text/javascript">
//
// Inject this script
//
(function () {
var onbeforeunloadHandler = function (ev) {
if (ev) {
if (ev.stopPropagation)
ev.stopPropagation();
if (ev.stopImmediatePropagation)
ev.stopImmediatePropagation();
ev.returnValue = undefined;
}
window.event.returnValue = undefined;
}
var handler = null;
var intervalHandler = function () {
if (handler)
window.detachEvent("onbeforeunload", handler);
// window.attachEvent works best
handler = window.attachEvent("onbeforeunload", onbeforeunloadHandler);
// handler = window.addEventListener("beforeunload", onbeforeunloadHandler);
// handler = window.onload = onbeforeunloadHandler;
};
window.setInterval(intervalHandler, 500);
intervalHandler();
})();
</script>
</head>
<body>
<a href="http://www.example.com">Go away</a>
</body>
</html>
要使用 Delphi 注入此脚本,您可能需要以与链接答案中非常相似的方式使用低级WebBrowser/MSHTML
COM 接口,例如IWebBrowser2
, IHTMLDocument2
, 。IHTMLScriptElement
通过更多的努力,同样可以通过后期绑定、使用IDispatch::GetIDsOfNames
和IDispatch::Invoke
仅来完成。如果您要确切的 Delphi 代码,我没有。