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