gpt4 book ai didi

javascript - 当没有属性更改时,在 jQuery 中不会触发 CSS 转换事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:28 24 4
gpt4 key购买 nike

我遇到了一个有趣的案例,W3C CSS Transitions 中没有明确涵盖该案例规范或 MDN CSS Transitions我认为我会分享的文档,因为它花费了我一些时间。

如果您将 CSS 过渡属性“更改”为相同的值,则不会触发任何过渡事件。正如我所想,我可以理解为什么这是默认行为,但它很容易给毫无戒心的开发人员带来问题,例如:$("#test").css("opacity", "1").bind("transitionend", doneFn);

在上面的代码中,如果相关元素的不透明度恰好为 1,则永远不会调用 doneFn。另见 http://jsfiddle.net/studgeek/Xj8TB/ .

为了让这是一个问题,是否有一个很好的解决方法来处理这个问题?

您可以将属性值与现有属性值与现有属性值进行比较,但这比听起来要好做起来要棘手,因为 css 属性值可以采用多种形式 - 不同的单位,甚至字符串值,如 auto。所以你真的必须测试对象的实际状态,当然需要对每个属性进行不同的测试。呃。

最佳答案

一种解决方法是创建您自己的 jQuery 方法来设置一个 CSS 值,它会为您处理所有事情。它会获取属性的当前值,设置新值,检查值是否已更改。如果没有,那么它将手动触发完成功能:

// globally set this to the right transition event for the current browser
// modernizr has ways of using feature detection to know which is the right way to set this
var transitionEvent = "webkitTransitionEnd";

jQuery.fn.transitionTo = function(prop, value, completeFn) {
var origValue, item;
for (var i = 0, len = this.length; i < len; i++) {
item = jQuery(this[i]);
origValue = item.css(prop);
item.css(prop, value);

// if value hasn't changed
if (origValue == item.css(prop)) {
completeFn.apply(this[i]);
} else {
this.one(transitionEvent, completeFn);
}
}
}

在你上面的例子中,它会像这样工作:

$("#test").transitionTo("opacity", "1", doneFn);

这里的工作示例:http://jsfiddle.net/jfriend00/LHdGR/

此插件可以扩展以支持传递多个属性的映射,例如 .css() 也支持。

我能想到的唯一其他选择是读取 transtionDuration 并设置一个比该值稍长的超时值。如果 transitionEnd 事件触发,您将取消超时。如果没有触发,超时可以手动触发 transitionEnd 事件。其代码可以像这样工作:

var transitionEvent = "webkitTransitionEnd";
var transitionDuration = "WebkitTransitionDuration";

// get transition duration in decimal seconds
// this only returns the first transition time if there are multiple ones specified
jQuery.fn.getDuration = function() {
var val = this.css(transitionDuration);
if (!val) {
val = "0s";
}
var num = parseFloat(val);
var units = val.replace(/\d\., /g, "");
if (units.indexOf("ms") == 0) {
num /= 1000;
}
return(num);
}

// set a guaranteed transition event that will always fire, even if
// no CSS transition is triggered
jQuery.fn.setTransitionEvent = function(completeFn) {
var item, duration;
for (var i = 0, len = this.length; i < len; i++) {
item = jQuery(this[i]);
duration = Math.ceil((Number(item.getDuration()) + 0.1) * 1000);
(function(t, o) {
var timeout = setTimeout(function() {
completeFn.apply(o);
o.unbind(transitionEvent);
}, duration);
o.one(transitionEvent, function() {
clearTimeout(timeout);
});
})(duration, item);
}
}

这里的工作示例:http://jsfiddle.net/jfriend00/hxevW/

关于javascript - 当没有属性更改时,在 jQuery 中不会触发 CSS 转换事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com