JavaScript-在Chrome中强制行在循环内执行?

JavaScript-在Chrome中强制行在循环内执行?,javascript,Javascript,我有一个while循环: x=真; 而x==true{ document.images['id'].src=arr[i]; i=i+1; x=确认“您想看更多吗?” } 这会显示每个图像,然后询问我是否想在firefox和ie上看到更多,但在chrome和safari中,它只在我离开循环后显示图像。我知道这很有效,但我想知道是否有一种方法可以在循环中强制执行该行? 谢谢你的意见! 您可以添加setTimeout序列,而不是循环,以强制javascript用户线程停止,从而让浏览器刷新

我有一个while循环:

x=真; 而x==true{ document.images['id'].src=arr[i]; i=i+1; x=确认“您想看更多吗?” }

这会显示每个图像,然后询问我是否想在firefox和ie上看到更多,但在chrome和safari中,它只在我离开循环后显示图像。我知道这很有效,但我想知道是否有一种方法可以在循环中强制执行该行?

谢谢你的意见!

您可以添加setTimeout序列,而不是循环,以强制javascript用户线程停止,从而让浏览器刷新图形

var i = 0; // define outside showNextImage to be properly captured by it.
var showNextImage = function() {
    document.images['id'].src = arr[i]; 
    i = i+1; 
    x = confirm('do you want to see more?');
    if (true) setTimeout(showNextImage, 10);
};

您可以添加setTimeout序列,而不是循环,以强制javascript用户线程停止,从而让浏览器刷新图形

var i = 0; // define outside showNextImage to be properly captured by it.
var showNextImage = function() {
    document.images['id'].src = arr[i]; 
    i = i+1; 
    x = confirm('do you want to see more?');
    if (true) setTimeout(showNextImage, 10);
};
两个答案:

不要使用确认 如果确实要使用“确认”,请在更新图像后但在“确认”之前使用浏览器 1.不要使用确认 最好的方法是根本不使用确认;它已经过时了,正如您所发现的,它在不同浏览器上的行为在是否显示对页面的更改方面略有不同

相反,我会使用350124对话框库中的任何一个,它们都有一个很好的对话框库,但同样,它们有很多,它们是异步工作的,因此您肯定会看到页面更改。您的循环将成为一个异步函数,但一旦您习惯了这些函数,它们就不那么棘手了,而且从用户体验的角度来看,其好处是巨大的

function chooseImage(arr, completionCallback) {
    var i = 0, imgElement = document.images['id'];

    ask();

    function ask() {
        imgElement.src = arr[i];
        showDialog(gotAnswer); // the nature of "show dialog" will depend on which one you use
    }

    function gotAnswer() {
        if (userSaidYes) { // Again, depends on the library you're using
            completionCallback(i); // Tell the calling code which one they picked
        }
        else {
            // Is there another?
            ++i;
            if (i >= arr.length) {
                // No, tell the user
                /* left as exercise */

                // Tell calling code none was chosen
                completionCallback(-1); // Using -1 as a flag for none
            }
            else {
                // Yes, ask about it
                ask();
            }
        }
    }
}
2.使用确认但放弃 问题在于,当浏览器向用户提问时,“确认”会使事情突然停止。如您所见,当确认窗口处于活动状态时,您对页面所做的更改可能不会显示

如果您确实想使用确认,您仍然可以这样做,只需先简单地返回浏览器,以便它有时间显示页面更改。但是请注意,如果图像需要很长时间才能下载,这可能仍然不是一个保证

function chooseImage(arr, completionCallback) {
    var i = 0, imgElement = document.images['id'];

    showAndHandOff();

    function showAndHandOff() {
        imgElement.src = arr[i];
        setTimeout(ask, 0);
    }

    function ask() {
        if (confirm('do you want to see more?')) {
            ++i;
            if (i >= arr.length) {
                alert("Sorry, there aren't any more.");
                completionCallback(-1);
            }
            else {
                showAndHandOff();
            }
        }
        else {
            completionCallback(i);
        }
    }
} 
两个答案:

