2013-10-13 81 views
0

我有一個Delphi應用程序,它使用TWebbrowser組件來自動導航到我們擁有的另一個Web應用程序。抑制在Delphi TWebbrowser控件中彈出的「你確定要離開這個頁面」

我的問題是,有時IE會顯示臭名昭着的'你確定要離開這個頁面'的消息,當這種情況發生時,我的應用程序無法導航到另一個頁面,除非用戶點擊'離開此頁'按鈕。不幸的是,我無法編輯網站代碼來刪除此警告。

此消息困擾我的應用程序數週,我無法達成一個適當的解決方案了。我所做的是保持後臺進程在顯示此窗口時手動發送按鍵,但這不是一個好的解決方案,因爲在我的應用程序工作時沒有人可以使用計算機。

我在下面的主題中看到了C#的可能解決方案,但我需要一個Delphi代碼。

Supress the "are you sure you want to leave this page" popup in the .NET webbrowser control

任何幫助是非常,非常讚賞。

謝謝:)

+0

它更可能你可以TEmbeddedWB,該IShellDocView/InternetExplorer的改進版它有很多比TWebBrowser包裝更多的功能做到這一點。 –

+0

爲什麼不能瀏覽的用戶點擊按鈕? –

回答

3

如果網頁處理window.onbeforeunload事件,則此消息由基礎MSHTML引擎顯示。通常,這是出於某種原因,讓用戶知道他/她的輸入尚未保存或提交。當頁面使用addEventListener("beforeonload", handler)attachEvent("onbeforeunload", handler)時,the answer you linked的提示抑制腳本不起作用。我不認爲有這樣做的可靠方法,而不訴諸低級別的Windows掛鉤。

[更新]下面的腳本(尋找「注入這個腳本」)是積極抑制頁面自身的處理程序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接口,像IWebBrowser2IHTMLDocument2IHTMLScriptElement,在它的鏈接的答案做了非常類似的方式。通過一些更多的努力,也可以通過後期綁定來完成,僅使用IDispatch::GetIDsOfNamesIDispatch::Invoke。如果您要求準確的Delphi代碼,我沒有。

+0

謝謝你的想法。我沒有Delphi代碼來做它,但我做的是比發送返回鍵擊更好的解決方法。當文檔加載時,我打電話給.navigate2方法:「javascript:window.onbeforeunload = function(){};窗口。焦點();「 – delphirules

+1

雖然不是一個」優雅「的解決方案,但至少臭名昭着的消息不再困擾我了。 – delphirules

1

您鏈接到對方回答處理瀏覽器的Navigated事件。在它中,它將一個腳本元素注入到頁面中,並插入到頁面上的每個框架中。該腳本爲window.alert指定了一個新值,這樣當頁面上的其他代碼調用它時,它什麼也不做。

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; 
相關問題