C#的WEBBROWSER与JS交互小结

本文实例总结了C#的WEBBROWSER与JS交互的方法。分享给大家供大家参考。具体实现方法如下:

一、实现WebBrowser内部跳转,阻止默认打开IE

1、引用封装好的WebBrowserLinkSelf.dll实现


代码如下:

public partial class MainWindow : Window
{
       private WebBrowser webBrowser = new WebBrowser();
 
       public MainWindow()
       {
           InitializeComponent();
 
            this.webBrowser.LoadCompleted += new LoadCompletedEventHandler(webBrowser_LoadCompleted);
 
           //使webbrowser寄宿于Label上,实现webborwser内部跳转,不用IE打开
           Label lb = new Label { Content = webBrowser };
           WebBrowserHelper webBrowserHelper = new WebBrowserHelper(webBrowser);
           HelperRegistery.SetHelperInstance(lb, webBrowserHelper);
           webBrowserHelper.NewWindow += WebBrowserOnNewWindow;
           this.lbBrowserHost.Content = lb;
 
           // this.webBrowser.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute));
       }
 
       private void WebBrowserOnNewWindow(object sender, CancelEventArgs e)
       {
           dynamic browser = sender;
           dynamic activeElement = browser.Document.activeElement;
           var link = activeElement.ToString();
           this.webBrowser.Navigate(new Uri(link, UriKind.RelativeOrAbsolute));
           e.Cancel = true;
       }
}

2、引用com:Microsoft Internet Controls实现(参考MSDN:http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.aspx public partial class MainWindow : Window

代码如下:

<em id="__mceDel">    {
        public MainWindow()
        {
            InitializeComponent();
            this.webBrowser1.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute));
            this.webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted);
 
        }
        private IServiceProvider serviceProvider;
        void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
        {
            if (this.serviceProvider == null)
            {
                serviceProvider = (IServiceProvider)webBrowser1.Document;
                if (serviceProvider != null)
                {
                    Guid serviceGuid = new Guid("0002DF05-0000-0000-C000-000000000046");
                    Guid iid = typeof(SHDocVw.WebBrowser).GUID;
                    var webBrowserPtr = (SHDocVw.WebBrowser)serviceProvider
                        .QueryService(ref serviceGuid, ref iid);
                    if (webBrowserPtr != null)
                    {
                        webBrowserPtr.NewWindow2 += webBrowser1_NewWindow2;
                    }
                }
            }
        }
 
        private void webBrowser1_NewWindow2(ref object ppDisp, ref bool Cancel)
        {
            dynamic browser = this.webBrowser1;
            dynamic activeElement = browser.Document.activeElement;
            var link = activeElement.ToString();
            this.webBrowser1.Navigate(new Uri(link, UriKind.RelativeOrAbsolute));
            Cancel = true;
        }
 
        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
        internal interface IServiceProvider
        {
            [return: MarshalAs(UnmanagedType.IUnknown)]
            object QueryService(ref Guid guidService, ref Guid riid);
        }
    }
</em>

二、WebBrowser与JS的交互

1、与页面标签的交互


代码如下:

//引用Microsoft.mshtml
 
 //1、添加一个html标签到id为lg的div中
 HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
 IHTMLElement lbelem = doc.createElement("button");
 lbelem.innerText = "test";
 lbelem.style.background = "red";
 IHTMLDOMNode node = doc.getElementById("lg") as IHTMLDOMNode;
 node.appendChild(lbelem as IHTMLDOMNode);  
 
 //2、设置id为su的标签value值和style
 //2.1 使用setAttribute
 HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
 IHTMLElement search = doc.getElementById("su");
 IHTMLDOMAttribute att = search.getAttribute("value") as IHTMLDOMAttribute;
 search.setAttribute("value", "百度一下");
 //search.click();
 search.style.display = "none";
 //2.2 使用outerHtml
 search.outerHTML = "<input id=\"su\" value=\"百度一下\" class=\"bg s_btn\" type=\"submit\" onclick=\"alert('百度一下');\" />";
 //2.3 使用IHTMLDOMAttribute
 IHTMLAttributeCollection attributes = (search as IHTMLDOMNode).attributes as IHTMLAttributeCollection;
 foreach (IHTMLDOMAttribute attr in attributes)
 {
     if (attr.nodeName == "value")
     {
         attr.nodeValue = "百度一下";
     }
 }
 