不要使用确认 如果确实要使用“确认”,请在更新图像后但在“确认”之前使用浏览器 1.不要使用确认 最好的方法是根本不使用确认;它已经过时了,正如您所发现的,它在不同浏览器上的行为在是否显示对页面的更改方面略有不同

相反,我会使用350124对话框库中的任何一个,它们都有一个很好的对话框库,但同样,它们有很多,它们是异步工作的,因此您肯定会看到页面更改。您的循环将成为一个异步函数,但一旦您习惯了这些函数,它们就不那么棘手了,而且从用户体验的角度来看,其好处是巨大的

function chooseImage(arr, completionCallback) {
    var i = 0, imgElement = document.images['id'];

    ask();

    function ask() {
        imgElement.src = arr[i];
        showDialog(gotAnswer); // the nature of "show dialog" will depend on which one you use
    }

    function gotAnswer() {
        if (userSaidYes) { // Again, depends on the library you're using
            completionCallback(i); // Tell the calling code which one they picked
        }
        else {
            // Is there another?
            ++i;
            if (i >= arr.length) {
                // No, tell the user
                /* left as exercise */

                // Tell calling code none was chosen
                completionCallback(-1); // Using -1 as a flag for none
            }
            else {
                // Yes, ask about it
                ask();
            }
        }
    }
}
2.使用确认但放弃 问题在于,当浏览器向用户提问时,“确认”会使事情突然停止。如您所见,当确认窗口处于活动状态时,您对页面所做的更改可能不会显示

如果您确实想使用确认,您仍然可以这样做,只需先简单地返回浏览器,以便它有时间显示页面更改。但是请注意,如果图像需要很长时间才能下载,这可能仍然不是一个保证

function chooseImage(arr, completionCallback) {
    var i = 0, imgElement = document.images['id'];

    showAndHandOff();

    function showAndHandOff() {
        imgElement.src = arr[i];
        setTimeout(ask, 0);
    }

    function ask() {
        if (confirm('do you want to see more?')) {
            ++i;
            if (i >= arr.length) {
                alert("Sorry, there aren't any more.");
                completionCallback(-1);
            }
            else {
                showAndHandOff();
            }
        }
        else {
            completionCallback(i);
        }
    }
} 
例如:

var x = true,  
  i = 0,  
  fn = function() {  
    document.images['id'].src = arr[i];  

    x = confirm('do you want to see more?');  
    if ( x ) {  
      i = i+1;  
      setTimeout(fn, 0)  
    }  
  };  
fn();  
例如:

var x = true,  
  i = 0,  
  fn = function() {  
    document.images['id'].src = arr[i];  

    x = confirm('do you want to see more?');  
    if ( x ) {  
      i = i+1;  
      setTimeout(fn, 0)  
    }  
  };  
fn();  

我不确定这是否真的能解决问题,因为你还在更新图像,然后马上打电话确认。非常确定您想在更新图像之后但在调用confirm之前使用setTimeout,因此您可以让步并让页面更改完成。还有,你肯定是说如果x{setTimeout…,而不是如果真的setTimeout…,事实上,即使你做了setTimeout的事情,你也不知道图像已经完成下载。因此,在图像下载之前,超时很容易发生,因此当确认启动时,Chrome显然没有更新页面显示,这可能会使问题更加间歇性nt。我不确定这是否真的能解决问题,因为您仍在更新图像,然后立即调用confirm。非常确定您想在更新图像后但在调用confirm之前使用setTimeout,因此您会让步并让页面更改完成。另外,非常确定您的意思是如果x{setTimeout…,而不是如果真的setTimeout…,事实上,即使你做了setTimeout的事情,你也不知道图像已经完成下载。因此,在图像下载之前,超时很容易发生,因此当确认启动时,Chrome显然没有更新页面显示,这可能会使问题更加间歇性新界。