Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript DOM操作后在Internet explorer中强制刷新DOM_Javascript_Internet Explorer_Dom - Fatal编程技术网

javascript DOM操作后在Internet explorer中强制刷新DOM

javascript DOM操作后在Internet explorer中强制刷新DOM,javascript,internet-explorer,dom,Javascript,Internet Explorer,Dom,情况是这样的。我有一些javascript如下所示: function onSubmit() { doSomeStuff(); someSpan.style.display="block"; otherSpan.style.display="none"; return doLongRunningOperation; } 当我将其设置为表单提交操作并从非IE浏览器运行时,它会快速交换两个跨度的可见性并运行长javascript操作。如果在IE中执行此操作,则在on

情况是这样的。我有一些javascript如下所示:

function onSubmit() {
    doSomeStuff();
    someSpan.style.display="block";
    otherSpan.style.display="none";
    return doLongRunningOperation;
}
当我将其设置为表单提交操作并从非IE浏览器运行时,它会快速交换两个跨度的可见性并运行长javascript操作。如果在IE中执行此操作,则在onSubmit()完全返回之前,它不会执行交换

我可以通过在中粘贴一个警告框来强制重新绘制dom,如下所示:

function onSubmit() {
    doSomeStuff();
    someSpan.style.display="block";
    otherSpan.style.display="none";
    alert("refresh forced");
    return doLongRunningOperation;
}
此外,jquery重构显然不会影响IE行为:

function onSubmit() {
    doSomeStuff();
    $("#someSpan").show();
    $("#otherSpan").hide();
    return doLongRunningOperation;
}
这种行为存在于IE8和IE6上。在这些浏览器中是否有强制重画DOM的方法?

Mozilla(可能还有IE)将缓存/延迟对DOM的更改,这些更改会影响显示,因此它可以一次计算所有更改,而不是在每条语句后重复计算

要强制更新(强制立即同步回流或重新播放),javascript应该读取受更改影响的属性,例如someSpan和otherSpan的位置


(视频中提到了此Mozilla实现细节。)

可以异步调用longRunningOperation吗?

还可以将longterm函数包装在setTimeout中(function(){longterm();},1)

要继续ChrisW说的话:

这里是flash DOM的刷新脚本,所以您不必调用alert(“”);(网址:

它适合我
谢谢你的提示。

我在Chrome 21中遇到了这个问题,因为我拖拽了一个带有下行字母('g')的单词。它在屏幕上留下了一道蛾尘的痕迹,下次有什么东西刷新屏幕时,这些痕迹就会消失。ChrisW的解决方案(询问布局敏感属性)不起作用

所做的工作是在页面顶部添加一个1像素的空白div,然后在一毫秒后通过在拖动操作结束时调用以下函数将其删除:

// Needed by Chrome, as of Release 21. Triggers a screen refresh, removing drag garbage.
function cleanDisplay() {
    var c = document.createElement('div');
    c.innerHTML = 'x';
    c.style.visibility = 'hidden';
    c.style.height = '1px';
    document.body.insertBefore(c, document.body.firstChild);
    window.setTimeout(function() {document.body.removeChild(c)}, 1);
}
注意:您需要延迟。简单地添加和删除
div
是行不通的。另外,需要在需要重新绘制的页面部分上方添加
div

元素。focus()在IE10中适用于我

function displayOnOff(){
    var elm = document.getElementById("myDiv");
    elm.style.display="block";
    elm.focus();
    for(var i=0; i<1000000; i++){
        console.log("waiting...............");
    }
    elm.style.display = "none";
}
函数displayOnOff(){
var elm=document.getElementById(“myDiv”);
elm.style.display=“block”;
elm.focus();

对于(var i=0;首先,你在longRunningOperation中做什么?你尝试过将可见性切换移动到它自己的函数吗?longRunningOperation正在进行表单验证。表单在一小部分案例中很大。有趣。我不知道这一点。我将在上午进行一次尝试。在我引用的Mozilla视频中,时间37:15,他建议asking表示“顶部偏移”或“左侧偏移”这要求布局是最新的。非常感谢!!这救了我一命。顺便说一句,做视频的家伙在公开演讲时很差劲。你最终是对的,但做了一些工作。我异步调用了长时间运行的操作,让我的提交事件返回false,然后异步事件真的提交了我的表单。这导致了在所有浏览器,但需要大量工作,感觉有点笨拙。这可能感觉笨拙,但应用程序客户端的最佳设计将是保持浏览器响应。当你开始长时间运行进程时,你将挂起浏览器(大不!)因此,最好是花时间设计如何管理异步操作。总之..玩得开心!这个解决方案比像我一样异步调用函数好吗?IE10中的屏幕刷新有问题,这就解决了问题,不像其他解决方案。这里是IE8。这是唯一对我有效的解决方案。谢谢。
function displayOnOff(){
    var elm = document.getElementById("myDiv");
    elm.style.display="block";
    elm.focus();
    for(var i=0; i<1000000; i++){
        console.log("waiting...............");
    }
    elm.style.display = "none";
}