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