2014-08-28 4 views
0

У меня есть несколько панелей, расположенных вне экрана с свойством translateY. Эти панели имеют разную высоту. Они обозначены эти идентификаторы:jQuery цепь нескольких пользовательских функций для запуска нескольких панелей

Panels: 
    #panel-search // search form 
    #panel-login // login form 
    #panel-register // registration form 
    #panel-navigation // navigation panel 

Вся видимая сама страница является:

#page 

И каждая панель запускается по своей ссылке:

Triggers: 
    .btn-search // trigger search panel 
    .btn-login // trigger login panel 
    .btn-register // trigger registration panel 
    .btn-nav // trigger navigation (this button shows only on mobile) 

Также я использую data-target атрибут oon триггеров, который равен идентификатору целевой панели.

Что мне нужно:

  1. Нажатие любой .btn-* вызовет соответствующую панель. Панель слайдов сверху вниз, слайды на панели страниц одновременно. Довольно просто. Готово.
  2. При запуске любой панели он должен проверить, есть ли открытая панель (эта или любая другая). Если это так, выключите эту панель и тело страницы, и только после этого - покажите новую панель (и снова переместите тело в новую позицию). Вот где я застрял.

С помощью @GauravBarar я переписал код, и теперь все работает, кроме цепочки. Когда есть какая-либо открытая панель - я закрываю ее (и перемещаю страницу вверх), а затем открываю запрошенную панель. Но это происходит одновременно, одновременно. И мне нужно, чтобы открыть новую панель только после того, как оригинал закрыт. Пробовал добавить setTimeout() (см. Комментарий в коде) - #page перемещается вверх/вниз с этим таймаутом просто отлично, а панель - нет.

Вот мой код до сих пор:

/** 
* Get real height of requested panel and prepare css transform property value. 
*/ 
function getTransformProperty(panel) { 
    panelHeight = $('#'+panel).outerHeight(); 
    property = 'translateY(' + panelHeight + 'px)'; 
    return property; 
} 

/** 
* Move #page down by requested panel's height 
*/ 
function setTransformProperty(property) { 
    $('#page').css({ 
     '-webkit-transform': property, 
     '-moz-transform': property, 
     '-ms-transform': property, 
     '-o-transform': property, 
     'transform': property 
    }); 
    // Go to top (some triggers are in site footer, so we need this) 
    window.scrollTo(0, 0); 
} 

// Trigger panels 
$('[class*=trigger-]').click(function(){ 

    // Get target element to trigger 
    var target = $(this).attr('data-target'); 

    // Check if current target is already opened and close it. 
    if($('#'+target).hasClass('is-visible-top')) { 

     $('#'+target).removeClass('is-visible-top'); // move up requested panel 
     setTransformProperty('translateY(0)'); // move up page 

     return false; // exit 

    } 

    // Check all panels in a loop. If any is opened - close it. 
    $('[id*=panel-]').each(function(){ 

     // Get current panel's ID 
     curPanelID = $(this).attr('id'); 

     if($('#'+curPanelID).hasClass('is-visible-top') && curPanelID !== target) { 

      // A panel is opened. 

      // Close it. 
      $('#'+curPanelID).removeClass('is-visible-top'); // move up currently open panel 
      setTransformProperty('translateY(0)'); // move up page 

      // Open requested panel (HERE WE NEED A TIMEOUT) 
      $('#'+target).addClass('is-visible-top'); // move down requested panel 
      setTransformProperty(getTransformProperty(target)); // move down page by new height 

      /* HERE'S TIMEOUT WHICH I TRIED BUT FAILED. 
      setTimeout(function(){ 
       $('#'+target).addClass('is-visible-top'); 
       setTransformProperty(getTransformProperty(target)); 
      },300); 
      */ 

      // exit each loop 
      return false; 

     } else { 

      // No panel is opened. Just open requested without timeout. 

      setTransformProperty(getTransformProperty(target)); // move down page 
      $('#'+target).addClass('is-visible-top'); // move down requested panel 

     } 

    }); 

}); 

Любая помощь очень ценится.

+0

Вы можете использовать функцию обратного вызова. Ссылка на [аналогичную проблему] (http://stackoverflow.com/questions/21692705/how-to-execute-a-javascript-jquery-function-only-after-the-completion-of-another) – Nomeaning25

ответ

2

Вы можете попробовать использовать JQuery символы, как следующее:

$('[id*=panel-]').each(function(){ 
    //check if anyone is on or off 
}) 
+0

Спасибо за подсказку , никогда не думал использовать этот селектор. Переделывая все логики, использование вашей идеи делает все короче. –

+0

Thanx, все работает отлично, за исключением цепочки. Попробовал setTimeout(), чтобы имитировать это - не работает должным образом. Не могли бы вы посмотреть, что мне не хватает? Я обновил код и прокомментировал каждый шаг. –

+0

Код прекрасно отлаживает код, чтобы проверить, не потеряется ли значение цели, а также проверить, работают ли функции getTransformProperty, setTransformProperty. Или вы можете дать мне полный код, и я проверю его для вас. –

1

Для проверки, если Pannel включен или выключен вы можете использовать классы. Добавьте класс, например «PannelOn», чтобы открыть панель, когда вы ее открываете. И после того, как вы закроете, удалите этот класс.

Затем, когда вы открываете панель, перед ее открытием проверьте, существует ли какой-либо элемент с классом «PannelOn» и закройте его (вызовите функции doTransform).

+0

У меня уже есть и используется класс 'is-visible-top'. Попытка создать эту логику. Спасибо. –

Смежные вопросы