1

我有一个在 AJAX 调用完成后执行的 javascript 代码。

req.done(function (response, textStatus, jqXHR){
    if (response == "  ok"){
        // values are confirmed
        this.s = this._s
        this.e = this._e
        this.assign = this._assign
        this.y = roomline.snapHeight(this.assign);
        console.log(response)
        drawscreen()

            if (confirm('Would you also like to apply a discount/credit?')){
            var link = "?some_get_request"
            self.location = "assignDiscount.php" + link;
            }

    } else  {
        alert(response)
    }
});

正如你所看到的,我有一堆应该在confirm()对话框显示之前发生的事情(比如drawscreen()console.log)。

问题是这些东西都没有发生确认对话框之前,而是在确认对话框之后!我应该在我的 javascript 控制台中看到“ok”:而是在我按下确认对话框上的“cancel”按钮后看到它。这是没有意义的:当我看到弹出对话框时,“ok”应该在那里。为什么会这样,我应该如何解决?

4

2 回答 2

3

您看到的问题是 JavaScript 是单线程的,并且confirm是阻塞的。

console.log,据我所知,是控制台记录某些内容的异步请求。但是,在脚本完成之前,它无法发送该请求。同理drawscreen,在脚本完成之前,屏幕实际上无法重绘。

if尝试将您的块包装在 asetTimeout(function() { ... },1);中,这将使浏览器有足够的时间来记录响应并重绘屏幕,然后再返回您的confirm,而不会给用户时间做任何可能干扰正常操作的事情。

于 2013-06-30T15:28:07.547 回答
0

确认警报都是进程阻塞语句。它们阻止中间的过程,并且在按下确定按钮之前不允许任何东西反映在屏幕上。

于 2013-06-30T15:41:41.893 回答