Javascript 使用jQuery操作DOM时,代码不同步?

Javascript 使用jQuery操作DOM时,代码不同步?,javascript,jquery,dom,css-transitions,Javascript,Jquery,Dom,Css Transitions,我有这个功能: var decreaseBar = function (barElement) { insertCSSTransitions(barElement); $(barElement).find('.bar').width(0); } insertcstransitions(barElement)函数,执行以下操作: var insertCSSTransitions = function (barElement) { var timeBar = setting

我有这个功能:

var decreaseBar = function (barElement) {
   insertCSSTransitions(barElement);
   $(barElement).find('.bar').width(0);
}
insertcstransitions(barElement)
函数,执行以下操作:

var insertCSSTransitions = function (barElement) {
      var timeBar = settings.timeBar;
      $(barElement).find('.bar').attr('style', 'transition:width ' + timeBar + 's; -moz-transition:width ' + timeBar + 's; -webkit-transition:width ' + timeBar + 's; -o-transition:width ' + timeBar + 's');
}
发生的是:
$(barElement).find('.bar').width(0)行将
宽度设置为0,然后CSTranslation的样式才会生效

因为,如果我将
decreaseBar
函数修改为该值,它将起作用:

var decreaseBar = function (barElement) {
   insertCSSTransitions(barElement);

   // set a delay of 1 second before set to 0
   setTimeout(function() {
      $(barElement).find('.bar').width(0);
   }, 1000)
}

使用jQuery操作DOM时,代码不同步?

这里可能发生的情况是,
insertcstransitions()
所做的样式更改在浏览器重新绘制时释放浏览器控件之前无效


您只需使用
setTimeout(…,1)
即可确保在浏览器处理
转换后对元素宽度进行更改。

这里可能发生的情况是,
insertcstransitions()
所做的样式更改在您释放浏览器控制之前无效,当它重新喷漆时

您确实只需要使用
setTimeout(…,1)
来确保在浏览器处理
转换后对元素宽度进行更改。

是否使用回调

var decreaseBar = function (barElement) {
   insertCSSTransitions(barElement, function() {
       $(barElement).find('.bar').width(0);
   });
}

var insertCSSTransitions = function (barElement, callback) {
    var timeBar = settings.timeBar;
    $(barElement).find('.bar').attr('style', 'transition:width ' + timeBar + 's; -moz-transition:width ' + timeBar + 's; -webkit-transition:width ' + timeBar + 's; -o-transition:width ' + timeBar + 's');

    setTimeout(function() {callback.call();}, timebar*1000);
}
这只是一个简单的回调示例,它不等待CSS转换发生,应该有一个简单的检查类型,看看回调是否是一个函数,如果它也用于其他用途

编辑:

正如Pointy所指出的那样,回调除了显示它是如何完成的等等之外,没有什么作用。 将回调绑定到转换端可能是一种方法,但是该属性有一系列前缀,在这里通过一些简单的浏览器检测解决了这一问题,但是有一些库用于检查浏览器中的实际支持

var insertCSSTransitions = function (barElement, callback) {
    var timeBar = settings.timeBar,
        transitionEnd = "TransitionEnd";
    if ($.browser.webkit) {transitionEnd = "webkitTransitionEnd";}
    else if ($.browser.mozilla) {transitionEnd = "transitionend";}
    else if ($.browser.opera) {transitionEnd = "oTransitionEnd"; }

    $(barElement).find('.bar')
                 .attr('style', 'transition:width ' + timeBar + 's; -moz-transition:width ' + timeBar + 's; -webkit-transition:width ' + timeBar + 's; -o-transition:width ' + timeBar + 's');
                 .on(transitionEnd, function() {
                     callback.call();
    });
}
使用回调

var decreaseBar = function (barElement) {
   insertCSSTransitions(barElement, function() {
       $(barElement).find('.bar').width(0);
   });
}

var insertCSSTransitions = function (barElement, callback) {
    var timeBar = settings.timeBar;
    $(barElement).find('.bar').attr('style', 'transition:width ' + timeBar + 's; -moz-transition:width ' + timeBar + 's; -webkit-transition:width ' + timeBar + 's; -o-transition:width ' + timeBar + 's');

    setTimeout(function() {callback.call();}, timebar*1000);
}
这只是一个简单的回调示例,它不等待CSS转换发生,应该有一个简单的检查类型,看看回调是否是一个函数,如果它也用于其他用途

编辑:

正如Pointy所指出的那样,回调除了显示它是如何完成的等等之外,没有什么作用。 将回调绑定到转换端可能是一种方法,但是该属性有一系列前缀,在这里通过一些简单的浏览器检测解决了这一问题,但是有一些库用于检查浏览器中的实际支持

var insertCSSTransitions = function (barElement, callback) {
    var timeBar = settings.timeBar,
        transitionEnd = "TransitionEnd";
    if ($.browser.webkit) {transitionEnd = "webkitTransitionEnd";}
    else if ($.browser.mozilla) {transitionEnd = "transitionend";}
    else if ($.browser.opera) {transitionEnd = "oTransitionEnd"; }

    $(barElement).find('.bar')
                 .attr('style', 'transition:width ' + timeBar + 's; -moz-transition:width ' + timeBar + 's; -webkit-transition:width ' + timeBar + 's; -o-transition:width ' + timeBar + 's');
                 .on(transitionEnd, function() {
                     callback.call();
    });
}

人们谈论异步行为就像它是圣杯一样,但是让JS在需要的时候保持同步往往是更困难的任务。(与其他流控制库(如asnyc和flow.js)一样)就是为了解决这个问题而设计的。在框架中,您将执行以下操作:

var decreaseBar = function (barElement) {
    Frame(function(next)){
        insertCSSTransitions(barElement);
        next();
    });
    Frame(function(next)){
        $(barElement).find('.bar').width(0);
        next();
    });
    Frame.init();
}

