Как задать порядок выполнения событий (анимаций) 
		
		
		
		Доброго времени суток! 
	Столкнулся с такой проблемой. Делаю скрипт к html-шаблону. Есть фрагмент в коде <div id="target" ...>. Необходимо сделать плавный скроллинг к нему по клику на ссылку <a href="#target">. Проблема в том, что на этом клике висит ещё одно событие, которое скрывает некоторые элементы со страницы. Из-за этого положение координат целевого элемента смещается. Каким образом добавить мой скрипт в очередь выполнения функций(событий), чтобы получить координаты для скроллинга после того как ранее установленные скрипты закончат скрытие элементов? 
<!DOCTYPE HTML>
<html lang="ru-RU">
<head><title></title><meta charset="UTF-8"></head>
<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script type="text/javascript">
/* Этот фрагмент нельзя менять */
$(function(){
  $('a[href^="#"]').click( function() {
   $('#hideme').hide(1000);
  });
});
/* Далее всё что угодно */
$(function(){
  $('a[href^="#"]').click( function() {
    var sc = $(this).attr("href");
    var dn = $(sc).offset().top;
    // sc - в переменную заносим информацию о том, к какому блоку надо перейти
    // dn - определяем положение блока на странице
    alert('Положение блока на странице по вертикали '+dn+' (Ошибочное)');
   
    $('html, body').animate({scrollTop: dn}, 1000);
    // 1000 скорость перехода в миллисекундах 
    
    $('a').remove();
  });
});
</script>
<a href="#target">Перейти к фрагменту</a>
<div id="hideme" style="display:block;width: 100%; height: 500px; background: green;"></div>
<div id="other" style="display:block;width: 100%; height: 1200px; background: yellow;"></div>
<div id="target" style="display:block;width: 100%; height: 300px; background: red;"></div>
<div id="other"  style="display:block;width: 100%; height: 700px; background: blue;"></div>
<div id="other"  style="display:block;width: 100%; height: 700px; background: magenta;"></div>
</body>
</html>
 | 
	
		
 RedPython, 
	опишите в одном обработчике, поставив в очередь анимации или hide(1000, function() { анимация прокрутки})  | 
	
		
 laimas, при этом варианте прийдётся править фрагмент в большой js-библиотеке, которую писал сторонний разработчик. 
	Из костылей можно использовать setTimeout, но на реальной странице выглядит мягко говоря коряво... 
$(function(){
     $('a[href^="#"]').click( function() {
       var sc = $(this).attr("href");
       setTimeout(function ()
       {
       
       var dn = $(sc).offset().top;
       // sc - в переменную заносим информацию о том, к какому блоку надо перейти
       // dn - определяем положение блока на странице
      
       $('html, body').animate({scrollTop: dn}, 1000);
       // 1000 скорость перехода в миллисекундах 
       }, 1000);
       
       $('a').remove();
     });
   });
 | 
	
		
 RedPython, 
	а чего там править, вы же нашли эти два фрагмента, сложно перенести один в другой?  | 
	
		
 плавный переход к блоку 
		
		
		
		RedPython, 
	
<!DOCTYPE HTML>
<html lang="ru-RU">
<head><title></title><meta charset="UTF-8"></head>
<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script type="text/javascript">
/* Этот фрагмент нельзя менять */
$(function(){
  $('a[href^="#"]').click( function(event) {
   event.preventDefault();
   var id = this.hash;
   $(this).remove();
   $('#hideme').slideUp(1000, function() {
   var dn = $(id).offset().top;
   $('html, body').animate({scrollTop: dn}, 1000);
});
  });
});
</script>
<a href="#target">Перейти к фрагменту</a>
<div id="hideme" style="display:block;width: 100%; height: 500px; background: green;"></div>
<div id="other" style="display:block;width: 100%; height: 1200px; background: yellow;"></div>
<div id="target" style="display:block;width: 100%; height: 300px; background: red;"></div>
<div id="other"  style="display:block;width: 100%; height: 700px; background: blue;"></div>
<div id="other"  style="display:block;width: 100%; height: 700px; background: magenta;"></div>
</body>
</html>
 | 
	
		
 "Нельзя менять" - это крайне нездоровая хрень. 
	Из костылей можно сделать так: 
/* Далее всё что угодно */
$(function(){
  $('a[href^="#"]')
    .off('click') // отменяем поставленные ранее кем-то обработчики
    .click(function(){ // ставим заново общий
      var sc = $(this).attr("href");
      $('#hideme').hide(1000, function(){
        var dn = $(sc).offset().top;
        // sc - в переменную заносим информацию о том, к какому блоку надо перейти
        // dn - определяем положение блока на странице
        alert('Положение блока на странице по вертикали '+dn+' (Ошибочное)');
        $('html, body').animate({scrollTop: dn}, 1000);
        // 1000 скорость перехода в миллисекундах
        $('a').remove(); // удаляем все ссылки на страницые, это точно нужно?
      });
    });
});
Второй вариант - поменять метод hide jquery добавив какую-нить отсебятину, например: 
$.fn.hide = function(hide){
  return function(speed, callback) {
    this.trigger('hide');
    return hide.apply(this, arguments);
  }
}($.fn.hide);
 и соответственно на on('hide') повесить всё нужное. | 
	
		
 Цитата: 
	
  | 
	
		
 Цитата: 
	
 ... возможно так 
$(function(){
   var id;
   $('#hideme').on('hidden.bs.collapse', function() {
   var dn = $(id).offset().top;
   id && $('html, body').animate({scrollTop: dn}, 1000);
   });
  $('a[href^="#"]').click( function(event) {
   var id = this.hash;
  });
});
 | 
	
		
 Цитата: 
	
 Там на самом деле большая лента из секций, которая представляют собой спойлеры. Разные скрипты, которые обрабатывают в каждой раскрытой секции чекбоксы и прочие меню. После заполнения пользователем секции отрабатывают скрипты, которые проводят валидацию и перенаправляют в нужную секцию (с точки зрения приложения). Вдобавок ко всему ещё внутри секции попадает контент из ajax. Поэтому знать размер секции нельзя знать наверняка. Дело в том, что из-за того что секции раскрываются то там то здесь (ну на самом деле только предыдущая или следующая). То пользователя сильно напрягает, почему он вдруг застрял с заполнением анкеты. Код в теме, чисто демонстрационный. Главный вопрос в том, как управлять очередью выполнения анимации событий. За лазанье в код фреймворков по ушам надают. Так как регламент работ запрещает менять стандартную логику библиотек. Потому, что это приведёт к запаркам у других разработчиков.  | 
| Часовой пояс GMT +3, время: 02:39. |