首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ajax回调中的JQuery切换最终生效

ajax回调中的JQuery切换最终生效
EN

Stack Overflow用户
提问于 2016-09-12 17:13:37
回答 1查看 59关注 0票数 0

我有一个带有地址的<select>和一个<button>,当按下它时,将在jQuery中触发此on('click')事件。在里面我想toggle()一个图像,然后在ajax完成后隐藏它,例如加载器。但是,在完成单击回调函数中的所有功能之前,toggle()应该执行的更改不会生效。

代码语言:javascript
复制
$('#add_existing_address').on('click', function() {
    log($('#loading-image').toggle({queue:false, duration: 10, complete: function() {log('yes');}}));
    sleep(3000);
    var value = $('#EXISING_ADDRESS').val();
    if (value != '') {
        addAddressToOrder(6, value);
        $('#EXISING_ADDRESS').val('');
    }
    //log($('#loading-image').toggle());
    document.getElementById('loading-image').style.display = 'none';
    log(document.getElementById('loading-image').style.display);
});

我已经确定我已经设置了{queue:false}并且持续时间是10毫秒。sleep()函数是一个自定义函数,它会减慢3秒,这样我就可以看到页面中的变化。我也尝试过使用普通的JS来更改图像的显示,但它也会在ajax完成后生效。

奇怪的是,第一次出现的toggle()将立即返回,log()将在控制台中显示结果,但更改将在on()回调的最后一行之后执行。到目前为止,我还没有发现为什么会发生这样的事情。

基本上,函数的输出将是:

EN

回答 1

Stack Overflow用户

发布于 2016-09-12 17:45:46

Javascript基本上是浏览器中的单线程语言。这意味着,在任何给定的时间都只有一个执行点。

对于动画,这意味着必须使用setTimeout()或setInterval()在重新生成的动画帧中执行动画。参数queue只确定不同的动画是否可以并行运行(实际上,不同动画的所有动画帧都将连续运行),或者它们是否一个接一个地运行。

为了解释代码中发生的事情:首先,切换方法是call,它启动一个动画。它设置了一些方法来在随后(异步地)调用动画帧中执行实际的动画,然后立即返回。接下来,进入睡眠状态(显然是某种循环),它会暂停当前的执行线程,直到周期结束。由于js是单线程的,在这段时间内没有其他的执行可以参与,所以没有动画,什么也没有。在休眠之后,该函数一直执行到最后,执行样式更改。只有在这部分完成之后,单个javascript线程才再次可用于其他计算,即第一个创建的动画帧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39446907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档