//3、替换应用了类样式mnav的a标签
 HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
 IHTMLElementCollection collect = doc.getElementsByTagName("a");
 foreach (IHTMLElement elem in collect)
 {
     if (!(elem is IHTMLUnknownElement) && elem.className != null)
     {
         if (elem.className.Equals("mnav", StringComparison.OrdinalIgnoreCase))
         {
             elem.outerHTML = "<a href='#' title='替换标签' >替换</a>";
         }
     }
 }
 
 //4、删除节点
 HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
 IHTMLElement search = doc.getElementById("su");
 IHTMLDOMNode node = search as IHTMLDOMNode;
 node.parentNode.removeChild(node);
 
 //5、JS事件
 //5.1 添加JS
 HTMLDocument doc = (HTMLDocument)this.webBrowser.Document;
 IHTMLElement search = doc.getElementById("su");
 search.outerHTML = "<input id=\"su\" value=\"百度一下\" class=\"bg s_btn\" type=\"submit\" onclick=\"onClick();\" />";
 IHTMLScriptElement scriptErrorSuppressed = (IHTMLScriptElement)doc.createElement("script");
 scriptErrorSuppressed.type = "text/javascript";
 scriptErrorSuppressed.text = "function onClick(){ alert('添加js'); }";
 IHTMLElementCollection nodes = doc.getElementsByTagName("head");
 foreach (IHTMLElement elem in nodes)
 {
     var head = (HTMLHeadElement)elem;
     head.appendChild((IHTMLDOMNode)scriptErrorSuppressed);
 }
 //5.2 删除JS
 IHTMLElementCollection scripts = (IHTMLElementCollection)doc.getElementsByName("script");
 foreach (IHTMLElement node in scripts)
 {
     if (!(node is IHTMLUnknownElement))
     {
         IHTMLScriptElement script = node as IHTMLScriptElement;
         //删除所有js文件引用
         if (string.IsNullOrEmpty(script.text))
         {
             IHTMLDOMNode remove = script as IHTMLDOMNode;
             remove.parentNode.removeChild(remove);
         }
     }
 }
 
 //6、write new html
 mshtml.IHTMLDocument2 doc2 = this.webBrowser.Document as mshtml.IHTMLDocument2;
 doc2.clear();
 doc2.writeln("<HTML><BODY>write new html</BODY></HTML>");

2、数据交互


代码如下:

public MainWindow()
    {
        InitializeComponent();
        this.webBrowser.ObjectForScripting = new ScriptEvent();
        this.webBrowser.NavigateToString(@"<html><head><title>Test</title></head><body><input type=""button"" value=""点击"" onclick=""window.external.ShowMessage('百度一下');"" /></body></html>");
    }
 
[System.Runtime.InteropServices.ComVisible(true)]
public class ScriptEvent
{
    //供JS调用
    public void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • webBrowser执行js的方法,并返回值,c#后台取值的实现

    实例如下: private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + @"\i.html"); txtInfo.Text = webBrowser1.DocumentText; } private void button2_Click(object sender, EventArgs e) { webBrowser1.Document.Invo

  • C#的WEBBROWSER与JS交互小结

    本文实例总结了C#的WEBBROWSER与JS交互的方法.分享给大家供大家参考.具体实现方法如下: 一.实现WebBrowser内部跳转,阻止默认打开IE 1.引用封装好的WebBrowserLinkSelf.dll实现 复制代码 代码如下: public partial class MainWindow : Window {        private WebBrowser webBrowser = new WebBrowser();          public MainWindow()

  • Android WebView与JS交互全面详解(小结)

    Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5页面等,下面来看看这两是怎么交互的 目录 1.

  • IOS与网页JS交互详解及实例

     IOS与网页JS交互 随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类APP,html页面已经不仅仅满足展示功能,这时html要求能与原生语言进行交互.相互传值.比如携程APP中一个热门景点的网页中,点击某个景点,可以跳转到原生中的该景点详情页控制器. 为此,我整理了三种最常用最便捷有效的OC与JS交互的方式,供大家学习交流. 第一种:JS给OC传值. 1. 技术方案:使用JavaScriptCore.framework框架 2. 使

  • IOS中UIWebView、WKWebView之JS交互

    做客户端开发,肯定避免不了JS交互,于是自己对苹果接口做了个简易封装: JSExport-->UIWebView+Interaction.WKScriptMessageHandler -->WKWebView+Interaction以备以后使用. 代码非常简洁,见这里:https://github.com/V5zhou/JSInteraction.git 旧方式 旧的交互方式有通过UIWebViewDelegate实现的:JS与客户端定义好跳转页面参数,在将要跳转时捕获关键字,然后处理业务.

  • Android中WebView与Js交互的实现方法

    获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置js可用,参数:布尔值 在判断是否支持js的时候,不要用alert(),默认不起作用,可以先用document.write()测试 调用WebView对象的addJavascriptInterface(obj, interfaceName)方法,添加js接口,参数:Object对象,String接口名

  • Android WebView使用方法详解 附js交互调用方法

    目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1

  • Android中webview与JS交互、互调方法实例详解

    Android中webview与JS交互.互调方法实例详解 前言: 对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源与很短的项目工期来完成. 但许多情况下,H5页面会需要一些原生持有的一些如用户信息之类的数据,一些交互也需要调用原生的,如toast之类要保持同一个手机风格一致的交互行为.这个时候就需要能够让JS主动调用原生的方法来进行操作或者获取数据.或者是原生调用JS的方法在H5加载的时候传递一些参数. 对于原生调用JS的方法 我们需要实现一个WebViewClient,在这

  • JS交互点击WKWebView中的图片实现预览效果

    Swift 4.0 WKWebView 1.注入js代码 (重点) func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { let jsGetImages = "function getImages(){" + "var objs = document.getElementsByTagName(\"img\");" + "var imgScr =

  • iOS和JS交互教程之WKWebView-协议拦截详解

    前言 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新控件 WKWebView. 相比与 UIWebView, WKWebView 存在很多优势: 支持更多的HTML5的特性 高达60fps滚动刷新频率与内置手势 与Safari相容的JavaScript引擎 在性能.稳定性方面有很大提升占用内存更少 协议方法及功能都更细致 可获取加载进度等. 先解释下标题:"iOS与J

随机推荐