1. 程式人生 > >WebBrowser執行指令碼和呼叫外部方法。

WebBrowser執行指令碼和呼叫外部方法。

控制WebBrowser實際上就是控制IE,最簡單的方法就是執行javascript或vbscript,省去了介面的轉換。
如何執行指令碼?以前我一直用mshtml中IHTMLWindow2介面的execScript()方法,在Delphi中需要uses MSHTML單元:
  1. uses MSHTML;
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. begin
  4.   (WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript(
  5. 'alert("hello");''javascript')
  6. end;
在CSharp中則需要在工程新增Micrsoft.mshtml,後來得到在位址列執行指令碼的啟發。用WebBrowser的Navigate()方法更簡單:
  1. procedure
     TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   WebBrowser1.Navigate('javascript:alert("hello");')
  4. end;
省去了新增引用的麻煩。

如何呼叫外部的方法?先看一段在IE中新增收藏夾的程式碼:
  1. window.external.AddFavorite(url, title);
指令碼中window.external物件就是一個外部物件,AddFavorite()則是這個外部物件的方法!
查了一下資料,原來可以通過IDocHostUIHandler介面的GetExternal()方法,指定指令碼的外部物件。
在CSharp中更簡單,有WebBrowser.ObjectForScripting屬性直接對應window.external,參考如下程式碼:
  1. [ComVisible(
    true)] 
  2. public partial class Form1 : Form
  3. {
  4. public Form1()
  5.     {
  6.         InitializeComponent();
  7.     }
  8. privatevoid Form1_Load(object sender, EventArgs e)
  9.     {
  10.         webBrowser1.DocumentText = @"
  11.             <html>
  12.                 <input type=""button"" value=""測試"" onclick=""alert('Zswang 路過');"">
  13.             </html>
  14.             ";
  15.     }
  16. publicvoid alertMessage(string s)
  17.     {
  18.         MessageBox.Show(s, "囧");
  19.     }
  20. privatevoid webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  21.     {
  22.         webBrowser1.Navigate(@"javascript:
  23.             function alert(str)
  24.             {
  25.                 window.external.alertMessage(str);
  26.             }");
  27.         webBrowser1.ObjectForScripting = this;
  28.     }
  29. }