2013-09-23 4 views
0

this tutorial на основе (и здесь живет demo)querySelectorAll функции поживет альтернативу

Попытки iachieve этой функциональности в моем проекте. Как вы видите,

<button class="md-trigger" data-modal="modal-16">Blur</button> 

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

Поэтому необходимо внести некоторые изменения на modalEffects.js (размещен код ниже).

Но не может понять, что нужно изменить?

var ModalEffects = (function() { 

    function init() { 

     var overlay = document.querySelector('.md-overlay'); 

     [].slice.call(document.querySelectorAll('.md-trigger')).forEach(function (el, i) { 

      var modal = document.querySelector('#' + el.getAttribute('data-modal')), 
       close = modal.querySelector('.md-close'); 

      function removeModal(hasPerspective) { 
       classie.remove(modal, 'md-show'); 

       if (hasPerspective) { 
        classie.remove(document.documentElement, 'md-perspective'); 
       } 
      } 

      function removeModalHandler() { 
       removeModal(classie.has(el, 'md-setperspective')); 
      } 

      el.addEventListener('click', function (ev) { 
       classie.add(modal, 'md-show'); 
       overlay.removeEventListener('click', removeModalHandler); 
       overlay.addEventListener('click', removeModalHandler); 

       if (classie.has(el, 'md-setperspective')) { 
        setTimeout(function() { 
         classie.add(document.documentElement, 'md-perspective'); 
        }, 25); 
       } 
      }); 

      close.addEventListener('click', function (ev) { 
       ev.stopPropagation(); 
       removeModalHandler(); 
      }); 

     }); 

    } 

    init(); 

})(); 
+0

'querySelectorAll' не имеет живой альтернативы, как и любой другой метод, который получает элементы DOM, он получает все, что есть, а не то, что может быть в будущем? Делегирование событий - это еще что-то! – adeneo

+0

@adeneo, что вы предлагаете? – heron

+0

Зависит от того, что вы действительно пытаетесь сделать? – adeneo

ответ

3

Просто позвольте задержать этап инициализации.

Изменить init(); для return init;

Тогда, когда DOM готов и содержание было загружено, вызовите ModalEffects();

Однако лучшим способом было бы использовать делегирование событий вместо этого, который в основном реагирует на события на контейнере (например, document.body) вместо каждый отдельный элемент. Это не только уменьшает количество обработчиков событий, но также автоматически учитывает изменения DOM.

+0

Я согласен с вами, эта сложная функция создана для всех кнопок на странице. Но я работаю только с одним типом кнопки. Поэтому я думаю, что должен быть способ упростить этот код. Можете ли вы помочь мне упростить его? – heron

+0

@heron, Не сейчас, но как только у меня хватит времени. Тем временем вы всегда можете попробовать это сделать http://stackoverflow.com/questions/1687296/what-is-dom-event-delegation Я верю в вас;) – plalx

+0

Я изменил это http://pastebin.com/ HB6hWJgK. теперь это не работает. Что я делаю не так? – heron

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