日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

WebBrowser(IE) 与 JS 相互调用

發(fā)布時(shí)間:2024/9/20 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • ????????????????//無參調(diào)用??
  • ????????????????doc.InvokeScript("alertNull");??
  • ??
  • ????????????????Object[]?objArray?=?new?Object[2];??
  • ????????????????objArray[0]?=?(Object)name;??
  • ????????????????objArray[1]?=?(Object)address;??
  • ??
  • ????????????????//有參調(diào)用??
  • ????????????????doc.InvokeScript("callWithPar",?objArray);??
  • ??
  • ????????????????//返回字符串??
  • ????????????????String?str?=?doc.InvokeScript("returnString").ToString();??
  • ????????????????MessageBox.Show(str);??
  • ????????????????//返回對(duì)象??
  • ????????????????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??
  • ????????{??
  • ????????????//?無參數(shù),無返回值??
  • ????????????public?void?CallShow()??
  • ????????????{??
  • ????????????????MessageBox.Show("Called?from?JS");??
  • ????????????}??
  • ??
  • ????????????//無返回值,有參數(shù)??
  • ????????????public?void?ShowSomething(String?msg)??
  • ????????????{??
  • ????????????????MessageBox.Show("Called?from?"?+?msg);??
  • ????????????}??
  • ??
  • ????????????//有返回值,有參數(shù)??
  • ????????????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ò),歡迎將生活随笔推薦給好友。