版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
以前是用的事件机制来调用JavaScript,事件和回调本来就是一回事。但是由于没有解决线程同步问题,所以就一直没有调通。JavaScript中死活也不响应异步发送过来的事件。前天用Idispatch接口调通了JavaScript。但是始终觉得不是那么回事,这样会麻烦死的。
于是回过头来思考,用事件是不是只要线程同步一下就可以了?今天早上试了一下,果然没有问题。
下面介绍一下具体的步骤:
1. 建立MFC ActiveX Control(方法略)
2. 在ClassWizard automation页添加方法invoke。Invoke函数代码如下:
void CForthCtrl::invoke(short a)
{
m_a = a;
_beginthread(f, 0, (void*)(this));
}
3. 在上面的invoke方法中调用了线程函数f,在f函数中要调用界面控件CforthCtrl,所以必须进行线程同步,我们使用了PostMessage方法同步 (以前就是忽略了这里,所以才调不通JavaScript的) 。f函数的代码如下:
void f(void * r)
{
CForthCtrl* p = (CForthCtrl*)r;
Sleep(5000);
p->m_a +=10;
PostMessage(p->m_hWnd,WM_THREADFIREEVENT,(WPARAM)NULL,(LPARAM)NULL);
return;
}
4. 在ClassWizard ActiveX Events页添加事件calljs,事件的参数为short类型的参数,用于将结果传递到JavaScript中去。
5. 添加WM_THREADFIREEVENT消息的消息映射函数。代码如下:
LRESULT CForthCtrl::OnFireEventForThread(WPARAM wParam, LPARAM lParam)
{
this->FireCalljs(m_a);
return TRUE;
}
6. 用ActiveX Control Test Container测试一下。看看调用invoke的时候会不会触发calljs事件。
7. 打开Microsoft ActiveX Control Pad,插入我们刚刚编写的控件。然后添加调用invoke的按钮,并且添加响应Calljs函数的代码。
<HTML>
<HEAD>
<TITLE>New Page</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript" FOR="Forth1" EVENT="calljs(param)">
alert(param);
</SCRIPT>
<script LANGUAGE="JavaScript">
function test()
{
Forth1.invoke(1);
}
</script>
<OBJECT ID="Forth1" WIDTH=100 HEIGHT=51
CLASSID="CLSID:52510A20-E949-4213-89FD-8A2AE5A7F6D4">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2646">
<PARAM NAME="_ExtentY" VALUE="1323">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
<input type ="button" value="test" onclick="test();">
</BODY>
</HTML>
总结:
1. 使用事件机制比前面的方法省老鼻子劲了,少写多少代码啊。
2. 使用Idispatch接口还是很容易出错的,并且不容易查找错误。
3. 使用事件方式,只要用ActiveX Control Test Container调试成功了,放到web页面中去就没问题了。
4. 事件方式不用传函数名进去,直接在JavaScript中挂接事件就可以了。
5. 线程操作界面一定记得要同步啊!!!!!!
分享到:
相关推荐
"ActiveX异步回调JavaScript(通过事件方式)"指的是通过事件模型实现的通信方式。在ActiveX控件中定义一个事件,当特定条件满足(如任务完成)时,触发该事件。JavaScript端注册事件监听器,当事件发生时,监听器的...
- 异步编程:RFID读卡器操作可能是异步的,需要理解回调函数、Promise或async/await语法。 - 安全性:ActiveX控件在现代Web开发中的安全问题,以及为什么它主要限于IE浏览器。 在实际应用中,由于ActiveX控件的安全...
// 上传完成后的回调 function uploadFinished(fileName) { addToFlist(fileName); loading(false); } // 添加文件列表 function addToFlist(fname) { var temp = [", fname, "(\"" + fname + "\");'>...
4. **异步编程**:回调函数、Promise、async/await,这些是解决JavaScript中回调地狱问题的关键技术。 5. **DOM操作**:通过JavaScript访问和修改HTML元素,包括选择元素(getElementById, getElementsByClassName,...
在JavaScript中,可以使用`setTimeout`或`setInterval`来模拟异步回调,但这种方式并不理想,因为它们可能会导致性能问题。更好的做法是使用.NET控件提供事件支持,当.NET执行完某个操作后触发事件,JavaScript端...
9. **异步编程**:包括回调函数、Promise、async/await,用于处理非阻塞I/O操作,是现代JavaScript开发的核心技能。 10. **错误处理**:通过try...catch块处理运行时错误,以及使用throw语句抛出自定义错误。 11. ...
此外,还包括了作用域、闭包、原型链、异步编程(回调函数、Promise、async/await)等高级主题。理解这些内容能帮助开发者编写出高效且易于维护的代码。 2. **JavaScript核心参考手册**: 核心参考手册通常会更...
6. **异步编程**:JavaScript中的异步编程主要涉及回调函数、Promise和async/await。它们处理耗时操作,如网络请求,以避免阻塞主线程。 JScript与JavaScript的主要区别在于,JScript默认开启严格模式,而...
19. **异步编程**:包括事件循环、回调函数、async/await等处理异步任务的方式。 20. **模块系统**:讲解CommonJS、AMD、ES6模块以及它们在不同场景下的应用。 这本手册将是你掌握JavaScript对象和相关技术的宝贵...
2. **函数**:函数定义、参数传递、回调函数、立即执行函数表达式。 3. **对象与原型**:对象创建、原型链、对象属性操作。 4. **DOM操作**:获取和修改HTML元素、事件处理、DOM遍历。 5. **AJAX**:XMLHttpRequest...
- 主页面通过监听iframe的`onload`事件,获取服务器返回的数据,调用预先定义好的回调函数,如`uploadFinished`,从而更新用户界面。 以下是一个简单的示例代码: ```html <!DOCTYPE html> 隐藏的iframe上传...
2. 高级特性:闭包、原型链、作用域、异步编程(回调、Promise、async/await)。 3. BOM(Browser Object Model)和DOM操作:如何访问和操作浏览器窗口、文档、以及页面元素。 4. AJAX(异步JavaScript和XML):实现...
手册中可能还涵盖了变量作用域、闭包、异步编程(回调函数、Promise、async/await)、事件监听、AJAX请求、模板字符串、模块化(CommonJS、ES6模块)、正则表达式、数据类型与类型转换等JavaScript基础和高级主题。...
本文将详细讲解如何使用VC++编写一个OCX控件,以实现异步调用DLL,并通过回调函数来防止网页卡死。 首先,我们需要了解OCX和DLL的基本概念。OCX是ActiveX控件的一种形式,它是可重用的软件组件,可以在不同的应用...
总结来说,这个示例展示了如何通过HTML使用JavaScript调用Python脚本,然后让Python将处理结果回调给HTML。虽然ActiveX技术在现代Web开发中已较少使用,但通过Ajax或者Web框架如Flask、Django等,我们可以实现安全、...
在页面加载完成后(`window.onload`事件发生后),通过JavaScript代码获取了页面中的按钮,并为其绑定了点击事件,当按钮被点击时调用`ajax`函数,并传入了请求的URL、成功回调函数和失败回调函数。在成功回调函数中...
5. **AJAX异步请求回调**:在Web端,使用JavaScript的AJAX技术向C++服务器发送异步请求,服务器端接收到请求后,通过回调函数返回结果,实现页面的无刷新更新。 这些回调机制的实现,都基于ActiveQtServer中的...
7. 事件:事件是指控件在执行某些操作时触发的回调,开发者可以在这些事件发生时执行特定的代码。文档中列出的事件包括BeforeDraw(绘制前)、AfterDraw(绘制后)、OnZoomChange(缩放改变时)等。 8. IPDFPrinter...
2. **设置回调函数** - 当服务器响应状态发生变化时,`onreadystatechange`事件会被触发。通常情况下,只有当`readyState`为4(表示请求完成)且`status`为200(表示成功获取到数据)时,才会处理服务器返回的数据...