Подгружать содержимое во время прокрутки

Для начала посвящу в суть задачи. Нужно при прокрутке подгружать следующие новости, Но при этом и добавлять новые подгруженные пункты в блок справа. Пункты служат как якори. Для обычной подгрузки контента есть модуль Views Infinite Scroll

Ну для начала напишем функцию, которая нам будет возвращать необходимый контент.

Регистрируем путь в hook_menu():

  $items['news/next'] = array(
    'page callback' => 'next_news',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
 
Пишем функцию, которая срабатывает по нашему адресу:

function next_news(){
  $nid = (int)$_GET['id']; // Это nid, который мы будет передавать в функцию
 
  $nodes = news_load($nid); // Тут мы грузим ноды
  if(!empty($nodes)) {
    $node_o = node_load_multiple($nodes);
    /* Два списка, которые мы будем вставлять в разные места */
    $news_list = node_view_multiple($node_o, 'titles'); 
    $news = node_view_multiple($node_o, 'teaser');
   /* Возвращаем всё в формате JSON */
    return drupal_json_output(array('news_list' => render($news_list), 
                                                  'news' => render($news), 
                                                  'success' => true));
  }
  else {
    /* Или возвращаем не всё в формате JSON  */
    return drupal_json_output(array('success' => false));
  }
}
 
Ну и функция загрузки наших нод:

function news_load($nid){
  $query = db_select('node', 'n');
  $query->fields('n', array('nid'))
            ->condition('n.type', 'news')
            ->condition('n.status', 1)
            ->condition('n.nid', $nid, '<') // И вот фильтр по nid. То что ниже нашего nid - отсекаем
            ->orderBy('n.created', 'DESC')->range(0, 5); // Ну мне нужно было по 5 штук вытягивать
  $result = $query->execute()->fetchCol();
  return $result;
}
И остаётся сам скрипт:

(function ($) {
  $(document).ready(function(){
 
  var busy = false;
  var url  = $('#wideNewsBlock').data('url');
 
  $(window).scroll(function() {
    if ($(window).scrollTop() <= $('#wideNewsBlock').offset().top) { // Это махинации с класами при прокрутке.
      $('a.news-menu-item').removeClass('active');
      var active   = $('.wideNews:first');
      var active_a = $('a.news-menu-item[data-id='+active.data('id')+']')
      active_a.addClass('active');
    }
    if($(window).scrollTop() + $(window).height() - $('#wideNewsBlock').offset().top 
       + 40 > $('#wideNewsBlock').height() && !busy) { 
    // как только до листали до нужной метки - грузим новое. Метку высчитать можно любую свою.
      busy = true;
      $('.loading-bar').html('Загрузка новости');
      setTimeout(function() {
        getData(url);
      }, 700);
    }
  });
 
  function getData(url) {
    var last_news_id = $('.wideNews').last().data('id');
    $.ajax({
      url: url,
      type: 'GET',
      contentType: 'application/x-www-form-urlencoded',
      dataType: 'JSON',
      data: 'id='+last_news_id,
      success: function(data) {
        if (data.success) {
          $('ul.newsBody a').removeClass('active');
          $('ul.newsBody').append(data.news_list); // Добавляем список ссылок справа.
          $('#wideNewsBlock').append(data.news); // Это добаляем новые ноды
          $('.loading-bar').html('Следующая новость');
          busy = false;
        } else {
          $('.loading-bar').html('Это все новости');
          busy = true;
        }
      },
      error: function() {
        $('.loading-bar').html('Невозможно загрузить новости');
        busy = false;
      }
    });
  }
 
 //Это просто функция скрола по клику ссылки справа.
  $('.newsBody').on('click', 'a.news-menu-item', function(e){
    var self = $(this);
    var wideNews = $('.wideNews[data-id='+self.data('id')+']');
    if (wideNews) {
      $('a.news-menu-item').removeClass('active');
      self.addClass('active');
      $.scrollTo(wideNews, 500);
      e.preventDefault();
    }
    return false;
  });
 
  });
})(jQuery);
Записал, я это больше для себя. Поэтому что-то может быть не понятно. Но в качестве идеи можно использовать.
И нужно не забыть подключить сам скрипт и ScrollTop.js