JavaScript的多线程,利用了一张gif图片

来源:互联网 发布:淘宝联盟4.3.2安装包 编辑:程序博客网 时间:2024/06/02 17:02
注:以下内容基于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事件。

(Dnew.cn 注:按下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 = "attachment/1178365293_0.gif";
}
</script>
<input type=button value="全部开始" onclick="Go(this)">
<input type=button value="弹出对话框" onclick="alert('对话框测试')">

部分代码引自Rimifon。(转载请注明出处 http://Dnew.cn)
原创粉丝点击