C# Winform 执行JS脚本

方法1:利用Microsoft.JScript

Microsoft.JScript.Eval.JScriptEvaluate("要执行的代码", Microsoft.JScript.Vsa.VsaEngine.CreateEngine());

缺点:无法执行较为复杂的JS脚本

方法2:反射调用ScriptControl

Type obj = Type.GetTypeFromProgID("ScriptControl");
 if (obj == null) return null;
 scriptControl = Activator.CreateInstance(obj);
 obj.InvokeMember("Language", BindingFlags.SetProperty, null, scriptControl, new object[] { "JavaScript" });
 obj.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, scriptControl, new object[] { "js脚本" });
 obj.InvokeMember("Eval", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "执行的单条js脚本" }); //obj.InvokeMember("Run", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "js方法","方法参数" }); //这种方式也可以执行js脚本

如果想在调用的脚本中,与winform进行交互,可以在Eval之前,加上这么一句

obj.InvokeMember("AddObject", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "mySelObj", new JsComObject(), true });
JsComObject为自定义的类,注意,自定义类要加上[ComVisible(true)],否则会报错
[ComVisible(true)]
public class JsComObject
{

        public string atob(string text) {
            return XUtils.Base64Utils.DecodeBase64(text);
        }
}

缺点:性能不高,频繁调用,执行耗时长

优点:可以添加执行复杂的JS脚本。

网上还有一种方法,说是引用MSScriptControl类库,再初始化ScriptControlClass,来进行调用,但是我测试的结果是不行,ScriptControlClass这个类不允许实例化。

原文地址:https://www.cnblogs.com/gulangduxiao/p/12312015.html

时间: 2024-10-11 06:33:37

C# Winform 执行JS脚本的相关文章

异步执行js脚本——防止阻塞

JS允许我们修改页面中的所有方面:内容,样式和用户进行交互时的行为. 但是js同样可以阻塞DOM树的形成并且延迟页面的渲染. 让你的js变成异步执行,并且减少不必要的js文件从而提高性能. JavaScript可以查询和修改DOM和CSSOM JavaScript的执行阻塞了CSSOM的执行 JavaScript 阻塞了DOM的形成,除非特殊声明js异步执行 js是一个同步语言可以修改网页的任何方面: <html> <head> <meta name="viewpo

AngularJs中,如何在render完成之后,执行Js脚本

http://www.cnblogs.com/JustRun1983/p/3936371.htm AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点: MVC, 模块化,自动化双向数据绑定,语义化标签.依赖注入等. AngularJs和Jquery的有什么不同? Jquery的主要目的是简化Js编写,专注于浏览器跨平台,主要用来操作DOM.Angu

如何在博客园没有js执行权限下执行js脚本

前言 小弟刚刚申请的这个博客园博客还比较年轻,没有js执行权限,但是我又想执行js脚本,只好动动歪脑筋. 先从博客园管理中的“页首Html代码”中填写script标签代码,发现保存直接被删除了,又测试了下iframe和frame标签,一样被删除了. 被删除,script标签没有被写入DOM: 解决方案-利用IMG标签的行内事件执行JS 虽然script被删,但是在随后的测试中发现可以添加图片标签. 代码: <img src="http://www.baidu.com/img/baidu_j

Angular在render完成之后,执行Js脚本

AngularJs中,如何在render完成之后,执行Js脚本 app.directive('onFinishRenderFilters', function ($timeout) { return { restrict: 'A', link: function(scope, element, attr) { if (scope.$last === true) { $timeout(function() { scope.$emit('ngRepeatFinished'); }); } } };

解决IOS微信内置浏览器返回后不执行js脚本的问题

在A页面写一个$(function(){}) 后随便点击一个URL跳转到B页面 利用微信内置浏览器 返回键返回到A页面后发现这段JS不执行,后来找到了解决方案 $(function () { var isPageHide = false; window.addEventListener('pageshow', function () { if (isPageHide) { window.location.reload(); } }); window.addEventListener('pageh

12 Python+selenium对日期控件进行处理(采用执行JS脚本)

[环境信息] Python34+IE+windows2008 [说明] 1.对于日期控件,没有办法通过定位元素再直接传值的方式处理.可以采用执行JavaScript处理. PS:还要去学学js怎么写,不然要用的时候就只有到处copy了. [示例] 1.对于如下格式的日期控件需要用JS处理. 2.处理方式:通过driver.execute_script(js)执行. #问题消除时间,调用JS的当前时间 js = "function getCurrentDate() {" " v

AngularJs中,如何在ng-repeat完成之后,执行Js脚本

//ng-repeat生成4个li,生成后再执行自定义方法fn在每个li后加一根横线 <script> var myapp=angular.module('myapp',[]); myapp.directive('onFinishRenderFilters', function ($timeout) { return { restrict: 'A', link: function(scope, element, attr) { if (scope.$last === true) { $time

Java执行js脚本

aaa package cn.sniper.spider.utils; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URL; import javax.script.Invocable; import j

web自动化之执行js脚本

from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as Ec from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import