生活随笔
收集整理的這篇文章主要介紹了
WebBrowser(IE) 与 JS 相互调用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在開發(fā)中我們經(jīng)常將WebBrowser控件嵌入Winform 程序來瀏覽網(wǎng)頁,既然是網(wǎng)頁那么少不了JS。下面就讓我們來說說他們兩之間的相互調(diào)用。
在C#封裝的瀏覽器內(nèi)核中,Chromium 內(nèi)核封裝有Xilium.Cefglue、Cefsharp,Webkit 內(nèi)核封裝 Webkit.Net 、OpenWebKitSharp等。
但是說到和JS的調(diào)用,不得不說還是IE 的WebBrowser 最為簡(jiǎn)單方便。至于IE 為啥方便而其他的不方便,以后我會(huì)寫文章分析。
下面我們還是先看看WebBrowser怎么和JS交互把:
WebBrowser 執(zhí)行JS 代碼
如果腳本已經(jīng)存在于網(wǎng)頁中,我們可以使用?InvokeScript?方法
public object InvokeScript(string scriptName)
public object InvokeScript(string scriptName,object[] args)
下面是一個(gè)簡(jiǎn)單例子:
[html]?view plain?copy <HTML>??????<HEAD>??????????<TITLE>Invoke?Script?Sample</TITLE>??????????<SCRIPT>??????????????//無參數(shù)調(diào)用??????????????function?alertNull(){??????????????????alert("WebBrowser?call!");??????????????}??????????????//有參數(shù)調(diào)用??????????????function?callWithPar(name,?address)?{??????????????????alert("Name?is?"?+?name?+?";?address?is?"?+?address);??????????????}??????????????????????????//返回字符串??????????????function?returnString()?{??????????????????return("This?is?a?test.");??????????????}????????????????//返回對(duì)象??????????????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());??????????????}??????????}?? 如果網(wǎng)頁中不存在目標(biāo)腳本,我們也可以創(chuàng)建腳本再執(zhí)行。
[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);?? 相當(dāng)于更改Html 的DOM結(jié)構(gòu),在<Body>標(biāo)簽后添加<Script>標(biāo)簽,程序加載最后會(huì)執(zhí)行text 中的JS代碼。
JS 調(diào)用 C# 方法
接下來,我們來說說今天的重點(diǎn),在JS中怎么調(diào)用C# 提供的方法。
public object ObjectForScripting {get;[SecurityCriticalAttribute]set;
}
public?類的實(shí)例的?Object,由主機(jī)應(yīng)用程序?qū)崿F(xiàn)且可由寄宿文檔的腳本訪問。
有了這個(gè)方法,調(diào)用C#方法就很簡(jiǎn)單,只需要在C#中聲明一個(gè)C#對(duì)象,然后再設(shè)置?this.webBrowser1.ObjectForScripting = new JSObject();??就OK了。
記得要在JSObject 類上面聲明?[System.Runtime.InteropServices.ComVisible(true)]?才能使對(duì)象可見。
設(shè)置完了之后,就可以在JS 中使用Window.external.function();調(diào)用JSObject()的function() 方法了。
下面是一個(gè)例子:
[html]?view plain?copy <HTML>??????<HEAD>??????????<TITLE>Invoke?C#?Sample</TITLE>??????</HEAD>????????<BODY>??????????<DIV?id="div1">??????????</DIV>??????????<SCRIPT>????????????????window.external.CallShow();??????????????//傳參數(shù)??????????????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";????????????}??
簡(jiǎn)單的傳值就是這樣實(shí)現(xiàn)的,但是對(duì)于復(fù)雜對(duì)象傳遞,涉及到JS對(duì)象和C#對(duì)象轉(zhuǎn)換,并不是很方便,能用字符串的還是用字符串吧。
用JSON傳遞是個(gè)不錯(cuò)的選擇,C#和JS中都有JSON轉(zhuǎn)換工具,可以試試。
以上!
總結(jié)
以上是生活随笔為你收集整理的WebBrowser(IE) 与 JS 相互调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。