人们谈论异步行为就像它是圣杯一样,但是让JS在需要的时候保持同步往往是更困难的任务。(与其他流控制库(如asnyc和flow.js)一样)就是为了解决这个问题而设计的。在框架中,您将执行以下操作:

var decreaseBar = function (barElement) {
    Frame(function(next)){
        insertCSSTransitions(barElement);
        next();
    });
    Frame(function(next)){
        $(barElement).find('.bar').width(0);
        next();
    });
    Frame.init();
}

除非进行AJAX调用,否则JavaScript始终是同步的:

您的代码无法正常工作,因为您使用的是与JavaScript不同步的CSS转换。JavaScript正在向DOM“添加”样式转换,一旦完成,就继续


我不太清楚函数的用途,因此很难找到更好的解决方案。总而言之,让JavaScript像您现在这样添加硬编码样式通常是不好的做法。

除非进行AJAX调用,否则JavaScript总是同步的:

您的代码无法正常工作,因为您使用的是与JavaScript不同步的CSS转换。JavaScript正在向DOM“添加”样式转换,一旦完成,就继续


我不太清楚函数的用途,因此很难找到更好的解决方案。总而言之,让JavaScript像您现在这样添加硬编码样式通常是不好的做法。

不,不是。浏览器环境是异步的。不,不是。浏览器环境是异步的,我不明白你回调的目的,有你回调的代码和我没有回调的代码一样,会一个接一个的发生。你能再解释一下吗?是的,它和你的代码一样,添加了回调?css转换做什么,需要多长时间,在css中是否设置为1秒?JS中没有“wait for css transition”(等待css转换)函数,因此与转换时间相同的超时可能是最好的选择,但回调将确保宽度(0)仅在插入函数完成后执行,即JS部分完成后,css中设置的计时器没有JS回调;运行时,页面中的DOM将不会添加“样式”属性,因为浏览器没有重新绘制。样式属性几乎是立即添加的,但是为了改变样式,您应该考虑使用CSS()方法。同样,您的转换是否在CSS中设置了计时器。这里的回调非常无用,除非它被设置为“transitionend”事件的事件处理程序(或相应的特定于浏览器的事件处理程序)。当转换完成时,这将触发元素,这就是问题真正要问的。我不理解回调的目的,有回调的代码与没有回调的代码相同,它会一个接一个地发生。你能再解释一下吗?是的,它和你的代码一样,添加了回调?css转换做什么,需要多长时间,在css中是否设置为1秒?JS中没有“wait for css transition”(等待css转换)函数,因此与转换时间相同的超时可能是最好的选择,但回调将确保宽度(0)仅在插入函数完成后执行,即JS部分完成后,css中设置的计时器没有JS回调;运行时,页面中的dom将没有adde