Javascript `confirm()` 先执行

标签 javascript jquery

我有一个在 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 控制台中看到“确定”:相反,我在按下确认对话框上的“取消”按钮后看到它。这没有任何意义:当我看到弹出对话框时,“确定”应该在那里。为什么会这样,我该如何解决?

最佳答案

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

console.log,据我所知,是对控制台进行日志记录的异步请求。但是,在脚本完成之前,它无法发送该请求。 drawscreen 也是如此,在脚本完成之前,屏幕实际上无法重绘。

尝试将您的 if block 包装在 setTimeout(function() { ... },1); 中,这将为浏览器提供足够的时间来记录响应并在立即返回您的确认之前重绘屏幕,不给用户时间做任何可能干扰正常操作的事情。

关于Javascript `confirm()` 先执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17391902/

相关文章:

javascript - jQuery 数据表行内联编辑

javascript - 构建运行时挂起 'react-native run-ios'

javascript - 为什么我的 next() 和 prev() 切换的文本输出不正确?

javascript - 将每个 div 插入数组,然后将它们加入 html 替代方案

jquery - 制作jquery tmpl,无需大量额外的脚本标签

javascript - 三个 J 中的交互式网格

javascript - 如何比较 Javascript 中的字符串数组?

javascript - i = 1 如何访问channel_number_i?

将 div 转换为 ul 并将 div 内容转换为 li 后,jquery 缺少行

javascript - 内联 Javascript 破坏了我的 HTML/CSS