js 中meta 移除head_JS函数和winform函数之间的相互调用
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函数之间的相互调用相关推荐
- js 中meta 移除head_浅析JS中数据结构
目录 列表(链表) 数组 栈 队列 哈希表 堆 图 二叉查找树 分享一句话:算法即原力,即正义 列表(链表) 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的 ...
- 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 ...
- js最简单的几个特效_高阶函数不会用?教你JS中最实用的几个高阶函数用法
不废话,先来看下什么是高阶函数 高阶函数 函数可以作为参数传递 函数可以作为返回值输出 函数作为参数传递 回调函数 在ajax异步请求的过程中,回调函数使用的非常频繁 在不确定请求返回的时间时,将ca ...
- python 函数定义先后是否会影响函数之间的相互调用?(不影响)
# -*- coding: utf-8 -*- """ @File : 201006_测试是否能将被调用函数写在被调用函数之后.py @Time : 2020/1/6 1 ...
- node.js中的字符串、对象和json处理函数
querystring.parse() 将字符串转成对象,就是把url上带的参数串转成数组对象. querystring.parse(str, [sep], [eq], [options]) 接收参数 ...
- js中的forEach、for in 、for of之间的区别
forEach: 一般用于对数组的遍历,不用于对对象的遍历,此方法会对数组中的每一个值进行遍历,直至全部遍历完成.故在其中的return,break会失效. for in: 一般用于遍历对象,循环遍历 ...
- JS中ArrayBuffer、Uint8Array、Blob与文本字符之间的相互转换
前端 File 上传.下载,Canvas 保存图片,Ajax 和 Fetch 二进制流传输,PDF 预览,浏览器上 WebAssembly 的应用 等等都需要用到 ArrayBuffer 和 Blob ...
- python文件之间的相互调用_「Python 系列」 Python 生成器函数详解
Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...
- matlab文件相互调用,matlab中怎么同时运行多个M文件,这些文件怎么相互调用!
楼主你好你的证明确实是在这样的,我也试验了下,个人认为是当matlab开始运行后,就将所有代码都读入内存,就算运行之中通过其他软件-例如记事本修改了正在运行的代码,也不会影响内存中的计算.个人见解,欢 ...
最新文章
- 云安全趋势:IaaS?谢了,我要 PaaS
- SecureCRT自动登录
- PPP、MP 和 SLIP 配置(上)
- PHP能不能让一串代码现实,一段让你认清现实的Java代码.java
- Python Gevent – 高性能的 Python 并发框架
- 信息学奥赛一本通(1237:求排列的逆序数)
- 信息学奥赛一本通(1397:简单算术表达式求值)
- oa工作流 源码_oa管理系统工作流是什么?类型、优势、功能有哪些?
- Servlet 版本与web.xml配置
- 基本排序看这篇就够了
- python a or b 输出值为_深入分析python的and or 返回值
- 设计模式——19.迭代器模式
- spring学习---IOC--基于xml--bean管理--spring创建对象--spring注入属性--其他属性注入--外部bean--内部bean
- mysql 实现row_number_MySQL实现ROW_NUMBER()
- RGB在线取色器,可视化三通道颜色
- 量化投资的现状和前景
- Android studio 之 Kotlin Not Configured
- 路由器pppoe服务器无响应,宽带拨号服务器无响应
- 【web前端教程笔记】
- 如何禁止计算机用户修改时间,win10禁止用户修改系统时间的方法