for长期循环的时候无法操作文档,能想到的办法只能用setInterval or setTimeout什么样的操作要运行两分钟啊? 把代码贴出来看看有没有优化的可能
我的意思是数据,不只是代码,不知道你的squ.length倒底有多少?
<script> var line="<%=Request["line"]%>";
var icon,tg,temp_x,temp_y,ico=0; var pi=Math.PI; var pl=0; var j=0; var tempnum=0; var squ=new Array(); var czydm1="",simid1="",x1="",y1="",curdata1="",curtime1="",czyxm1="",bmmc1="",pos1=""; var czydm="",simid="",czyxm="",bmmc="",pos=""; var x="",y="";
to lantersen(蓝水仁--国庆&中秋愉快,合家团圆!~) :我做的是一个画车辆轨迹点的页面:先查询出所有点存入数组中,在赋值给javascript数组;在然后安先后顺序在地图上标出轨迹点;并用线段连接这些点,正常情况下等待绘制完毕整个轨迹线;现在想要增加点击按钮时能 随时允许中断绘制过程的功能,就是这样
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>paint</TITLE> <style> .emuW{position:absolute;font-size:2px;width:2;background-color:red} .emuH{position:absolute;font-size:2px;height:2;background-color:red} .emuWH{position:absolute;font-size:2px;width:2;height:2;background-color:red} </style><SCRIPT LANGUAGE="JavaScript" defer> <!-- var blnStartFlag; blnStartFlag = false; var intCount; var intMouseMoveCount; intCount = 1; intMouseMoveCount = 1; function fnSwitchMode(){ if(blnStartFlag == false && window.event.srcElement.type != "button"){ blnStartFlag = true; } else{ blnStartFlag = false; oldX=oldY=0; } } function fnPaint(){ if(blnStartFlag == true){ intCount = intCount + 1; var stElm = drawLine(oldX==0?event.x:oldX,oldY==0?event.y:oldY,event.x,event.y,"red"); oldX = event.x;oldY = event.y;draw(stElm); } intMouseMoveCount = intMouseMoveCount + 1; div1.innerHTML = "MouseMoveCount:" + intMouseMoveCount + "<br> PaintCount:" + intCount + "<br>LeftPos:" + window.event.x + "<br> TopPos:" + window.event.y; } function draw(html){ if (emu == null || emu.children.length>maxChildren){ emu = document.createElement("<div>"); setTimeout("document.body.insertBefore(emu)",50); } setTimeout("emu.innerHTML+=\""+html+"\"",1) } function fnShowCount(){ alert(intCount); } //--> </SCRIPT><SCRIPT LANGUAGE="JavaScript"> <!-- var emu = null; var maxChildren = 50; var oldX = 0; var oldY = 0; function drawLine(x0,y0,x1,y1,color){ x0 = Math.round(x0); x1 = Math.round(x1); y0 = Math.round(y0); y1 = Math.round(y1); var rs = ""; if (y0 == y1){ //画横? if (x0>x1){var t=x0;x0=x1;x1=t} rs = "<p class=emuH style='top:"+y0+";left:"+x0+";background-color:"+color+"; width:"+Math.abs(x1-x0)+"'/>"; } else if (x0 == x1){ //画?? if (y0>y1){var t=y0;y0=y1;y1=t} rs = "<p class=emuW style='top:"+y0+";left:"+x0+";background-color:"+color+";height:"+Math.abs(y1-y0)+"'/>"; } else{ var lx = x1-x0; var ly = y1-y0; if (Math.abs(lx)>Math.abs(ly)){ if (ly<0){ var t=x0;x0=x1;x1=t; t=y0;y0=y1;y1=t; lx = -lx; ly = -ly; } var dx = lx/ly; rs = new Array(ly); for (var i=0;i<ly;i++){ var left,width; if (dx>0){ left = Math.round(i*dx); width = Math.round((i+1)*dx)-left; left += x0; if (width+left>x1) width = x1-left; }else{ left = Math.round((i+1)*dx); width = Math.round((i)*dx)-left; left += x0; if (left<x1) { width = width+left-x1; left=x1; } } rs[i] = "<p class=emuH style='top:"+(y0+i)+";left:"+left+";width:"+width+";background-color:"+color+"'/>"; } }else{ if (lx<0){ var t=x0;x0=x1;x1=t; t=y0;y0=y1;y1=t; lx = -lx; ly = -ly; } var dy = ly/lx; rs = new Array(lx); for (var i=0;i<lx;i++){ var top,height; if (dy>0){ top = Math.round(i*dy); height = Math.round((i+1)*dy)-top; top += y0; if (height+top>y1) height = y1-top; }else{ top = Math.round((i+1)*dy); height = Math.round((i)*dy)-top; top += y0; if (top<y1) { height = height+top-y1; top=y1; } } rs[i] = "<p class=emuW style='top:"+top+";left:"+(x0+i)+";height:"+height+";background-color:"+color+"'/>"; } } rs = rs.join(""); } return rs }//--> </SCRIPT> </HEAD><BODY onclick="fnSwitchMode()" onmousemove="fnPaint()"> <input type="button" onclick="fnShowCount()" value="ShowCount"> <div id="div1"></div> </BODY> </HTML>跟你的需求不一样。 但是你可以参考这个用setTimeout函数来画。 中间就有时间可以让你操作中断程序了。
要中断for其实很简单 定义一个公共变量 var readytobreak=false;但要在for循环体内加上一句 if(readytobreak){readytobreak=false;break;}剩下的就是怎么去改变readytobreak的值的问题了 <img id="tip" alt="" width="95" height="55" style="cursor:hand;display:none" src="../images/window.gif" onclick="readytobreak=true" />当然你也可以调用一个过程 function XXX(){readytobreak=true;}
循环一次settimeout休息
点击图片修改全局变量为退出码
循环中检查全局变量是否为退出码
如果改变则退出循环
点击图片就改变这个参数
必须把中断按钮放在这个窗口里
用window.setInterval()比较好
var line="<%=Request["line"]%>";
var icon,tg,temp_x,temp_y,ico=0;
var pi=Math.PI;
var pl=0;
var j=0;
var tempnum=0;
var squ=new Array();
var czydm1="",simid1="",x1="",y1="",curdata1="",curtime1="",czyxm1="",bmmc1="",pos1="";
var czydm="",simid="",czyxm="",bmmc="",pos="";
var x="",y="";
pl = <%=pl%>;
tempnum = <%=temp%>;
<%
if(redertemp!=null&&redertemp.Tables[0].Rows.Count>0)
{
for (int k = 0; k < redertemp.Tables[0].Rows.Count; k=k+temp)
{
Response.Write("squ["+6*k+"] = '"+redertemp.Tables[0].Rows[k]["czydm"].ToString()+"';");
Response.Write("squ["+(6*k+1)+"] = '"+redertemp.Tables[0].Rows[k]["simid"].ToString()+"';");
Response.Write("squ["+(6*k+2)+"] = '"+redertemp.Tables[0].Rows[k]["x"].ToString()+"';");
Response.Write("squ["+(6*k+3)+"] = '"+redertemp.Tables[0].Rows[k]["y"].ToString()+"';");
Response.Write("squ["+(6*k+4)+"] = '"+redertemp.Tables[0].Rows[k]["curdata"].ToString()+"';");
Response.Write("squ["+(6*k+5)+"] = '"+redertemp.Tables[0].Rows[k]["curtime"].ToString()+"';");
}
}
%>
parent.qmap.QM_ClearLayer(0,100);
if(squ.length!=0)
{
czydm = "<%=czydm%>";
simid = "<%=simid%>";
czyxm = "<%=czyxm%>";
bmmc = "<%=bmmc%>";
pos = "<%=pos%>";
if( line == "1")
{
LineObj=new ActiveXObject ("ShapeObj.QmPolyline");
LineObj.SetLineColor(0);
LineObj.SetLineWidth(2);
LineObj.SetLineStyle(4);
}
for (var i=0;i<squ.length;i=i+6)
{
czydm1 = squ[i];
simid1 = squ[i+1];
x1 = squ[i+2];
y1 = squ[i+3];
curdata1 = squ[i+4];
curtime1 = squ[i+5];
/*if(i!=0)
{
if( line == "1")
{
LineObj=new ActiveXObject ("ShapeObj.QmPolyline");
LineObj.SetLineColor(16);
LineObj.SetLineWidth(2);
LineObj.SetLineStyle(2);
LineObj.Add(squ[i-7],squ[i-6]);
LineObj.Add(x1,y1);
parent.qmap.QM_AppendObject(0,100,i,LineObj);
parent.qmap.QM_Redraw();
}
}*/
//if((i/6)%tempnum==0||i==squ.length-6)
if((i/6)%pl==0||i==squ.length-6)
{
if(pos=="0")
{
ico=18;
}
else
{
ico=19;
}
if(i!=squ.length-6)
{
//temp_x = parseInt(squ[i+6*tempnum+2]) - parseInt(x1);
//temp_y = parseInt(squ[i+6*tempnum+3]) - parseInt(y1);
temp_x = parseInt(squ[i+8]) - parseInt(x1);
temp_y = parseInt(squ[i+9]) - parseInt(y1);
if(temp_x==0)
{
if(temp_y==0){icon=36;if(i!=0)continue;}
else if(temp_y>0){icon=24;}
else{icon=32;}
}
else if(temp_x>0)
{
tg=Math.atan(temp_y/temp_x);
if(tg>-pi/2&&tg<=-7*pi/16)icon=32;
if(tg>-7*pi/16&&tg<=-5*pi/16)icon=33;
if(tg>-5*pi/16&&tg<=-3*pi/16)icon=34;
if(tg>-3*pi/16&&tg<=-pi/16)icon=35; if(tg>-pi/16&&tg<pi/16)icon=20;
if(tg>=pi/16&&tg<3*pi/16)icon=21;
if(tg>=3*pi/16&&tg<5*pi/16)icon=22;
if(tg>=5*pi/16&&tg<7*pi/16)icon=23;
if(tg>=7*pi/16&&tg<pi/2)icon=24;
}
else
{
tg=pi+Math.atan(temp_y/temp_x); if(tg>pi/2&&tg<=9*pi/16)icon=24;
if(tg>9*pi/16&&tg<=11*pi/16)icon=25;
if(tg>11*pi/16&&tg<=13*pi/16)icon=26;
if(tg>13*pi/16&&tg<=15*pi/16)icon=27;
if(tg>15*pi/16&&tg<17*pi/16)icon=28;
if(tg>=17*pi/16&&tg<19*pi/16)icon=29;
if(tg>=19*pi/16&&tg<21*pi/16)icon=30;
if(tg>=21*pi/16&&tg<23*pi/16)icon=31;
if(tg>=23*pi/16&&tg<3*pi/2)icon=32;
}
}
else
{
icon=ico;
}
o = new ActiveXObject( "ShapeObj.QmIconText" );
o.SetCursorID(20);
//if(i!=squ.length-6)
//{
//o.SetText(i/6+1);
o.SetText(j+1);
o.SetTextColor(3);
//}
//else
//{
// o.SetText(czyxm);
// o.SetTextColor(0);
//} o.SetTextType(2);
if(pos=="0")
{
o.SetToolTipText("姓名 : "+ czyxm + "\r" +
"部门 : "+ bmmc + "\r" +
"日期 : "+ curdata1 + "\r" +
"时间 : "+ curtime1 + "\r" +
"X坐标 : "+ x1 + "\r" +
"Y坐标 : "+ y1 + "\r" +
"");
}
else
{
o.SetToolTipText("车牌 : "+ czyxm + "\r" +
"部门 : "+ bmmc + "\r" +
"日期 : "+ curdata1 + "\r" +
"时间 : "+ curtime1 + "\r" +
"X坐标 : "+ x1 + "\r" +
"Y坐标 : "+ y1 + "\r" +
"");
} o.IsBold = true;
o.Font = 10;
o.SeticonID(icon);
o.SetPos(x1,y1);
//parent.qmap.QM_AppendObject(0,100,10000+(i/6),o);
if(i==0)
{
parent.qmap.QM_AppendObject(0,100,10000,o);
}
else
{
parent.qmap.QM_AppendObject(0,100,1000+j,o);
}
//parent.qmap.QM_AppendObject(0,100,10000+j,o);
//var dval = parent.qmap.QM_GetDeclutter();
//parent.qmap.QM_SetView(x1, y1, dval);
//parent.qmap.QM_Redraw();
j++;
}
if(line == "1")
{
LineObj.Add(x1,y1);
if((i/6)%pl==0||i==squ.length-6)
{
parent.qmap.QM_AppendObject(0,100,900,LineObj);
parent.qmap.QM_Redraw();
}
}
}
/*if(line == "1")
{
parent.qmap.QM_AppendObject(0,100,900,LineObj);
parent.qmap.QM_Redraw();
}*/
/*parent.qmap.QM_SetViewAllObject(0,100);
parent.qmap.Qm_Redraw();*/
}
parent.mw.doSysClick("SYS_WINDOW");
</script>
注意:
使用setInterval的时候你将改写的那层for就不应该再使用了,而是代之以判断“递增量”,
clearInterval的时候也应该将“递增量”归0。应该还有很多细节,写的时候注意一下就可以了。
...
var i=0;
function loop(){
if(i>=squ.length){
clearInterval(LOOP);
return;
}
czydm1 = squ[i];
simid1 = squ[i+1];
x1 = squ[i+2];
...
i=i+6;
}
var LOOP = window.setInterval(loop,0);
...
</script>
<img src="..." onclick="clearInterval(LOOP)">
<HTML>
<HEAD>
<TITLE>paint</TITLE>
<style>
.emuW{position:absolute;font-size:2px;width:2;background-color:red}
.emuH{position:absolute;font-size:2px;height:2;background-color:red}
.emuWH{position:absolute;font-size:2px;width:2;height:2;background-color:red}
</style><SCRIPT LANGUAGE="JavaScript" defer>
<!--
var blnStartFlag;
blnStartFlag = false;
var intCount;
var intMouseMoveCount;
intCount = 1;
intMouseMoveCount = 1; function fnSwitchMode(){
if(blnStartFlag == false && window.event.srcElement.type != "button"){
blnStartFlag = true;
}
else{
blnStartFlag = false;
oldX=oldY=0;
}
} function fnPaint(){
if(blnStartFlag == true){
intCount = intCount + 1;
var stElm = drawLine(oldX==0?event.x:oldX,oldY==0?event.y:oldY,event.x,event.y,"red");
oldX = event.x;oldY = event.y;draw(stElm);
}
intMouseMoveCount = intMouseMoveCount + 1;
div1.innerHTML = "MouseMoveCount:" + intMouseMoveCount
+ "<br> PaintCount:" + intCount
+ "<br>LeftPos:" + window.event.x
+ "<br> TopPos:" + window.event.y;
}
function draw(html){
if (emu == null || emu.children.length>maxChildren){
emu = document.createElement("<div>");
setTimeout("document.body.insertBefore(emu)",50);
}
setTimeout("emu.innerHTML+=\""+html+"\"",1)
}
function fnShowCount(){
alert(intCount);
}
//-->
</SCRIPT><SCRIPT LANGUAGE="JavaScript">
<!--
var emu = null;
var maxChildren = 50;
var oldX = 0;
var oldY = 0;
function drawLine(x0,y0,x1,y1,color){
x0 = Math.round(x0);
x1 = Math.round(x1);
y0 = Math.round(y0);
y1 = Math.round(y1);
var rs = "";
if (y0 == y1){ //画横?
if (x0>x1){var t=x0;x0=x1;x1=t}
rs = "<p class=emuH style='top:"+y0+";left:"+x0+";background-color:"+color+"; width:"+Math.abs(x1-x0)+"'/>";
}
else if (x0 == x1){ //画??
if (y0>y1){var t=y0;y0=y1;y1=t}
rs = "<p class=emuW style='top:"+y0+";left:"+x0+";background-color:"+color+";height:"+Math.abs(y1-y0)+"'/>";
}
else{
var lx = x1-x0;
var ly = y1-y0;
if (Math.abs(lx)>Math.abs(ly)){
if (ly<0){
var t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
lx = -lx;
ly = -ly;
}
var dx = lx/ly;
rs = new Array(ly);
for (var i=0;i<ly;i++){
var left,width;
if (dx>0){
left = Math.round(i*dx);
width = Math.round((i+1)*dx)-left;
left += x0;
if (width+left>x1) width = x1-left;
}else{
left = Math.round((i+1)*dx);
width = Math.round((i)*dx)-left;
left += x0;
if (left<x1) {
width = width+left-x1;
left=x1;
}
}
rs[i] = "<p class=emuH style='top:"+(y0+i)+";left:"+left+";width:"+width+";background-color:"+color+"'/>";
}
}else{
if (lx<0){
var t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
lx = -lx;
ly = -ly;
}
var dy = ly/lx;
rs = new Array(lx);
for (var i=0;i<lx;i++){
var top,height;
if (dy>0){
top = Math.round(i*dy);
height = Math.round((i+1)*dy)-top;
top += y0;
if (height+top>y1) height = y1-top;
}else{
top = Math.round((i+1)*dy);
height = Math.round((i)*dy)-top;
top += y0;
if (top<y1) {
height = height+top-y1;
top=y1;
}
}
rs[i] = "<p class=emuW style='top:"+top+";left:"+(x0+i)+";height:"+height+";background-color:"+color+"'/>";
}
}
rs = rs.join("");
}
return rs
}//-->
</SCRIPT>
</HEAD><BODY onclick="fnSwitchMode()" onmousemove="fnPaint()">
<input type="button" onclick="fnShowCount()" value="ShowCount">
<div id="div1"></div>
</BODY>
</HTML>跟你的需求不一样。
但是你可以参考这个用setTimeout函数来画。
中间就有时间可以让你操作中断程序了。
定义一个公共变量
var readytobreak=false;但要在for循环体内加上一句
if(readytobreak){readytobreak=false;break;}剩下的就是怎么去改变readytobreak的值的问题了
<img id="tip" alt="" width="95" height="55" style="cursor:hand;display:none" src="../images/window.gif" onclick="readytobreak=true" />当然你也可以调用一个过程
function XXX(){readytobreak=true;}
那更简单
其实你调用循环前使用setTimeout()
这样你那个循环就变成另外一个独立的线程就不会影响其他界面操作了
举例:
function XXX()
{
你的for循环
}调用时使用setTimeout
setTimeout("XXX()",100);
这样你的循环就拥有了独立的线程
你就可以进行其他操作了