2015-09-22 3 views
0

Я пытаюсь запустить скрипт на странице cms в Magneto. Консоль реагирует с:Modernizr.prefixed (не является функцией) в Magento

Uncaught TypeError: Modernizr.prefixed is not a function

Как ни странно, этот скрипт отлично работает в нормальных условиях HTML ...

Проблема была бы эта линия:

animEndEventName = animEndEventNames[ Modernizr.prefixed('animation') ], 

Сценарий (из codrops):

(function() { 
var support = { animations : Modernizr.cssanimations }, 
     animEndEventNames = { 'WebkitAnimation' : 'webkitAnimationEnd', 'OAnimation' : 'oAnimationEnd', 'msAnimation' : 'MSAnimationEnd', 'animation' : 'animationend' }, 
     animEndEventName = animEndEventNames[ Modernizr.prefixed('animation') ], 
     onEndAnimation = function(el, callback) { 
      var onEndCallbackFn = function(ev) { 
       if(support.animations) { 
        if(ev.target != this) return; 
        this.removeEventListener(animEndEventName, onEndCallbackFn); 
       } 
       if(callback && typeof callback === 'function') { callback.call(); } 
      }; 
      if(support.animations) { 
       el.addEventListener(animEndEventName, onEndCallbackFn); 
      } 
      else { 
       onEndCallbackFn(); 
      } 
     }; 

    var containers = [].slice.call(document.querySelectorAll('.container')), 
     containersCount = containers.length, 
     nav = document.querySelector('nav.thumb-nav'), 
     pageTriggers = [].slice.call(nav.children), 
     isAnimating = false, current = 0; 

    function init() { 
     resetScroll(); 
     // disable scrolling 
     window.addEventListener('scroll', noscroll); 
     // set current page trigger 
     classie.add(pageTriggers[ current ], 'thumb-nav__item--current'); 
     // set current container 
     classie.add(containers[ current ], 'container--current'); 
     // initialize events 
     initEvents(); 
    } 

    function initEvents() { 
     // slideshow navigation 
     pageTriggers.forEach(function(pageTrigger) { 
      pageTrigger.addEventListener('click', function(ev) { 
       ev.preventDefault(); 
       navigate(this); 
      }); 
     }); 

     // open each container's content area when clicking on the respective trigger button 
     containers.forEach(function(container) { 
      container.querySelector('button.trigger').addEventListener('click', function() { 
       toggleContent(container, this); 
      }); 
     }); 

     // keyboard navigation events 
     document.addEventListener('keydown', function(ev) { 
      var keyCode = ev.keyCode || ev.which, 
       isContainerOpen = containers[ current ].getAttribute('data-open') == 'open'; 

      switch (keyCode) { 
       // left key 
       case 37: 
        if(current > 0 && !isContainerOpen) { 
         navigate(pageTriggers[ current - 1 ]); 
        } 
        break; 
       // right key 
       case 39: 
        if(current < containersCount - 1 && !isContainerOpen) { 
         navigate(pageTriggers[ current + 1 ]); 
        } 
        break; 
      } 
     }); 
    } 

    function navigate(pageTrigger) { 
     var oldcurrent = current, 
      newcurrent = pageTriggers.indexOf(pageTrigger); 

     if(isAnimating || oldcurrent === newcurrent) return; 
     isAnimating = true; 

     // reset scroll 
     allowScroll(); 
     resetScroll(); 
     preventScroll(); 

     var currentPageTrigger = pageTriggers[ current ], 
      nextContainer = document.getElementById(pageTrigger.getAttribute('data-container')), 
      currentContainer = containers[ current ], 
      dir = newcurrent > oldcurrent ? 'left' : 'right'; 

     classie.remove(currentPageTrigger, 'thumb-nav__item--current'); 
     classie.add(pageTrigger, 'thumb-nav__item--current'); 

     // update current 
     current = newcurrent; 

     // add animation classes 
     classie.add(nextContainer, dir === 'left' ? 'container--animInRight' : 'container--animInLeft'); 
     classie.add(currentContainer, dir === 'left' ? 'container--animOutLeft' : 'container--animOutRight'); 

     onEndAnimation(currentContainer, function() { 
      // clear animation classes 
      classie.remove(currentContainer, dir === 'left' ? 'container--animOutLeft' : 'container--animOutRight'); 
      classie.remove(nextContainer, dir === 'left' ? 'container--animInRight' : 'container--animInLeft'); 

      // clear current class/set current class 
      classie.remove(currentContainer, 'container--current'); 
      classie.add(nextContainer, 'container--current'); 

      isAnimating = false; 
     }); 
    } 

    // show content section 
    function toggleContent(container, trigger) { 
     if(classie.has(container, 'container--open')) { 
      classie.remove(container, 'container--open'); 
      classie.remove(trigger, 'trigger--active'); 
      classie.remove(nav, 'thumb-nav--hide'); 
      container.setAttribute('data-open', ''); 
      preventScroll(); 
     } 
     else { 
      classie.add(container, 'container--open'); 
      classie.add(trigger, 'trigger--active'); 
      classie.add(nav, 'thumb-nav--hide'); 
      container.setAttribute('data-open', 'open'); 
      allowScroll(); 
     } 
    } 

    // scroll functions 
    function resetScroll() { document.body.scrollTop = document.documentElement.scrollTop = 0; } 
    function preventScroll() { window.addEventListener('scroll', noscroll); } 
    function allowScroll() { window.removeEventListener('scroll', noscroll); } 
    function noscroll() { 
     window.scrollTo(0, 0); 
    } 

    init(); 

    // For Demo purposes only (prevent jump on click) 
    [].slice.call(document.querySelectorAll('.items-wrap a')).forEach(function(el) { el.onclick = function() { return false; } }); 
})(); 

