Я думаю, что ваша проблема в том, что scrollTo
использует animate
:
// From the plugin's source
function animate( callback ){
$elem.animate( attr, duration, settings.easing, callback && function(){
callback.call(this, target, settings);
});
};
И animate
использует таймер для выполненияанимация.В результате .scrollTo
вернется до завершения прокрутки, и вы перепривязаете обработчик прокрутки, пока scrollTo
все еще прокручивает.Отсюда и события, когда вы их не ожидаете.
Простое решение - использовать флаг, чтобы сообщить makeVisibleWhatMust
, что scrollTo
прокручивается, и использовать обратный вызов scrollTo
, чтобы сбросить флаг, когдаготово, что-то вроде этого:
function makeVisibleWhatMust() {
// Ignore the event if we're doing the scrolling.
if(makeVisibleWhatMust.isScrolling)
return;
$('#testContainer').text( $('#testContainer').text() + 'called\n');
$('table.scrollTable').each(function() {
var table = this;
$($('tr.alwaysVisible', table).get().reverse()).each(function() {
$(this).insertAfter( $('tr:in-viewport:not(.alwaysVisible)', table)[0] );
});
makeVisibleWhatMust.isScrolling = true;
$(window).scrollTo($('tr.alwaysVisible')[0], {
onAfter: function() { makeVisibleWhatMust.isScrolling = false; }
});
}
);
}
makeVisibleWhatMust.isScrolling = false;
И вот живая версия, которая, кажется, работает: http://jsfiddle.net/ambiguous/ZEx6M/1/