Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
12 / 17 / 2
Регистрация: 02.11.2015
Сообщений: 222
1

Как дождаться выполнения события (анимации), чтобы запустить следующее

10.09.2018, 16:51. Показов 1277. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Столкнулся с такой проблемой. Делаю скрипт к html-шаблону. Есть фрагмент в коде <div id="target" ...>. Необходимо сделать плавный скроллинг к нему по клику на ссылку <a href="#target">.

Проблема в том, что на этом клике висит ещё одно событие, которое скрывает некоторые элементы со страницы. Из-за этого положение координат целевого элемента смещается.

Каким образом добавить мой скрипт в очередь выполнения функций(событий), чтобы получить координаты для скроллинга после того как ранее установленные скрипты закончат скрытие элементов?

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!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>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2018, 16:51
Ответы с готовыми решениями:

Как в jquery дождаться анимации события, прежде чем начнет отрабатываться новое по другому событию?
Добрый день, Есть 2 div внутри обертки: &lt;div class=&quot;main-menu&quot;&gt; &lt;div&gt; &lt;span...

Promise, как дождаться выполнения
Здравствуйте. Есть код, у меня вместо setTimeout идет запись в indexedDB, но это не должно менять...

Как дождаться выполнения асинхронной функции?
Привет, Есть проэкт Node.js+angular+typescript. И у меня есть функция: ...

Дождаться завершения Потока и выполнить следующее
Всем доброе время суток! не могу найти решения как дождаться завершения потока и выполнить...

6
Эксперт JS
2034 / 1093 / 408
Регистрация: 29.04.2016
Сообщений: 2,612
10.09.2018, 18:21 2
Eskander88,
Не гарантирую, но попробуйте
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!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 - $('#hideme').height()}, 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>
0
12 / 17 / 2
Регистрация: 02.11.2015
Сообщений: 222
10.09.2018, 19:40  [ТС] 3
zlojnaxa, спасибо за вариант.. но суть в том, что на сайте идёт большая лента.

В основе функционала ленты аккордеон (спойлер) из bootstrap. Несколько всяких секций с меню и чекбоксами для заполнения полей.

Поймать высоту целевого элемента (вообщем то это заголовок секции) по вертикали можно когда отработают скрипты основного фреймворка.

Переходы между сворачивающимися секциями может быть как сверху-вниз, так и обратно, - в том случае, если пользователь выбрал неправильные настройки и ajax вернул команду на открытие определённой им секциии.

Приведённый выше пример, это примерно приведённый код, который отражает генеральный проблемный узел.

Пока, что удалось сделать велосипед такого плана:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   <script type="text/javascript">
   /* Этот фрагмент нельзя менять */
   $(function(){
     $('a[href^="#"]').click( function() {
      $('#hideme').hide(1000);
     });
   });
   /* Далее всё что угодно */
   
   $(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();
     });
   });
    </script>
но так то предстоит ещё добавление функций, то данный "костыль" быстро себя исчерпает
0
105 / 93 / 50
Регистрация: 17.09.2015
Сообщений: 611
11.09.2018, 08:55 4
Eskander88,
ну как-то так?
Javascript
1
2
3
4
5
6
7
8
9
10
11
$('a[href^="#"]').on('click', function(){
  var el = $(this);
  $("#hideme").hide(1000, function(){
    scrollToElement(el);
  });
});
 
function scrollToElement(el) {
    console.log(el);
    console.log("тут уже завершились другие скрипты");
}
0
12 / 17 / 2
Регистрация: 02.11.2015
Сообщений: 222
11.09.2018, 09:20  [ТС] 5
Javascript
1
2
3
4
5
   $(function(){
     $('a[href^="#"]').click( function() {
      $('#hideme').hide(1000);
     });
   });
к данному фрагменту доступа нет.. это фрагмент из библиотеки фреймворка, её трогать нельзя.. т.к на неё подвязаны другие функции сайта, это может привести к проблеме в скриптах других разработчиков...

можно только дописать свой скрипт..

Получается, что нет никаких способов просмотреть очередь событий в JavaScript? Если при создании алгоритма очередь событий не задали явно, то они так и будут выполняться пачкой одновременно?
0
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
11.09.2018, 10:51 6
Eskander88, попробуйте promise()
Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Этот фрагмент нельзя менять */
$(function() {
  $('a[href^="#"]').click(function() {
    $('#hideme').hide(1000);
  });
});
 
/* Далее всё что угодно */
$(function() {
  $('a[href^="#"]').click(function() {
    $('#hideme').promise().done(function() {
      var sc = $(this).attr("href");
      var dn = $(sc).offset().top;
      // sc - в переменную заносим информацию о том, к какому блоку надо перейти
      // dn - определяем положение блока на странице
 
      alert('Положение блока на странице по вертикали ' + dn + ' (Ошибочное)');
 
      $('html, body').animate({
        scrollTop: dn
      }, 1000);
      // 1000 скорость перехода в миллисекундах 
 
      $('a').remove();
    })
  });
});
1
12 / 17 / 2
Регистрация: 02.11.2015
Сообщений: 222
11.09.2018, 11:21  [ТС] 7
j2FunOnly, это как раз то направление решения и ход мыслей, которые необходимы!

Правда в предложенном варианте есть ошибка: чтобы получить правильное « var sc = $(this).attr("href"); », this надо записать раньше, т.е
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$(function(){
  $('a[href^="#"]').click( function() {
  
    var my_target = $(this); // получаем this прежде чем войти в функ
    
    $('#hideme').promise().done(function(){
      /* var sc = $(this).attr("href"); */
      var sc = $(my_target).attr("href");
      var dn = $(sc).offset().top;
      // sc - в переменную заносим информацию о том, к какому блоку надо перейти
      // dn - определяем положение блока на странице
 
      alert('Положение блока на странице по вертикали '+dn+' (Верное)');
     
      $('html, body').animate({scrollTop: dn}, 1000);
      // 1000 скорость перехода в миллисекундах 
 
      // $('a').remove(); всё таки лишнее
    });
    
  });
});
И обнаружилось, что почему-то так не работает плавный скролл. Хотя к якорю прыгает правильно. Разбираюсь почему. В изначальном демо-коде плавно скроллит, но не туда (неправильно по высоте).
0
11.09.2018, 11:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2018, 11:21
Помогаю со студенческими работами здесь

Как дождаться выполнения скрипта от invokescript в webbrowser
Т.е. дождаться выполнения скрипта вызванного invokescript! Вот мой код: ...

Как стартовать несколько потоков и дождаться их выполнения
привет есть 4 метода хочу стартовать их и дождаться когда они все закончат подскажите как...

Как в цикле дождаться выполнения функции(клика)?
Добрый день. Имеется скрипт, который запрашивает данные из php, выводит на html страницу 3...

Как в одном обработчике события запустить другой обработчик события
Есть список listView1, который заполняется из массива PeopleListprivate void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru