生活随笔
收集整理的這篇文章主要介紹了
WebBrowser(IE) 与 JS 相互调用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發中我們經常將WebBrowser控件嵌入Winform 程序來瀏覽網頁,既然是網頁那么少不了JS。下面就讓我們來說說他們兩之間的相互調用。
在C#封裝的瀏覽器內核中,Chromium 內核封裝有Xilium.Cefglue、Cefsharp,Webkit 內核封裝 Webkit.Net 、OpenWebKitSharp等。
但是說到和JS的調用,不得不說還是IE 的WebBrowser 最為簡單方便。至于IE 為啥方便而其他的不方便,以后我會寫文章分析。
下面我們還是先看看WebBrowser怎么和JS交互把:
WebBrowser 執行JS 代碼
如果腳本已經存在于網頁中,我們可以使用?InvokeScript?方法
public object InvokeScript(string scriptName)
public object InvokeScript(string scriptName,object[] args)
下面是一個簡單例子:
[html]?view plain?copy <HTML>??????<HEAD>??????????<TITLE>Invoke?Script?Sample</TITLE>??????????<SCRIPT>??????????????//無參數調用??????????????function?alertNull(){??????????????????alert("WebBrowser?call!");??????????????}??????????????//有參數調用??????????????function?callWithPar(name,?address)?{??????????????????alert("Name?is?"?+?name?+?";?address?is?"?+?address);??????????????}??????????????????????????//返回字符串??????????????function?returnString()?{??????????????????return("This?is?a?test.");??????????????}????????????????//返回對象??????????????function?returnScriptObject()?{??????????????????return(new(MyObject));??????????????}????????????????function?MyObject()?{??????????????????this.Data?=?"Data?for?my?private?object.";??????????????}??????????</SCRIPT>??????</HEAD>????????<BODY>??????????<DIV?id="div1">??????????</DIV>??????</BODY>??</HTML>?? [csharp]?view plain?copy private?void?button2_Click(object?sender,?EventArgs?e)??????????{??????????????string?name?=?"dai";??????????????string?address?=?"123";??????????????if?(webBrowser1.Document?!=?null)??????????????{??????????????????HtmlDocument?doc?=?webBrowser1.Document;??????????????????????????????????doc.InvokeScript("alertNull");????????????????????Object[]?objArray?=?new?Object[2];??????????????????objArray[0]?=?(Object)name;??????????????????objArray[1]?=?(Object)address;????????????????????????????????????doc.InvokeScript("callWithPar",?objArray);????????????????????????????????????String?str?=?doc.InvokeScript("returnString").ToString();??????????????????MessageBox.Show(str);??????????????????????????????????Object?jscriptObj?=?doc.InvokeScript("returnScriptObject");??????????????????MessageBox.Show(jscriptObj.ToString());??????????????}??????????}?? 如果網頁中不存在目標腳本,我們也可以創建腳本再執行。
[csharp]?view plain?copy HtmlElement?ele?=?webBrowser1.Document.CreateElement("script");??ele.SetAttribute("type",?"text/javascript");??ele.SetAttribute("text",?"alert('new?script')");??webBrowser1.Document.Body.AppendChild(ele);?? 相當于更改Html 的DOM結構,在<Body>標簽后添加<Script>標簽,程序加載最后會執行text 中的JS代碼。
JS 調用 C# 方法
接下來,我們來說說今天的重點,在JS中怎么調用C# 提供的方法。
public object ObjectForScripting {get;[SecurityCriticalAttribute]set;
}
public?類的實例的?Object,由主機應用程序實現且可由寄宿文檔的腳本訪問。
有了這個方法,調用C#方法就很簡單,只需要在C#中聲明一個C#對象,然后再設置?this.webBrowser1.ObjectForScripting = new JSObject();??就OK了。
記得要在JSObject 類上面聲明?[System.Runtime.InteropServices.ComVisible(true)]?才能使對象可見。
設置完了之后,就可以在JS 中使用Window.external.function();調用JSObject()的function() 方法了。
下面是一個例子:
[html]?view plain?copy <HTML>??????<HEAD>??????????<TITLE>Invoke?C#?Sample</TITLE>??????</HEAD>????????<BODY>??????????<DIV?id="div1">??????????</DIV>??????????<SCRIPT>????????????????window.external.CallShow();??????????????//傳參數??????????????window.external.ShowSomething("Hello");??????????????//返回值??????????????var?msg?=?window.external.returnSomething("Hello");??????????????alert(msg);???????????????????????????//直接獲取變量??????????????alert(window.external.a);??????????</SCRIPT>??????</BODY>????</HTML>?? [csharp]?view plain?copy [System.Runtime.InteropServices.ComVisible(true)]??????????public?class?JSObject??????????{??????????????????????????public?void?CallShow()??????????????{??????????????????MessageBox.Show("Called?from?JS");??????????????}????????????????????????????public?void?ShowSomething(String?msg)??????????????{??????????????????MessageBox.Show("Called?from?"?+?msg);??????????????}????????????????????????????public?string?returnSomething(String?msg)??????????????{??????????????????msg?+=?"From?C#";??????????????????return?msg;??????????????}??????????????????????????public?string?a?=?"A";????????????}??
簡單的傳值就是這樣實現的,但是對于復雜對象傳遞,涉及到JS對象和C#對象轉換,并不是很方便,能用字符串的還是用字符串吧。
用JSON傳遞是個不錯的選擇,C#和JS中都有JSON轉換工具,可以試試。
以上!
總結
以上是生活随笔為你收集整理的WebBrowser(IE) 与 JS 相互调用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。