2016-07-21 2 views
1

Так что я пытаюсь работать в рамках ограничений запроса и сделал некоторый прогресс, и я все еще блокируюсь. Вот сценарий:Инициализация плагина jQuery с noConflict

В настоящее время я работаю с сайтом, который зависит от jQuery v1.4.2. Поскольку единственный доступ, который я предоставил на бэкэнд, - это возможность вводить контент на страницу, управляемую CMS, я загружал jQuery 1.11 для поддержки некоторых необходимых функций.

Прокрутите вперед до вчерашнего дня, и мне стало известно, что команда разработчиков клиента теперь в комплекте v1.4 и v1.11 и имеет noConflicted 1.11 в $$.

(function() { 
    $$ = $.noConflict(true); // Move jQuery 1.11.0 into $$ and restore $ to jQuery 1.4.2 
})(); 

// Use the following self-invoking anonymous function 
// when you need to run code that depends on $ = jQuery 1.11 
// Otherwise, you can access jquery 1.11 with $$ 
// (function($){ 
// inside here $ is jQuery 1.11 
// and jQuery 1.4.2 is out of scope 
// })($$); 

Поскольку мои скрипты (и плагин, который я пытаюсь загрузить в страницу) впрыскивают в середине страницы и v1.4 JQuery и v1.11 находятся в нижней части страницы, я я загрузка это так:

(function checkForJquery(){ 
    if ('$$' in window) { 
     (function($) { 
      console.log('success'); 
      $.getScript("myplugin.jquery.js", function(){ 
      $(".devices").myplugin({ 
       // devices - Array | productID 
       prop1: ["prod3960155", "prod3640151", "prod3640152", "prod5530141"], 
       prop2: "attribute", 
       prop3: "attribute" 
      }); 
     }); 
    })($$); 
    } else { 
     console.log('not yet'); 
     window.setTimeout(checkForJquery, 1000); 
    } 
})(); 

Так меня вопрос в том, что если я использую:

(function($){})($$); 

Я ничего не получаю - плагин никогда не инициализирует. Однако, если я использую:

(function($){})(jQuery); 

это действительно работает, но тогда у меня нет доступа к последнему API. Любые идеи, почему один будет работать, а не другой?

Для ясности, я использую JQuery плагин шаблонный, и он начинает так:

;(function($, window, document, undefined) { })(jQuery, window, document); 

Любые идеи будут оценены!

Спасибо, Джо

+2

Разве это не должно быть '$$' в шаблоне? 'jQuery' принадлежит к 1.4 ... – eisbehr

+1

wow, используя 6,5-летний jquery - этот веб-сайт должен быть в каком-то музее. – Jamiec

+0

@eisbehr - это, кажется, ответ! – radiantstatic

ответ

2

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

Чтобы пояснить, приведенный ниже код использует только второй экземпляр $$ для поиска всех элементов класса .devices и запускает ваш плагин myPlugin. Ничего больше.

(function($) { 
    $(".devices").myplugin(); 
})($$); 

Но вы зарегистрировали свой плагин только в старой версии. Именно по этой причине он работает, когда вы используете jQuery вместо $$ по приведенному выше коду.

Чтобы использовать экземпляр jQuery $$ в вашем плагине, вы также должны установить его для создания. Но там вы прошли в jQuery. И поскольку вы использовали noConflict, имя jQuery относится к старой версии jQuery.

Чтобы зарегистрировать ваш плагин в нужном экземпляре, вы должны изменить его на $$ на создание тоже.

;(function($, window, document, undefined){})($$, window, document); 

Для того, чтобы ваш плагин работает на других установках, вы можете добавить jQuery в качестве запасного варианта. Это поможет, если вы также используете плагин на других сайтах и ​​не хотите менять его каждый раз.

;(function($, window, document, undefined){})($$ || jQuery, window, document); 

Thats it.

+0

Это сработало отлично! Спасибо. Если учесть, что у меня схожие проблемы с использованием скользкого слайдера Кена Уилера внутри моей функции '(function ($) {$ (el) .slick();}) ($$);', но когда я иду через консоль и проверьте расширенную функцию на jQuery, $ и $$ - ее нет. Есть идеи? https://github.com/kenwheeler/slick/blob/master/slick/slick.js – radiantstatic

+0

Думаю, вам нужно изменить строку 25 на 'factory (window. $$);'. – eisbehr

+0

Большое спасибо за вашу помощь. – radiantstatic

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