两个答案:
- 不要使用
confirm
- 如果你真的要使用
confirm
,请在更新图像之后但之前向浏览器屈服。confirm
1.不要使用confirm
最好的方法是根本不使用confirm
;它已经过时了,正如您发现的那样,它在不同浏览器上的行为在是否显示页面更改方面略有不同。
相反,我会使用现有的 350,124 个“对话框”库中的任何一个(jQuery UI有一个不错的库,但同样有很多),它们异步工作,因此您肯定会看到页面更改。你的循环会变成一个异步函数,但是一旦你习惯了它们并没有那么棘手,而且在用户体验方面的好处是巨大的。
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.使用confirm
但屈服
问题在于,confirm
当浏览器向用户询问问题时,事情会戛然而止。当确认窗口处于活动状态时(如您所见),您对页面所做的更改可能不会显示。
如果你真的想使用confirm
,你仍然可以这样做,只需先简单地返回浏览器,以便它有时间显示页面更改。但是请注意,如果图像需要很长时间才能下载,这仍然不能保证。
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);
}
}
}