Подтвердить что ты не робот

JQuery: noConflict

Я просто не могу с этим справиться. Мой бог заставлял мой мозг болеть, поэтому я обращаюсь к вам, хорошим людям в Интернете.

Я без устали смотрел документацию для функции jQuery $.noConflict().

Моя проблема в том, что на сайте, над которым я работаю, уже есть jQuery 1.1.3.1, но я хочу сделать несколько потрясающих и увлекательных пользовательских интерфейсов в нескольких местах, поэтому я хочу использовать 1.4.2 по понятным причинам.

Я пытаюсь запустить эти бок о бок, но я не могу заставить какой-либо код выполнять. Мне также нужно реализовать несколько плагинов с использованием 1.4.2, поэтому я не уверен, что работа jQuery над чем-то вроде $j будет работать, так как очевидно, что плагины будут подбирать $ и jQuery как 1.1.3.1 скорее чем 1.4.2.

Есть ли способ, которым я могу обернуть свой код в блоке noConflict(), а также включить плагины, которые мне нужны, чтобы создать автономный блок кода 1.4.2?

Любая помощь будет фантастической, поскольку мой бедный разум плачет среди обширной пустыни, которая является документами API!

4b9b3361

Ответ 1

Вы должны просто обновить весь сайт до 1.4.2.
jQuery вообще не имеет большого количества изменений, поэтому это не должно быть так сложно.

Ответ 2

Если у вас два или три jQuery на одной странице, просто поместите другую переменную для каждого другого jQuery.

Пример:

<script type="text/javascript">
    var $s = jQuery.noConflict();
    $s(document).ready(function() {
        $s('#news-container').vTicker({
            speed: 500,
            pause: 3000,
            animation: 'fade',
            mousePause: true,
            showItems: 2
        });
    });
</script>
<script type="text/javascript">
    var $j = jQuery.noConflict();
    $j(document).ready(function() {
        $j('.sf-menu ul').superfish({
            delay: 1000,
            animation: {
                opacity: 'show',
                height: 'show'
            },
            speed: 'medium',
            autoArrows: false,
            dropShadows: 'medium'
        });
    });
</script>

Ответ 3

Недавно у меня была аналогичная проблема, когда я использовал jQuery v1.3.2 на странице, но всплывающее окно стороннего опроса использовало более старую версию на той же странице. В итоге мне удалось решить проблему. Я ссылался на jQuery 1.3.2 следующим образом:

 <script type="text/javascript" src"/Scripts/jquery-1.3.2.min.js"></script>
    <script type="text/javascript"> 
        jq132 = jQuery.noConflict(true); 
 </script> 

