1、写一个简单的html页面,用于输入日志,代码如下:

<html><head>    <meta charset="UTF-8">    <script>        //写日志(C#调用js)        function writeLog(log) {            var para = document.createElement("p");            var text = document.createTextNode(log);            para.appendChild(text);            document.getElementById("logID").appendChild(para);        }        //写日志(js调用C#)        function callC(){            window.external.callC();        }script>head><body>    <div> <button onclick="callC()">js调用C#方法button>div>    <div id="logID" style="height: 100px;width: 300px;">div>body>html>

用浏览器打开,效果如下:

2、C#项目中新建【WebBrowserUC】组件,组件继承【WebBrowser】

//浏览器页面初始化完成public event HandledEventHandler webBrowserInitComplete;//js调用C#方法public event HandledEventHandler jsCallEvent;public WebBrowserUC(){    InitializeComponent();    this.ParentChanged += WebBrowserUC_ParentChanged;    this.ScrollBarsEnabled = false;}/// /// 因没有loaded事件,用ParentChanged代替,进入一次后,需要移除事件,不然重复调用/// /// /// private void WebBrowserUC_ParentChanged(object sender, EventArgs e){    try    {        this.ParentChanged -= WebBrowserUC_ParentChanged;        string urlPath = AppDomain.CurrentDomain.BaseDirectory + "jstest\\test.html";        this.Url = new Uri(urlPath);        this.DocumentCompleted += WebBrowserUC_DocumentCompleted;    }    catch (Exception)    {    }}/// /// html加载完成事件/// /// /// private void WebBrowserUC_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){    this.DocumentCompleted -= WebBrowserUC_DocumentCompleted;    if (webBrowserInitComplete != null)     {        webBrowserInitComplete(null, null);    }}/// /// 写日志(C#调用js)/// public void writeLog(string log){    this.Document.InvokeScript("writeLog", new object[] { log });}/// /// 写日志(js调用C#)/// public void callC(){    if (jsCallEvent != null)    {        jsCallEvent(null, null);    }}

3、新建Form窗体,将WebBrowserUC控件加入左边Panel,右边Panle放一个RichTextBox控件,用于输入js调用C#方法的日志

