我有一个页面,在某个操作上可以看到iframe,并用一些HTML填充iframe(比如说多选框和一个ok按钮)。
iframe上的OK按钮具有如下定义的onClick方法:
onClick="parent.hideIFrame();parent.processMultiSelectBox();"
当用户在iframe上单击“确定”时(可能是在使用多选框后),我希望iFrame立即消失,然后可以处理多选框中的选定值。但这不是正在发生的事情。 iFrame在其他函数运行期间保持可见,仅在第二个函数完成后消失。
hideIFrame函数非常简单:
function hideIFrame() {
frmObj = document.all.iFrameID;
if(frmObj) {
frmObj.style.visibility = "hidden";
}
}
为了清楚起见,我已经解释了上述功能(删除了一些指标变量赋值等)。
第二个函数实际上循环多选对象中的所有选项,并用它做任务。这需要大约半秒钟,只有在完成之后,我的iFrame才会消失。当我点击确定时,看到它停留半秒钟有点麻烦。
我的问题是,是否有某种方法可以让这种蠢货消失得更快。在“古典C”术语中,是否有“同花顺”才能立即发生能见度变化?
我注意到如果我在第二个函数中将“alert”作为第一行,iframe会立即消失,但现在警报框上的OK就会延迟第二个函数完成所需的时间。
感谢。
编辑:根据DDaviesBrackett的回答,这就是我最终做的事情:
iframe中的onclick更改为:
onClick="parent.hideAndProcessMultiSelectBox(parm1, parm2);"
hideAndProcessMultiSelectBox函数定义为:
function hideAndProcessMultiSelectBox( parm1, parm2 ) {
hideIFrame();
setTimeout( function() { processMultiSelectBox( parm1, parm2 ); }, 0 );
}
Voila ..没有延迟..
答案 0 :(得分:3)
你已经解决了问题的根源;文档重排不会发生,直到当前的JS线程完成(以便在JS执行期间不重复绘制很多次)。在进行昂贵的处理之前,您需要将控制权返回给浏览器。
实现这一目标的最简单方法是,尽管没有明显的代码,但是在setTimeout中调用processMultiSelectBox
时延迟为0:
onClick="parent.hideIFrame();parent.setTimeout(parent.processMultiSelectBox,0);"
如果你需要将参数传递给你正在设置超时的东西,你有两个选择:在一个字符串上设置一个超时来判断为Javascript(坏,坏,非常糟糕,可怕)或者定义一个匿名函数这叫你感兴趣的那个:
onClick="parent.hideIFrame();parent.setTimeout(function(){parent.processMultiSelectBox(foo, bar, 'baz');},0);"
RSolberg的回复也可能有所帮助,尽管visibility:hidden
和display:none
之间存在差异。