ScrollTop прокручивается в неправильное место после detach() insertAfter()

У меня есть код jQuery для перемещения div в более позднее место в потоке, когда размер окна меньше 767 пикселей. Все работает нормально.

У меня также есть некоторый код jQuery для прокрутки основной навигации вниз к основному контенту после загрузки страницы, опять же, если устройство ‹ 767px.

Функция scrollTop работает нормально. Функция detach() + insertAfter() работает нормально.

Но

На одной странице, на которую влияет код insertAfter(), код scrollTop прокручивается в неправильную область. Похоже, он прокручивается туда, где была якорь до того, как элементы были перемещены.

Любые идеи? Страница активна по адресу http://northqueensviewhomes.com/community (помните, что вам придется сжать окно браузера до увидеть любое из этих действий, и вам придется перезагрузить свое маленькое окно, чтобы увидеть функцию прокрутки).

Вот две функции и их вызовы…

function rearrangeHelpfulLinks() {
   var $theLinks = $('#quicklinks.rc.well');
   if (($theLinks).length) {
      if ($(window).width() <= 767) {
         $theLinks.detach().insertAfter('.core-copy');
      } else {
         $theLinks.detach().insertAfter('#main-nav');
      }
   }
}


function scrollOnSmallScreen() {
   if ($(window).width() <= 767) {
      $('html, body').animate({
         scrollTop: ($('#main').offset().top - 13)
      }, 3210, 'easeInOutExpo');
   }
}

и процедура insertAfter() вызывается при изменении размера окна…

$(window).resize(function() {
   rearrangeHelpfulLinks();
});

… и функция прокрутки вызывается при загрузке страницы (для полноты картины просто…)

   scrollOnSmallScreen();

Не уверен, что вам нужно что-то еще, чтобы помочь мне (опять же!), но я хотел бы получить прокрутку в нужное место, то есть просто к якорю, #main.

Вся помощь приветствуется.


person dashard    schedule 27.04.2013    source источник
comment
попробуйте вызвать scrollOnSmallScreen();, используя setTimeout(scrollOnSmallScreen,0);, также хорошо добавить где-нибудь $(window).scroll(function() {$('html body').stop();});, потому что очень раздражает то, что я должен ждать окончания анимации, если я хочу прокрутить.   -  person zb'    schedule 28.04.2013
comment
setTimeout сработал отлично, спасибо. Не знаю, почему я не подумал об этом. Что касается остановки (), я не уверен, где ее вызывать. Везде, где я его помещаю, он убивает автопрокрутку.   -  person dashard    schedule 29.04.2013
comment
вы должны поместить $(window).scroll(function() {$('html body').stop();}); в сценарий, который запускается после загрузки jquery (в основную область).   -  person zb'    schedule 29.04.2013
comment
в соответствии с этим: stackoverflow.com/questions/15435338/ chages scrollTop запускает события при прокрутке :( и решение не сработало для меня...   -  person zb'    schedule 29.04.2013
comment
jsfiddle.net/oceog/6a2F2 вот как я достиг цели :)   -  person zb'    schedule 29.04.2013


Ответы (1)


Позвоните scrollOnSmallScreen();, используя

setTimeout(scrollOnSmallScreen,0);

он запустит автопрокрутку после запуска вашего потока и потока изменения DOM.

person zb'    schedule 29.04.2013