用Javascript 实现消息类似window的循环可行吗?
应用例子:例如在网页实现接收串口数据。
如果用winform程序很容易实现这种应用,可是在网页上实现,真是麻烦。一度曾想用VBScript来实现,但VBScript总认人觉得不爽,迟早被淘汰的东西,MS自己都抛弃的东西还是不要用了。所以还是选用javascript来实现,至少网页可以方便的布署和通用性更强一些。
javascript实现消息循环,不是一件简单的事情,至少我从来没有搞过,也不知道可不可行?
于是通过setInterval函数实现延时和循环,从而达到模拟消息循环的效果。
例如通过这一事件达到网页定时触某些动作。
以下为实现模拟消息循环函数
/*参数说明
* runString : 字符串型,需要重复执行的Javascript函数或语句(多个函数或语句请用;分隔)
* stopString : 字符串型,用于中止重复执行动作(stopString)的Javascript函数或语句
* delayTime : 数字型,重复执行的时间间隔(毫秒数)
*/
function lLoopRun(runString,stopString,delayTime)
{
var vintervalId = null;
this._doLoop = function ()
{
if (vintervalId && !eval(stopString)){ //如果不停,那么一直执行runString函数
eval(runString);
}
else { //已经结束循环
window.clearInterval(vintervalId);
vintervalId = null;
}
document.getElementById("TCount").innerHTML = countTimer;//输出执行次数//为便于测试,应用时就将此行注释掉
}
window.clearInterval(vintervalId);
vintervalId = window.setInterval(this._doLoop,delayTime);
}
调用例子
//数据通过ActivX从仪器串口读取至B/S平台端,
//提交自动上传
function doUploadBus()
{
//串口基础参数传递及参数设置
...
//实现模拟消息循环
lLoopRun("startGetResult();","stopGetResult();",waitTime);
}
/以下为我应用的例子。可供参考
//全局变量
var countTimer=0;//控制等待时间记数器
var lstCheckData ="";//接收检测结果变量
//获取串口结果数据
function startGetResult(){
countTimer++;//计时器
lstCheckData=PRCommCheckBus.GetDYResult().replace(/(^/s*)|(/s*$)/g,"");//从串口中读取数据
}
//循环结束
function stopGetResult(){
if (countTimer==0){
return false;
}
if(lstCheckData=="NO")//ActiveX内部抛出数据还没有读完的消息代码,继续循环
{
document.all.btnUpload.disabled=true;//页面按钮设置为灰色不可用(document.all为IE的写法如果需要其他浏览器更改为其他方法即可)
return false;
}
if (lstCheckData=="0"){ //内部没有数据时
alert("暂无数据");
location.href=location.href;
return false;
}
if (lstCheckData=="-1"||lstCheckData=="-2")//在ActiveX内部抛出异常数据代码
{
document.all.btnUpload.disabled=false;//按钮设置为可用
return true;
}
if(lstCheckData!="")//如果已经完全接收了。
{
SetProtClose();
document.getElementById("lblRes").innerHTML = lstCheckData;//显示在textArea
document.all.btnUpload.disabled=true;
return true;
}
/*else if(countTimer>1200)//总超时
{
alert("已经超时");
document.URL=location.href;
document.all.btnUpload.disabled=false;
tag=true;
}*/
}
function SetProtClose()//关闭串口
{
PRCommCheckBus.ClosePort();//关闭串口. PRCommCheckBus为ActiveX组件的ID
}
通过上面的代码我们可以实现在HTML与 ActiveX通信功能
即不用通过动态页面脚本如ASP、JSP、PHP。即可实现强大ActiveX的功能。