private WebBrowserUC webBrowserUC;public Form2(){    InitializeComponent();}private void Form2_Load(object sender, EventArgs e){    //添加浏览器控件    webBrowserUC = new WebBrowserUC();    webBrowserUC.Dock = DockStyle.Fill;    //浏览器页面加载完成事件    webBrowserUC.webBrowserInitComplete += webBrowserUC_webBrowserInitComplete;    webBrowserUC.jsCallEvent += webBrowserUC_jsCallEvent;    panel_browser.Controls.Add(webBrowserUC);}/// /// 浏览器页面加载完成/// /// /// private void webBrowserUC_webBrowserInitComplete(object sender, HandledEventArgs e){    richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+":浏览器页面加载完成\n");}/// /// 调用js方法/// /// /// private void btn_js_Click(object sender, EventArgs e){    string log = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":C#调用js方法成功";    webBrowserUC.writeLog(log);}/// /// js调用C#方法/// /// /// private void webBrowserUC_jsCallEvent(object sender, HandledEventArgs e){    richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":js调用C#方法成功\n");}

4、运行C#程序,C#调用js方法正常,但是js调用C#方法报js错误,错误内容为找不到方法。

5、原因是WebBrowserUC必须加上注解[ComVisibleAttribute(true)] ,设定com可见,以便js可调用,还必须在构造函数加入这句代码,设定js的调用对象:this.ObjectForScripting = this;

1.6、再次运行c#程序,js调用C#方法和C#调用js方法均正常。

至此JS函数和winform函数之间的相互调用功能完成

js 中meta 移除head_JS函数和winform函数之间的相互调用相关推荐

  1. js 中meta 移除head_浅析JS中数据结构

    目录 列表(链表) 数组 栈 队列 哈希表 堆 图 二叉查找树 分享一句话:算法即原力,即正义 列表(链表) 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的 ...

  2. C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?

    C#与Javascript变量.函数之间的相互调用 2008年11月28日 星期五 05:28 P.M. 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3 ...

  3. js最简单的几个特效_高阶函数不会用?教你JS中最实用的几个高阶函数用法

    不废话,先来看下什么是高阶函数 高阶函数 函数可以作为参数传递 函数可以作为返回值输出 函数作为参数传递 回调函数 在ajax异步请求的过程中,回调函数使用的非常频繁 在不确定请求返回的时间时,将ca ...

  4. python 函数定义先后是否会影响函数之间的相互调用?(不影响)

    # -*- coding: utf-8 -*- """ @File : 201006_测试是否能将被调用函数写在被调用函数之后.py @Time : 2020/1/6 1 ...

  5. node.js中的字符串、对象和json处理函数

    querystring.parse() 将字符串转成对象,就是把url上带的参数串转成数组对象. querystring.parse(str, [sep], [eq], [options]) 接收参数 ...

  6. js中的forEach、for in 、for of之间的区别

    forEach: 一般用于对数组的遍历,不用于对对象的遍历,此方法会对数组中的每一个值进行遍历,直至全部遍历完成.故在其中的return,break会失效. for in: 一般用于遍历对象,循环遍历 ...

  7. JS中ArrayBuffer、Uint8Array、Blob与文本字符之间的相互转换

    前端 File 上传.下载,Canvas 保存图片,Ajax 和 Fetch 二进制流传输,PDF 预览,浏览器上 WebAssembly 的应用 等等都需要用到 ArrayBuffer 和 Blob ...

  8. python文件之间的相互调用_「Python 系列」 Python 生成器函数详解

    Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...

  9. matlab文件相互调用,matlab中怎么同时运行多个M文件,这些文件怎么相互调用!

    楼主你好你的证明确实是在这样的,我也试验了下,个人认为是当matlab开始运行后,就将所有代码都读入内存,就算运行之中通过其他软件-例如记事本修改了正在运行的代码,也不会影响内存中的计算.个人见解,欢 ...

最新文章

  1. 云安全趋势:IaaS?谢了,我要 PaaS
  2. SecureCRT自动登录
  3. PPP、MP 和 SLIP 配置(上)
  4. PHP能不能让一串代码现实,一段让你认清现实的Java代码.java
  5. Python Gevent – 高性能的 Python 并发框架
  6. 信息学奥赛一本通(1237:求排列的逆序数)
  7. 信息学奥赛一本通(1397:简单算术表达式求值)
  8. oa工作流 源码_oa管理系统工作流是什么?类型、优势、功能有哪些?
  9. Servlet 版本与web.xml配置
  10. 基本排序看这篇就够了
  11. python a or b 输出值为_深入分析python的and or 返回值
  12. 设计模式——19.迭代器模式
  13. spring学习---IOC--基于xml--bean管理--spring创建对象--spring注入属性--其他属性注入--外部bean--内部bean
  14. mysql 实现row_number_MySQL实现ROW_NUMBER()
  15. RGB在线取色器,可视化三通道颜色
  16. 量化投资的现状和前景
  17. Android studio 之 Kotlin Not Configured
  18. 路由器pppoe服务器无响应,宽带拨号服务器无响应
  19. 【web前端教程笔记】
  20. 如何禁止计算机用户修改时间,win10禁止用户修改系统时间的方法

热门文章

  1. java 本季度_Java获取当天、本周、本月、本季度、本年等 开始及结束时间
  2. Java基础---认识正则表达式
  3. laydate日期插件使用
  4. Confluence 6 管理协同编辑 - 最大编辑者的限制
  5. Visio画图--我的形状
  6. 验证码颜色、字母、数字、线条、圆点、位置都随机,点击切换验证码
  7. java环境配置——配置tomcat用户
  8. java中使用rmi进行远程方法调用
  9. Pro Silverlight 5 in C# 分享
  10. SQL中的数据转换服务,数据库迁移