仔细分析的51JS的一段关于Jscript的多线程的脚本,原来是通过元素marquee实现的,好像img也可以实现。
注解见下:
<script type="text/javascript">
//定义一过程
//var addCount = new Function("tagThread.innerHTML = tagThread.innerHTML * 1 + 1");
//var addCount = new Function("alert();");
//可实现多个线程,见下。
var addCount1 = function(){tagThread1.innerHTML = tagThread1.innerHTML * 1 + 1};
var addCount2 = function(){tagThread2.innerHTML = tagThread2.innerHTML * 1 - 1};
//生成线程类
var thrd = new Thread(1000);
thrd.Start(addCount1);//开始一线程
thrd.Start(addCount2);//又开始一线程
//以下是类定义部分:
function Thread(Timer)
{
var thArr = []; //相当于 var thArr = new Array();
this.toString = function(){return "测试线程实例。"};//类字符串化,方法重写,很受启发。
this.Timer = Timer || 1000; //如果Timer有初值, 否则Timer为1000 ,JS语言的特殊性,易读性不好,不好。
//加入生成一个滚动元素marquee
this.Tag = self.document.createElement("marquee");
this.Tag.appendChild(self.document.createTextNode("-"));
this.Tag.scrollDelay = this.Timer;
//将滚动元素marquee加入div中
var _div = document.createElement("div");
_div.style.height = 1;
//_div.style.overflow = "hidden";
_div.appendChild(this.Tag);
//滚动事件
this.Tag.onscroll = function(){
for(var i = 0; i < thArr.length; i++)
thArr[i](); //执行多个事件函数???第一次知道!以前只知道C#是可以这样的。
}
//将div加入document中
new function main() //类初试化
{
if(self.document.readyState != "complete") //如果文档未完成
return setTimeout(main); //继续调用
self.document.body.appendChild(_div); //直到文档调用完成后,加入_div(带滚动条的)
}
this.Start = function(thread)
{
thArr.push(thread); //函数元素入栈
}
}
</script><body>执行次数:<span id="tagThread1">0</span>
<br><span id="tagThread2">100</span>
<br>
<input type=button value="弹出框" οnclick="alert(thrd)">
</body></html>