Когда я нажимаю блок "aa", одновременно отображаются оба "aa" и "bb". Вызывает ли javascript функцию animate(), не блокирующую отдельные потоки? Или эта функция вводится несколько раз с тысячами обратных вызовов, которые используют вызовы функций блокирующего типа? Как я могу заставить анимацию() работать с элементами по одному, когда это необходимо (возможно, использование таймера может быть выполнено, но я должен всегда использовать таймер?)?
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>
<script>
function growbits(i,j) {
$(i).animate({ height: "500px" }); // looks working concurrently
$(j).animate({ width: "500px"}); // with this one
};
</script>
</head>
<body>
<p id="bb" style="background: #f00; height: 50px; width: 255px; margin: 10px;">asdasd</p>
<p id="aa" onclick="growbits(aa,bb);" style="background: #f00; height: 50px; width: 255px; margin: 10px;">
gfhjjjgfhgkjfhkjtkjyhtkjyhkhfukhgkudfgk
</p>
</body>
</html>
Ive нашел следующий код в файле min.js:
self.element.animate(
$.extend(style, top && left ? { top: top, left: left } : {}), {
duration: o.animateDuration,
easing: o.animateEasing,
step: function() {
var data = {
width: parseInt(self.element.css('width'), 10),
height: parseInt(self.element.css('height'), 10),
top: parseInt(self.element.css('top'), 10),
left: parseInt(self.element.css('left'), 10)
};
if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
// propagating resize, and updating values for each animation step
self._updateCache(data);
self._propagate("resize", event);
}
}
);
Из документации jQuery:
.animate( properties [, duration ] [, easing ] [, complete ] )
полный
Тип: Функция()
Функция для вызова после завершения анимации.
Так:
function growbits(i,j) {
$(i).animate({ height: "500px" }, {}, 400, function () {
$(j).animate({ width: "500px"});
});
};
Ответ Квентина работает, но в эти дни я бы предположил, что он может быть более чистым, используя версию опций:
.animate( properties, options )
Как таковой:
javascript function growbits(i,j) { $(i).animate({ height: "500px" }, { duration: 400, done: function() { $(j).animate({ width: "500px"}); } }); };
(done
может быть заменено на (старая опция) complete
или always
, always
, done
, и fail
- это популярные в настоящее время события Promise)
EDIT: Чтобы уточнить, причина, по которой я предлагаю это, втрое:
1) Вам не нужно предоставлять атрибуты, которые не имеют для вас значения (в этом случае, ослабление),
2) Если вы решите, что другие атрибуты имеют значение, они часто тривиальны, чтобы добавить,
3) (Самое главное), когда вы редактируете код позже, вы точно поймете, в чем состоит вложенная функция, не задумываясь об этом.
animate
. Вы можете видеть, что это метод объекта jQuery. Проверьте исходный код jQuery.