Лучше Ответ
Регулярного ол»обратный вызов не будет работать, так как CSS переходы являются асинхронными.
Старый ответ, используемый jQuery, обещает. Однако есть событие под названием transitionend
, которое вы можете добавить в свою форму. В принципе, когда переход CSS заканчивается, он испускает только transitionend
. Затем форма может называть getPos
, когда переход завершается. Это намного лучше, чем использование обещаний jQuery.
Newest jsfiddle:
var form = $('form');
console.log("The old left pos is:" + form.position().left);
function scaleUp() {
var pageWidth = $('.container').width();
var formWidth = form.width();
var scaleX = pageWidth * 0.8/formWidth;
var scaleamount;
if (pageWidth * 0.8 < 1200) {
scaleamount = 1.2;
} else if (pageWidth * 0.8 < 1900) {
scaleamount = 1.8;
} else {
scaleamount = 2;
}
var scaleY = scaleX/scaleamount;
form.attr('style', 'transform:scale(' + scaleX + ',' + scaleY + ');transition : transform 1.5s ease;');
}
form.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function(e) {
if(e.originalEvent.propertyName.toLowerCase() === 'transform') {
return getPos();
}
});
function getPos() {
var formTop = form.position().top;
var formLeft = form.position().left;
console.log("The new left pos is:" + form.position().left);
}
$('button').on('click', scaleUp);
Пожилым Ответ
Смотрите это jsfiddle. Он использует JQuery обещания:
var form = $('form');
console.log("The old left pos is:" + form.position().left);
function scaleUp() {
var deferred = $.Deferred();
var pageWidth = $('.container').width();
var formWidth = form.width();
var scaleX = pageWidth * 0.8/formWidth;
var scaleamount;
if (pageWidth * 0.8 < 1200) {
scaleamount = 1.2;
} else if (pageWidth * 0.8 < 1900) {
scaleamount = 1.8;
} else {
scaleamount = 2;
}
var scaleY = scaleX/scaleamount;
form.attr('style', 'transform:scale(' + scaleX + ',' + scaleY + ');transition : transform 1.5s ease;');
setTimeout(function() {
deferred.resolve();
}, 1600); // needs to wait for the animation to complete
return deferred.promise()
}
function getPos() {
var formTop = form.position().top;
var formLeft = form.position().left;
console.log("The new left pos is:" + form.position().left);
}
$('button').on('click', function() {
$.when(scaleUp()).then(getPos);
});
анимация происходит асинхронно, так что в setTimeout
, устраняющее обещание немного после анимации закончит происходит. Как только обещание разрешится, $.when
звонит getPos
. Это хакеры, но из-за асинхронного характера изменения атрибута style
и предоставления ему анимации CSS.
Другими словами, поскольку анимация является асинхронной, вам нужно дождаться ее завершения, прежде чем вы сможете вызвать обратный вызов и получить новую позицию. Обещания ждут завершения асинхронного события, а затем вызовет обратный вызов.
Если вы не знакомы с обещаниями, я бы предложил прочитать jQuery docs по этой теме, а также выполнить поиск «javascript-обещаний» в Google. Это совсем другой предмет.
Оригинала ответ
Вы переходящие в вызываемой версии функции как обратный вызов (и в scaleUp
вы никогда не использовали обратный вызов), поэтому он не видит обратный вызова в качестве опорной функции.
ли это:
function scaleUp(callback) {
// all your code... then
return callback(); // or just callback() without the return
}
$('.button').on('click', scaleUp.bind(null, getPos));
Если вы передаете в getPos()
, вы передаете в значении возврата из getPos
, а не сама функция отсчета. Кстати, вышеупомянутый обработчик кликов сокращен. Вы также можете:
$('button').on('click', function() {
scaleUp(getPos);
});
Вы не можете использовать функцию обратного вызова и возврата ближе в той же функции и ожидать, что она вести себя должным образом. В этой ситуации вы можете использовать возврат ближе, обратный вызов здесь не требуется, так как стандартный на странице js не является асинхронным. Если вы хотите использовать обратный вызов, вы замените «return true»; с «обратным вызовом (true)». И вызывается scaleUp с "scaleUp (getPost)". В вашем обратном вызове не требуется аргумент или скобки, потому что это подразумевается. – jonode