如何用mshtml获得Javascript中function的返回值

转载 2012年10月10日 11:24:05

今天琢磨了一下如何用mshtml获得Javascript中function的返回值。我们以前都是用没mshtml.IHTMLWindow2接口的execScript方法来执行HTML文档中的javascript代码段,如

 

//awbMain为AxSHDocVw.AxWebBrowser控件
mshtml.IHTMLDocument2 doc = this.awbMain.Document;
private mshtml.IHTMLWindow2 win = doc.parentWindow;
string strScript = "alert('OK');";
win.execScript(strScript, "javascript");
 

    智能提示显示execScript方法的返回值类型是object,但是其实其返回值永远是null(当然,我们不应该相信COM的智能提示,很多参数、返回值等都是object类型,无法得到更详细的信息),即使该方法执行的是一个有返回值javascript函数。

    那么,这个问题如何解决呢?Google一下吧。简体中文的页面中没有这个问题的答案,看看英文的文档吧(这里说一句,很多人因为懒或者不会使用google等搜索引擎而错过了学习一些东西的机会。多用一下搜索引擎,考虑怎样使用关键词,并不断提高关键字的质量,相信很容易找到相应的资料)。输入“"javascript return value" +mshtml +c#”作为关键字,搜索结果只有一篇文档,要的就是它。这篇文档详细描述了如何在.NET应用程序中控制Internet Explorer,示例既有C#也有VB.NET,既有1.0也有2.0,非常棒(附在随笔的最后)。

    文档中给出了这个问题的解决方法,不过是.NET 2.0中的解决方法。.NET 2.0中的解决方法是利用HtmlDocument类的InvokeScript方法来实现:

 

string strRetVal = "";
//awbMain为System.Windows.Forms.WebBrowser控件
HtmlDocument doc = this.awbMain.Document;
//jsFunction为HTML文档中javascript函数的函数名
strRetVal = (string)doc.InvokeScript("jsFunction");
System.Windows.Forms.MessageBox.Show(strRetVal);
 

    要注意的是,HTML文档中的javascript函数名后要加空括号(没有参数的情况下),而在C# 2.0中调用之则不用加空括号。

    在C# 1.x中使用mshtml如何解决这个问题呢,这里介绍一个变通的方法(这些变通的方法在以前的随笔中也用到过):
        1、在Form中定义变量用于存储javascript函数的返回值;
        2、使用.NET 1.x中的InteropServices把应用程序的Form对象传入到HTML DOM中;
        3、在javascript函数中为1中的变量赋值(赋和javascript函数返回值一样的值),这样javascript函数甚至不需要有返回值了。

    步骤2的代码如下:

 

private System.Runtime.InteropServices.Expando.IExpando iex;
private mshtml.IHTMLDocument2 doc = null;
//awbMain为AxSHDocVw.AxWebBrowser控件,wendang加载完毕后执行的代码
private void awbMain_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
 this.doc = (mshtml.IHTMLDocument2)this.awbMain.Document;
 ex = (System.Runtime.InteropServices.Expando.IExpando)doc;
 System.Reflection.PropertyInfo piform = ex.AddProperty("MainForm");
 piform.SetValue(doc, this, null);
}


 

    这样在步骤3的HTML文档的javascript函数中就可以用document.MainForm来指代Windows应用程序中的Form了。


转载:http://blog.csdn.net/cui55/article/details/884506

参考:http://www.cnblogs.com/waxdoll/articles/271018.html


相关文章推荐

用mshtml获得Javascript中function的返回值

今天琢磨了一下如何用mshtml获得Javascript中function的返回值。我们以前都是用没mshtml.IHTMLWindow2接口的execScript方法来执行HTML文档中的javas...

C++ - 函数模板(function template)返回值

函数模板(function template)返回值 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17003679 函数...

JavaScript函数-带参数的函数、带返回值的参数

之前说完函数的定义以及调用,接下来看看带参数的函数以及带返回值的的函数~\(≧▽≦)/~   带参数的函数   之前讲了函数的基本用法,接下来看看带参数的函数。   在函数中,参数可以无限多,函数...

javascript中接收window.open()的返回值

这里记录一下如何在javascript中接收window.open()的返回值: 其实这里说返回值是有点不规范的,因为返回的是对新的window对象的引用,但是为了方便理解,就先这么叫吧! 实...

JavaScript 函数总体概述(函数声明/参数传递/返回值/加载/变量和作用域/变量声明提升/匿名函数/回调函数)

1. 函数的概念和定义 函数就是可以重复执行的代码块。 ① 函数声明(自定义声明) 使用在定义之前或之后均可function 函数名(形参) { } ② 函数表达式(匿名函数法) ...

javaScript 运算符 && 和 || 的返回值

&&首先计算其左边的表达式,如果它的值为false或可被转换为false(null、NaN、0或undefined),那么将返回左边表达式的值,否则,它将计算右边的表达式, 并返回这个表达式结果作为 ...
  • C860_zy
  • C860_zy
  • 2013年12月18日 19:24
  • 598

javascript 弹出窗口返回值

a.html

QA 基于开发的 JavaScript 修改测试数据和代码查看返回值的小例子

QA基于开发的JavaScript修改测试数据和代码查看返回值的小例子 一 背景 测试的项目比较庞大(Web端若干个、APP端若干个),比较复杂,数据依赖多,交互也多,联调也多,这个给QA...

JavaScript函数声明和调用、有参函数和无参函数、返回值

JavaScript变量的声明     变量是存储数据的容器> js中变量的声明方式有两种   var 是声明变量的关键字 1、显式声明  var nSom=886; 2、隐式声明 nSom=8...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用mshtml获得Javascript中function的返回值
举报原因:
原因补充:

(最多只允许输入30个字)