У меня есть функция, которая загружает html в таблицу с jQuery и затем добавляет класс в одну из строк с обратным вызовом. Эта функция запускается различными событиями, управляемыми пользовательским интерфейсом на странице. У меня также есть правило перехода 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/
В приведенном выше примере ссылки jQuery версии 2.2.3 из cdn, фактическая страница, о которой идет речь, использует версию 1.7.1. Такое же поведение наблюдается в обеих версиях.
UPDATE:
После рассмотрения некоторых комментариев и ответов, предложенных ниже, я наткнулся на что-то более запутанное. Пользователь @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 каким-то образом существенно влияет на состояние вновь добавленного элемента?