各位web前端、js达人,为了用户感觉好一点,在一个费时的js循环前在ie里打出“请稍候...”的div,循环完成后再隐藏此div
现在的问题是显示此div后,立即循环,会导致此div实际没机会显示。
只有显示此div后,alter('xxx'),才会真正显示那个div。
好像是delphi里没有application.processmessages;浏览器没机会刷新界面
怎么样才能让浏览器有机会刷新界面?这个问题还不好搜,找不到对应恰当的关键词
使用“改变div 却没有”等,均不是想要的。
现在的问题是显示此div后,立即循环,会导致此div实际没机会显示。
只有显示此div后,alter('xxx'),才会真正显示那个div。
好像是delphi里没有application.processmessages;浏览器没机会刷新界面
怎么样才能让浏览器有机会刷新界面?这个问题还不好搜,找不到对应恰当的关键词
使用“改变div 却没有”等,均不是想要的。
解决方案 »
- jquery怎样按住ctrl键来控制.mod_1的z-index值?
- jquery操作表格
- 请问smugmug的图片效果是怎么实现的?
- js中如何复制一个table的节点然后再添加进去,有代码!
- 关于html标签的事件
- 一个正则的问题,请教正则高手!!!!!!!!!!!!!!!
- jquery datepicker控件求助~~~~~所有分有奉献~~~~~~急~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 如何让一个下拉框不能选择,就象文本设为readonly一样
- 控件不能从server端下载,这个问题比较急,请帮我多出主意啊,谢谢
- 关于JS里面换行问题
- |zyciis| 当form post 后如何再执行一个方法,谢谢
- 函数求助
要等该段脚本执行完了才会刷新页面
所以直接调用高强度的js会堵塞当前页面的正常显示 调用settimeout不会堵塞当前页面
(你想想看 你先设置了页面的dom 然后在执行一段脚本 脚本完了才会刷新页面 这个时候你 设置的DOM有什么用)道理就是这样 选择在自己
dom?指操作div?
操作div后,直接调用高强度的js前,能不能用代码告诉浏览器:你现在可以更新界面一下?
就像 delphi里的Application.ProcessMessages();、VB里的DoEvent();一样
以前写delphi程序,都是这样:
显示等候信息,freecpu,循环处理(一小段循环,更新进度条等提示信息,freecpu),隐藏div
这样,逻辑很直观
而这种需要显然是非常普通而且必要的
没有提供CpuFree()接口,就应该算是设计者的错误了就像t-sql的select只有top n,不支持skip m,导致以前为了分页这么折腾
也应该算是设计者的错误:没有预计到使用者很需要的功能
1.tmp.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Loading</title></head>
<body>
Please wait for a moment...
</body>
</html>
2test.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Insert title here</title>
</head>
<body><script type="text/javascript"><!--newwin=window.open("tmp.html", 'mywindow1', 'width=400, height=300, menubar=no, toolbar=no, scrollbars=yes');//The following code is a simulated for the long loop;
i=0;
timerID=null;
window.onload = function() {
timerID = setInterval("message()", 1000);
}
function message() {
document.getElementById("result").innerHTML = new Date() + "<br>"+i;
i++;
if(i==10){
clearInterval(timerID);
newwin.close();
}
}
// --></script>
<div id="result"></div>
</body>
</html>
你改一下,窗口的样式,应该可以对应您的问题
倒是一个新的思路。。只是,提示窗口可以改为js自动生成,应该可以不用定时器吧
另外,如果是多栏(tab)浏览器,新窗口可能效果不好(到另一个tab了)
var wmsg;
function showmsg(s)
{
wmsg=window.open("", 'mymsgwindow', 'width=400, height=200, menubar=no, toolbar=no, scrollbars=yes');
wmsg.document.body.innerHTML=s;
wmsg.title="提示信息";
}function closemsg()
{
wmsg.close();
}
最开始载入的时候,把用于计算的页面高度设为0,
当计算完成后,把表于显示提示的页面的高度设为0,不才虽感觉可以办到,但并没有亲自证实,
您不防试一试。
<html>
<head>
<title>FRAME</title>
</head>
<frameset id="main" rows="80%,*">
<frame src="frameTitle.html" name="frameTitle">
<frame src="frameLoop.html" name="frameLoop">
<noframes>
SORRY.....
</noframes>
</frameset>
</html>
2 frameTitle.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Loading</title></head>
<body>
Please wait for a moment...
</body>
</html>
3 frameLoop.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Insert title here</title>
</head>
<body><script type="text/javascript"><!--//newwin=window.open("tmp.html", 'mywindow1', 'width=400, height=300, menubar=no, toolbar=no, scrollbars=yes');//The following code is the simulated for a long loop;
i=0;
timerID=null;
window.onload = function() {
timerID = setInterval("message()", 1000);
}
function message() {
document.getElementById("result").innerHTML = new Date() + "<br>"+i;
i++;
if(i==10){
clearInterval(timerID);
//newwin.close();
parent.document.getElementById("main").rows="0%,100%"
}
}
// --></script>
<div id="result"></div>
</body>
</html>
嗯,应该可以
能把这个js函数分解到iframe里?即使能分解,也是把本来顺序简单直观的代码逻辑打乱了
setTimeout(function(){
// 循环;div.innerHTML ="";
},1);
js如果要成为应用的编程语言,也应该要吸收它们的解决办法
js可以用于浏览器编程、ASP(JScript服务器端脚本)编程、.NET框架编程(JScript)、windows系统脚本(WSH脚本编程)等等,
js语言只有ECMA规定的那些语法,但是它的实际操作能力取决于宿主环境。
浏览器中,js需要通过浏览器提供的API进行操作,浏览器不提供,js本身无能为力。
正如来势汹汹的html5也是一样,浏览器支持了,js才可以操作,与js本身无关。
Delphi不也是用的pascal语言么?只是Delphi提供的控件可以提供这些接口让pascal操作而已。
或者js提供一种通用的对浏览器函数的引用方式,以便js程序可以直接调用浏览器的一些开放给脚本的函数
html5计划开放socket、worker(类似多线程),可是还没推广开,更何况其他的一些呢。
那你玩vb去好啦,记住JS 不是为MS而生的!目前各大浏览器JS都是单线程
2、希望js能提供,与ms无关,与 js真正成为方便高效的编程语言 有关
与MS无关?那你用FF运行vb试试! 不靠多线程,根本解决不了这个问题。
如果浏览器在执行JS 的时候,不同时BLOCK RENDER DOM 的线程, 就不会出现你上述问题。
但恐怕,带来的问题会远比BLOCK这个线程要大的多。所以这个问题根本不关JS的事,是浏览器JS引擎的问题。
当然JS本身也是按单线程设计的。VB跟JS根本就是两回事,VB引擎是嵌在IE里的,别家浏览器没有的.
虽然也叫脚本,但实际上不在一个层面上的。另外,多线程JS引擎也是有的,不过都是是server端JS引擎。
我说的解决这个问题的win32应用的编程语言vb和delphi,它们解决这个问题,靠的是windows的事件处理机制,真的不是多线程。多线程也能解决这个问题,但是编程会复杂。说js不足,当然是指js的解释器的不足了
javascript执行过后,才会执行界面渲染的更新,而浏览器又是单线程的,一次只能做一个工作,所以必须在js全部执行完后才能执行渲染。
Worker的好处在于,把费时的for送到worker(相当于另开一个线程)工作,脱离主线程,这样主线程的js执行完div操作后,可以立即更新界面,而for在另个线程里工作,在完成后通知主线程,再次更新界面,就可以实现你说的效果。
另外win32程序的编程环境是windows,所有API由windows提供,所有控件只是封装一些操作。
跟语言的无关,只跟开发环境提供的控件有关。
浏览器也是同理,这些跟语言本身无关,只跟浏览器提供的API有关。
建议了解浏览器内部编程原理再讨论吧。
我承认win32编程的程序员基础知识多数都比WEB开发的程序员扎实,尤其是算法、数据处理方面。
但是浏览器编程也不同于win32编程,很多地方也是不一样的,一个win32程序员不一定能写好浏览器编程。
解释性语言也不同于编译型语言,也就无需讨论优劣对比了,这些都是徒劳。
能做的只是在充分了解两种语言后,将其中一种语言的编程思想利用到另一种里,而这个不需要改变另一种语言的规则或是其他。
这个没问题,但是2个引擎之间最好能增加一些通知机制如果改进(如上面说的通知机制 或 js的暂时“释放cpu”的特性)能方便开发,
那么浏览器的开发者就应该吸取
虽然浏览器的开发者普遍比js的开发者“高级”
就像ms的t-sql,以前只有top n而没有skip m,给sql使用者带来很大的麻烦(比如分页)
本来就是这样的:好的程序员就是自己的掘墓人!
一直挨骂的微软也是类似,让电脑易用了,价格也就下来了
让系统的开发、维护容易了,所以vc/vb/c#/asp的程序员、mssql的管理员的薪水也低