页面导航: 首页网络编程JavaScript应用技巧 → 正文内容

JavaScript多线程的实现方法

发布:dxy 字体:[增加 减小] 类型:转载
注:以下内容基于IE中GIF的onload事件的基础上,故所有测试IE only
需要用到的几个图片
先看一个简单的事实:

<SCRIPT LANGUAGE="JavaScript">
 var img=new Image();
 img.src="attachment/1178365293_0.gif";
 img.onload=function()
 {
   alert("如要关闭请按住ESC键不放,并点击关闭按钮");
 }
</SCRIPT>

如果不出所料的话你的IE应该弹出一大堆alert提示窗口了。注意是“一大堆”!
原因很简单:IE对多帧GIF的onload事件重复执行,即每播放完一次动画,就重新执行一次onload事件。
(注:按下ESC键会停止gif动画的播放,故也会停止onload事件执行)
利用这一特性我们可以模拟多线程的实现:
看下面的代码:

image A onload执行次数:<span id="ThreadA">0</span><br>
image B onload执行次数:<span id="ThreadB">0</span><br>
image C onload执行次数:<span id="ThreadC">0</span>
<script>
function Img(threadID,src)
{
 var img = new Image;
 img.onload = function()
 {
   var c = parseInt(document.getElementById(threadID).innerHTML);
   document.getElementById(threadID).innerHTML=isNaN(c)?1:++c;
 }
 img.src = src;
 return img;
}
var imgA = new Img("ThreadA","attachment/1178365293_0.gif");
var imgB = new Img("ThreadB","attachment/1178365293_1.gif");
var imgC = new Img("ThreadC","attachment/1178365293_2.gif");
</script>

是不是有点意思了?
再看下面的代码:
<script>
//by Rimifon
var Threads = new Array;
onload = function()
{
 for(var C=1;C<501;C++)
 {
   Threads.push(new Thread(C));
 }
}
function Go(sender)
{
 var IsStart = sender.value=="全部开始";
 for(var x in Threads)
 {
   Threads[x].Start = IsStart;
 }
 sender.value = "全部" + (IsStart?"暂停":"开始");
}
function Thread(ID)
{
 this.Start = 0;
 var cursor = this;
 var span = document.createElement("span");
 var counter = document.createTextNode("0");
 span.appendChild(counter);
 var div = document.createElement("div");
 div.appendChild(document.createTextNode("线程" + ID + ":"));
 div.style.cursor = "pointer";
 div.onclick = function()
 {
   cursor.Start = !cursor.Start;
 }
 div.oncontextmenu = function()
 {
   img.onload = null;
   this.removeNode(true);
   return false;
 }
 div.appendChild(span);
 document.body.appendChild(div);
 var img = new Image;
 img.onload = function()
 {
   if(cursor.Start) counter.data = parseInt(counter.data) + 1;
   div.style.backgroundColor = cursor.Start?"#abcdef":"yellow";
 }
 img.src = "images/51js.gif";
}
</script>
<input type=button value="全部开始" onclick="Go(this)">
<input type=button value="弹出对话框" onclick="alert('对话框测试')">
部分代码引自Rimifon。(转载 http://Dnew.cn) 
百度中搜索更多的关于JavaScript多线程的实现方法内容,或者用Google搜索相关更多
浏览次数:载入中... 打印本文关闭本文返回首页

文章评论

共有 位脚本之家网友发表了评论我来说两句

同 类 文 章
最 近 更 新
热 点 排 行