【发布时间】:2016-08-30 08:10:16
【问题描述】:
我有一个函数,它使用 jQuery 将 html 加载到表中,然后使用回调将一个类添加到其中一行。该功能由页面上的各种 UI 驱动事件触发。我还有一个 css 过渡规则,所以颜色应该淡入(transition: background-color 1000ms linear)。函数如下所示:
function load_tbody(row_id) {
$('tbody').load("load_tbody.php", function() {
$(row_id).addClass('green');
});
}
加载 html 后,类成功添加,行颜色设置为绿色。但是,我的 css 转换规则似乎被忽略了。
当我添加一点延迟,即使是 10 毫秒,它也可以正常工作:
function load_tbody(row_id) {
$('tbody').load("load_tbody.php", function() {
setTimeout(function() {
$(row_id).addClass('green');
}, 10);
});
}
如果提供了“完成”回调,它会在之后执行 已执行后处理和 HTML 插入。
对我来说,这表明新元素已经加载到 dom 中并应用了现有样式,并准备好进行操作。为什么转换在第一个示例中失败,而在第二个示例中成功?
这是一个功能齐全的示例页面,用于演示相关行为:
http://so-37035335.dev.zuma-design.com/
虽然上面的示例从 cdn 链接 jQuery 版本 2.2.3,但实际页面使用的是 1.7.1 版本。在两个版本中都可以观察到相同的行为。
更新:
在考虑了下面提供的一些 cmets 和答案后,我偶然发现了一些更令人困惑的东西。用户@gdyrrahitis 提出了一个让我这样做的建议:
function tbody_fade(row_id) {
$('tbody').load("load_tbody.php", function() {
$('tbody').fadeIn(0, function() {
$(this).find(row_id).addClass('green');
});
});
}
在fadeIn() 回调中添加类是有效的,即使持续时间为 0 毫秒。所以这让我想知道......如果元素 理论上 存在,那么在我添加该类之前浏览器认为它具有什么背景颜色 。所以我登录background-color:
console.log($(row_id).css('background-color'));
你知道吗?只需获取背景颜色即可使一切正常:
function tbody_get_style(row_id) {
$('tbody').load("load_tbody.php", function() {
$(row_id).css('background-color');
$(row_id).addClass('green');
});
}
只需添加行$(row_id).css('background-color'); 似乎什么都不做,就会使过渡效果起作用。这是一个演示:
http://so-37035335-b.dev.zuma-design.com/
我对此感到目瞪口呆。为什么这行得通?是只是增加了一点延迟,还是 jQuery 获取 css 属性对新添加元素的状态有重大影响?
【问题讨论】:
-
我最近在 jquery 文档上阅读了一些与类似内容相关的内容。文档建议用 0 ms 包装你对 settimeout 的调用。试试看,它的运行延迟是 0 毫秒吗?如果是这样,那么只需 google jquery docs for settimeout。有一个解释。
-
@Uzbekjon - 0ms 不起作用。刚刚尝试了一些测试,Chrome 似乎可以使用 2ms,firefox 需要 5ms。
-
我建议你使用
requestAnimationFrame而不是setTimeout。您可以为旧版浏览器填充 polyfill。 developer.mozilla.org/en-US/docs/Web/API/window/… -
@GökhanKurt - 我在这里没有使用
setTimeout作为任何类型的解决方案 - 只是为了演示这个问题。 -
@billynoah 这就是我将其写为评论的原因。如果我的意思是回答你的问题,我会把它写成答案。
标签: javascript jquery html css