例如一个test.js内容如下:function main( input ){ return input}在C++中调用方法如下:// vcJscript.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#import "C:/windows/system32/msscript.ocx" // msscript.ocx using namespace MSScriptControl#include <fstream>#include <string>using namespace stdint _tmain(int argc, _TCHAR* argv[]){HRESULT hr = CoInitialize(NULL)IScriptControlPtr pScriptControl(__uuidof(ScriptControl))pScriptControl->Language = "JavaScript"//pScriptControl->AllowUI = TRUEfstream filefile.open( "test.js" )string strFileContent, strTempchar szTemp[1024]=""do{ file.read(szTemp, 1024) strFileContent.append( szTemp ) memset( szTemp, 0, 1024 )}while ( !file.fail() )file.close()pScriptControl->AddCode(strFileContent.c_str())VARIANT A = pScriptControl->Eval("main(4)")int iRet = A.intValreturn 0}脚本控件有四种方法。其中之一是 Run(),运行子例程或函数。在调用此方法之前,指定的脚本语言、 设置 AllowUI,并将下面的脚本添加到脚本控件://---------------------- Begin --------------------------- #include <stdio.h>#import "C:/winnt/system32/msscript.ocx" // msscript.ocx using namespace MSScriptControlint main(void){ HRESULT hr = CoInitialize(NULL) IScriptControlPtr pScriptControl(__uuidof(ScriptControl)) // Create a VARIANT array of VARIANTs which hold BSTRs LPSAFEARRAY psaSAFEARRAYBOUND rgsabound[] = { 3, 0 }// 3 elements, 0-based int i psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound)if (!psa) { return E_OUTOFMEMORY} VARIANT vFlavors[3]for (i = 0i <3i++) { VariantInit(&vFlavors[i]) V_VT(&vFlavors[i]) = VT_BSTR} V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"))V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"))V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip")) long lZero = 0long lOne = 1long lTwo = 2 // Put Elements to the SafeArray: hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0])hr = SafeArrayPutElement(psa, &lOne,&vFlavors[1])hr = SafeArrayPutElement(psa, &lTwo,&vFlavors[2]) // Free Elements from the SafeArray: for(i=0i<3i++) { SysFreeString(vFlavors[i].bstrVal)} // Set up Script control properties pScriptControl->Language = "JScript"pScriptControl->AllowUI = TRUEpScriptControl->AddCode( "function MyStringFunction(Argu1,Argu2,Argu3)/ { return /"hi there/" }" ) // Call MyStringFunction with the two args: _variant_t outpar = pScriptControl->Run("MyStringFunction", &psa)// Convert VARIANT to C string: _bstr_t bstrReturn = (_bstr_t)outparchar *pResult = (char *)bstrReturn // Print the result out: printf("func=%s/n",pResult) // Clean up: SafeArrayDestroy(psa) CoUninitialize()return(0)}通过webBrowser实现C#和javascript互调
实现步骤:
一、新建一个窗体,加入webBrowser控件
控件名:webBrowser1
二、在窗体后台代码加入如下定义
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{
...
}
三、加载网页
webBrowser1.Navigate(Application.StartupPath + "/UpDateReport.htm")
webBrowser1.ObjectForScripting = this//这句必须,不然js不能调用C#
四、调用脚本方法
/// <summary>
/// 脚本方法
/// </summary>
/// <param name="tag">JS函数名|参数1|参数2</param>
/// <returns></returns>
private object EXEC_JS(System.Windows.Forms.WebBrowser webBrowser, string tag)
{
string[] args = tag.Split('|')
if (args.Length == 1)
{
return webBrowser.Document.InvokeScript(args[0], null)
}
else
{
object[] objects = new object[args.Length - 1]
Array.Copy(args, 1, objects, 0, objects.Length)
return webBrowser.Document.InvokeScript(args[0], objects)
}
}
五、C#调用脚本方法例子,可以有返回值
//JS方法
<script language="javascript">
function js_fun(args)
{
alert("我是通过js脚本弹出的。你输入的内容是:"+args)
return "JAVASCRIPT"
}
</script>
//C#代码
object returnvalue = EXEC_JS(webBrowser1, "js_fun|参数字符串")
MessageBox.Show("js方法返回值是:" + returnvalue.ToString())
六、JS调用C#方法的例子
//C#方法
public string Test(string args)
{
return "你输入的是:"+args
}
//JS代码
<script language="javascript">
window.onload = function()
{
var CS_returnvalue= window.external.Test("aaa")
alert(CS_returnvalue)
}
</script>
可能的原因有以下几种:
确保jsp页面有引用c标签,可以通过在c:if之前${user}这样也可以输出session里的对象会打印出类包名。
确保页面引用了jquery
js页面加载的问题,js加载是有顺序的。要在dom都加载好后才能取得页面的ID值的。
样式也可能使你的窗口看不到比如被别的层遮了。特别是iframe容易遮别人
解决调试方法代码如下:
如果类不为空,这里会显示类名:${user}
<c:if test="${empty user}">
<script>
alert("说明user为空,已经进入JS")//alert是js最好的调试工具可以知道js是否已经执行到这行
$(function(){//用jquery页面初始化加载会在dom加载完后执行确保curtain等ID能取到
alert($("#curtain").html())
$("#dialogue").css({top:150,left:500,position:"absolute","z-index":99999})//这个要绝对定位z-index要比较高才能浮起来
$("#curtain").show()
})
</script>
</c:if>