Javascript 从C++;
我有一个CDHTMLDialog,有两个HTML页面和一个.js文件,其中包含一些相当简单的函数 我希望能够通过一个简单的数据类型从我的程序中调用一个JS函数。e、 g.MyFunc(int)。不需要归还任何东西 如果您能给我一些指导,我将不胜感激 谢谢 编辑:感谢CR的回答,也感谢所有提交想法的人 类似这样的东西最终奏效了(为了清晰起见,从中去掉了一些错误处理):Javascript 从C++;,javascript,c++,mfc,Javascript,C++,Mfc,我有一个CDHTMLDialog,有两个HTML页面和一个.js文件,其中包含一些相当简单的函数 我希望能够通过一个简单的数据类型从我的程序中调用一个JS函数。e、 g.MyFunc(int)。不需要归还任何东西 如果您能给我一些指导,我将不胜感激 谢谢 编辑:感谢CR的回答,也感谢所有提交想法的人 类似这样的东西最终奏效了(为了清晰起见,从中去掉了一些错误处理): void callJavaScriptFunc(int) { HRESULT hRes; CString函数; CString L
void callJavaScriptFunc(int)
{
HRESULT hRes;
CString函数;
CString LangStr=“javascript”;
变量vEmpty={0};
CComPtr HTML2Doc;
CComPtr HTML2Wind;
hRes=GetDHtmlDocument(&HTML2Doc);
hRes=HTML2Doc->获取父窗口(&HTML2Wind);
如果(水果>0)
{
FuncStr=“myFunc(808)”;//可以使用Javascript参数
hRes=HTML2Wind->execScript(FuncStr.AllocSysString(),LangStr.AllocSysString(),&vEmpty);
}
}
给你一个提示——服务器端技术中的javascript注入通常是通过启动时批量加载(GWT)执行的,或者是在每次发帖时生成并提供HTML时注入的(ASP.NET)。
这两种方法的重要一点是,当生成HTML页面时,它们将javascript调用注入页面的某个位置(或者在GWT的情况下插入链接在HTML中的一个单独的.js文件)
即使您正在进行win开发(因为您使用的是MFC,所以看起来很像),也可能需要在HTML中插入js方法调用,然后在HtmlDialog中加载(或重新加载,如果您希望与MFC应用程序中的HTML交互)HTML文件
除了编辑HTML并(重新)加载它之外,我看不到任何其他实现方法(可能我只是不知道一些合适的开箱即用的功能)——如果您必须一次性调用js方法或只是注入某种事件处理逻辑,这是非常方便和可行的。
如果您必须从MFC应用程序与页面交互,可能会有点痛苦。在这种情况下,您必须重新生成HTML并将其重新加载到您的对话框中
无论哪种方式,您都可以在HTML文件中使用某种占位符,查找占位符并替换为javascript代码,然后在您的HtmlDialog中加载页面:
onclick=“\uuuu my\u Javascript\u Call\u HERE\uuuu”
最简单的方法是在界面中使用该方法
因此,您可以通过调用从CDHTMLDialog获取接口,然后从IHTMLDocument2获取接口。父窗口将具有支持execScript()的IHTMLWindow2接口
从CDHTMLDialog获取IHTMLWindow2接口可能有一种更简单的方法,但我习惯于在较低的级别上工作。SpiderMonkey库可以“从C++调用JavaScript函数”,请参阅
但在您的情况下,也许这不是答案。您是指jscript吗?如何做到这一点取决于您使用的javascript引擎:spidermonkey、v8、nitro——但您说的是chtml对话,所以我猜您使用的是jscript?我相信是jscript。此外,我已经修复了我的打字错误,应该是CDHTMLDialog。只是为了把它放在一起,我刚刚把我对它的解释贴在了上面。谢谢,这很有效。我将在我的问题中发布一个代码片段,以便人们可以看到我的粗略解决方案。再次感谢。很好的解决方案-我不知道这种方法
void callJavaScriptFunc(int Fruit)
{
HRESULT hRes;
CString FuncStr;
CString LangStr = "javascript";
VARIANT vEmpty = {0};
CComPtr<IHTMLDocument2> HTML2Doc;
CComPtr<IHTMLWindow2> HTML2Wind;
hRes = GetDHtmlDocument(&HTML2Doc);
hRes = HTML2Doc->get_parentWindow(&HTML2Wind);
if( Fruit > 0 )
{
FuncStr = "myFunc(808)"; // Javascript parameters can be used
hRes = HTML2Wind->execScript(FuncStr.AllocSysString(), LangStr.AllocSysString(), &vEmpty);
}
}