在C++中怎么调用一个js中的方法

JavaScript038

在C++中怎么调用一个js中的方法,第1张

例如一个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)}

可能的原因有以下几种:

确保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>

可以使用JavaScript自带的eval() 方法。

定义和用法

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

语法

eval(string)

参数

string    必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。  

返回值

通过计算 string 得到的值(如果有的话)。

例子:

<script type="text/javascript">

    eval("x=10y=20document.write(x*y)")   

    document.write(eval("2+2"))    

    var x=10

    document.write(eval(x+17))

</script>

输出:

200

4

27