Затем я модифицировал весь код jQuery, чтобы использовать jq132 вместо $. Затем я нашел и заменил все плагины, которые я использовал, чтобы заменить "$ (" с помощью jq132 ( "и" $. "На" jq132 "). Может быть более элегантный подход, но это сработало для меня. Я далек от эксперта jQuery, поэтому может быть другой синтаксис $, который вам нужно обрабатывать (т.е. Не просто". "И" (").).

Ответ 4

Вы должны опубликовать пример, который не работает. Бьюсь об заклад, мы немедленно очистим его.

Я не верю, что noConflict - это "блок". Вы используете noConflict, чтобы сообщить jQuery, что вы хотите удалить все, что он объявляет, из глобального пространства имен JavaScript (потому что вы хотите снова загрузить jQuery и повторно использовать эти имена).

На странице с более чем 1 экземпляром загруженного jQuery оба экземпляра должны использовать noConflict. Я не знаю, можно ли загрузить второй экземпляр jQuery, если уже загружен экземпляр, и этот экземпляр не вызвал noConflict.

@SLaks и @galambalazs: иногда вы пишете небольшое количество контента, которое будет отображаться на более крупной странице, например на портале. Портал уже использует (n устаревшую) версию jQuery, но вам нужна более новая версия. Также вы не контролируете большую страницу портала, а только контент, который вы пишете, который будет отображаться внутри него.

Этот сценарий точно описывает реальную работу, которую я обычно делаю.

Ответ 5

Я бы согласился с другими сообщениями, которые предлагают попробовать обновиться до 1.4.2 по всем направлениям... Тем не менее, у вас явно есть веская причина для попыток сделать то, что вы пытаетесь сделать. Насколько мне известно, нет простого способа справиться с вашей ситуацией (поскольку я тоже пробовал что-то подобное).

"noConflict" просто освобождает глобальную переменную "$", чтобы другие библиотеки/скрипты могли безопасно ее использовать. Учитывая, что вы пытаетесь использовать две версии jQuery, "noConflict" здесь не очень полезно... называть его для обеих версий jQuery не изменяет тот факт, что обеим версиям все равно нужно ссылаться на глобальный объект "jQuery" ( из которых может быть только один...).

Проблема (как вы уже ясно знаете) заключается в том, что загрузка второй версии jQuery будет "clobber" исходного объекта jQuery (и всех "настроек", сделанных с помощью плагинов).

Единственное надежное (хотя и невероятно неэффективное) решение, которое я мог бы придумать:

  • Загрузите существующий (старый) jQuery версии и плагинов (если вы не можете избегайте этого)
  • Загрузите новый jQuery версия
  • RE-load и существующие плагины и любой новый плагин, который вы хотите использовать
  • Широко протестировать

Ответ 6

Прочный совет: не подчеркивайте свою и ваши посетители пропускную способность двумя версиями jQuery. Измените всю свою базу кода до последней версии. Он получил меньше ошибок, больше поддержки и улучшенного поведения.

Ответ 7

ПУТЬ поздно... но может помочь кому-то - бросил это вместе.

/**
*********************************************************************************************************
*           jQuery version check
*           $.noConflict() is not enough to ensure jQuery as well as $ 
*           has correct version (can cause troubles with jQuery plugins that use fn(){}(jQuery);
*
*           useage: restoreJquery('1.10.2',true) //for unminimized dev version
*                   restoreJquery('1.10.2')          //for minimized version
*                   restoreJquery('1.10.2',true,myFunction)          //for minimized version, that executes a function once jQuery is in the page
*
*
**/

function restoreJquery(wantedVersion,devVersion,callback) {
    if(!wantedVersion){
        wantedVersion= '1.10.2';
    }

    //is current jQuery version ===wanted version? (double check to avoid undefined errors)
    if($ && $.fn.jquery!==wantedVersion){                

        //if not invoke noConflict with true (true=gives up the jQuery name space aswell as $)
        var $jQuery = jQuery.noConflict(true); 
        //Line Assign the new object to new instantiated versions of jQuery
        var $=jQuery=$jQuery;                          
      }

    //if jQuery is still not the correct version inject it into page via plain vanilla js

    //if $ does not exist or the version is wrong inject it into the page
    if(!$ || $.fn.jquery!==wantedVersion){ 

        var head=document.getElementsByTagName('head')[0], //get Head
            jqPath=wantedVersion+'jquery.', // ex '1.10.2/jquery.
                    script=document.createElement('script'); //create empty scripttag

            if(devVersion){  //minimized or not?
                jqPath+='min.js';
            }else{
                jqPath+='js';
            }

        script.src='//http://ajax.googleapis.com/ajax/libs/jquery/'+jqPath; //create src path
        script.type='text/javascript'; //add type
        script.async=true; //set async to true
        //real browsers
        script.onload=callback;  //call callback on load

        //Internet explorer doesnt support onload on script (typical ie)
        script.onreadystatechange = function() {
            if (this.readyState == 'complete') {
                callback();
            }
        }


    head.appendChild(script);

    }else{
        //otherwise call the callback since noConflict solved our jQuery versioning issues
        callback();
    }

};

Ответ 8

jQuery no-конфликта - это опция, предоставленная командой jQuery для преодоления конфликтов между различными JS-структурами или библиотеками. Мы заменяем $ на новую переменную и присваиваем jQuery, когда используем метод noconflict.

    <button>Test jQuery noConflict</button>
    <script>
        var newjq = $.noConflict();
        newjq(document).ready(function(){
           newjq("button").click(function(){
               newjq("p").text("Wahh..! Its working!");
            });
        });
    </script>

Мы также можем использовать знак $, как показано ниже, это также не создает никакого конфликта

$.noConflict();
jQuery(document).ready(function($) {
   // Code that uses jQuery $ can follow here.
});