0

我有一个 Delphi 应用程序,它使用TWebbrowser组件自动导航到我们拥有的另一个 Web 应用程序。

我的问题是,有时 IE 会显示臭名昭著的“您确定要离开此页面”消息,当这种情况发生时,除非用户单击“离开此页面”按钮,否则我的应用无法导航到其他页面。很遗憾,我无法编辑网站代码以删除此警告。

此消息困扰我的应用程序数周,我无法再找到合适的解决方案。我所做的是保持后台进程在显示此窗口时手动发送击键,但这不是一个好的解决方案,因为在我的应用程序运行时没有人可以使用计算机。

我在下面的主题中看到了 C# 的可能解决方案,但我需要一个 Delphi 代码。

抑制 .NET webbrowser 控件中的“您确定要离开此页面”弹出窗口

任何帮助都非常非常感谢。

谢谢 :)

4

3 回答 3

3

如果网页处理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/MSHTMLCOM 接口,例如IWebBrowser2, IHTMLDocument2, 。IHTMLScriptElement通过更多的努力,同样可以通过后期绑定、使用IDispatch::GetIDsOfNamesIDispatch::Invoke仅来完成。如果您要确切的 Delphi 代码,我没有。

于 2013-10-14T04:22:45.153 回答
1

您链接到的另一个答案处理浏览器的Navigated事件。在其中,它将脚本元素注入页面和页面上的每个框架。该脚本分配一个新值,window.alert以便当页面上的其他代码调用它时,它什么也不做。

于 2013-10-13T18:52:53.037 回答
1

此代码重置事件处理程序:

var
  WrkIHTMLWindow2: IHTMLWindow2;
  WrkIHTMLWindow2Disp: IHTMLWindow2Disp;
begin
  WrkIHTMLWindow2 := IHTMLDocument2Disp(WrkIWebBrowser2.Document).parentWindow;
  if WrkIHTMLWindow2.QueryInterface(IHTMLWindow2Disp, WrkIHTMLWindow2Disp) = S_OK then
    if not VarIsNull(WrkIHTMLWindow2Disp.onbeforeunload) then
      WrkIHTMLWindow2Disp.onbeforeunload := NULL;
end;
于 2014-02-21T11:51:21.913 回答