Я удалил все Magento js и css с страницы cms и заменил его на dem o файлы из Codrops. Он просто не будет работать ...

Что я делаю неправильно (не будучи нагишом с JS)

Заранее спасибо!

+0

Кажется, что сценарий Modernizr не загружен в том месте, где он запускает эту строку. – Starscream1984

+0

Был через это. Заменен встроенным модернизатором без эффектов. (в демограмме codrops он снял всю функцию) – MichelvM

+0

Чтобы заставить Modernizr быть загружен до того, как скрипт объединил их в один скрипт. К сожалению, это не было решением ... Любые участники этой проблемы? Пожалуйста? – MichelvM

ответ

0

Этот Javascript построить

(function() { 
    //... all your code, including Modernizr.prefixed() call ... 
})(); 

основном говорят

Hey Javascript, define an anonymous function, and then immediately call it

Я не знаком с тем, как Modernizr загружает себя в страницы, но, основываясь на то, что вы описываете, ваша страница возможно, настройте что-то подобное.

//... 
(function() { 
    //... all your code, including Modernizr.prefixed() call ... 
})(); 
//... 

<script src="[path to include that defines global Modernizr object]"></script> 
Modernizr 

Вы должны будете исследовать, как ваша система Magento загружается Modernizr, и обеспечить ваше определение функции/вызов приходит после этого.

+0

Это тяжело. Настройка страницы - это просто наоборот, поэтому модернизатор сначала выполняет функцию ... Я буду рыть в загрузке Magento. Благодаря! – MichelvM

+0

@MichelvM Если это так, то 1. Использует ли Modernizr какую-то задержку/на кузове, готовую до загрузки? 2. Вы уверены, что это строка в вашей анонимной функции, которая вызывает ошибку, а не другую аналогичную строку? 3. Можете ли вы временно разместить свою анонимную функцию в setTimeout с задержкой в ​​1000 - 2000, чтобы увидеть, исправляет ли она ошибку –

+0

Ну ... несколько часов простой паники и что-то таинственное ... заменил JQuery 1.11.3 на оригинальный 1.10.2 и tada ... гладкий как гладкий может быть. Меня бьет, почему и что. Посмотрите на это ПОСЛЕ того, как этот сайт запущен и работает. Спасибо за ваше время !!! – MichelvM

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