Использование разных версий jQuery на одной странице

Пользователи моего сервиса включают JS на свои страницы, которые я предоставляю. Я размещаю сценарий, который они включают. Мой сценарий выполняет некоторые манипуляции с их содержанием. Мне надоело писать свои собственные манипуляторы / селекторы DOM и тратить часы на задания, которые можно выполнить с помощью одной строки кода, если я могу использовать jQuery.

Некоторые пользователи моей службы уже используют jQuery (или Prototype и т. Д.) На своих страницах, поэтому, если я включу jQuery, возникнет конфликт. Поскольку будут различия в версиях, я не хочу использовать их селекторы jQuery, методы в случае, если jQuery существует.

Имея в виду, что у меня нет контроля над их страницами, как я могу включить jQuery и избежать конфликта?


person nimcap    schedule 17.06.2010    source источник


Ответы (3)


Краткая версия: нельзя.

Двойное включение jQuery приводит к разного рода проблемам, самая большая из которых заключается в том, что стираются все добавленные плагины / функции. Кроме того, это может создать множество проблем для их использования jQuery ... на самом деле он не разработан с учетом наличия нескольких версий.

.noConflict() работает с другими конфликтами библиотек, но вы не беспокоясь о $ здесь, вы переопределяете объект jQuery, это, где возникают проблемы. Например, при запуске он настраивает обработчики и т. Д., Если он переопределяется другой версией дальше на странице ... ну, ну, проблемы могут возникнуть быстро.

Еще один отличный пример: события сохраняются / доступны $.data(elem, 'events'), который использует $.cache (в целом, откройте консоль на этой странице, проверьте это), который будет переопределен, что приведет к потере обработчиков событий и разумности. с этим :)

person Nick Craver    schedule 17.06.2010
comment
о нет :( очень плохие новости для меня - person nimcap; 17.06.2010
comment
@nimcap - Что ты делаешь? Я никогда не говорил, что нет какого-нибудь способа проще :) - person Nick Craver; 17.06.2010
comment
Есть несколько частей. Во-первых, я прохожу по DOM и сохраняю в переменной несколько узлов по их классу, имени, идентификатору и т. Д. Для последующих манипуляций. Во-вторых, я манипулирую DOM. Я меняю внешний вид некоторых элементов на их страницах по некоторым правилам. Иногда добавляю какие-то элементы. Я выполняю почти все основные операции, которые предоставляет JS-фреймворк. - person nimcap; 17.06.2010
comment
@nimcap - Вы могли бы переименовать jQuery, я думаю, посмотрите внизу ядра здесь: github.com/jquery/jquery/blob/master/src/core.js Вы можете изменить window.jQuery = window.$ = jQuery; на window.myQuery = jQuery; (jQuery в этой строке локально для закрытия) ... Я не могу ничего обещать, это может (возможно, имеет) побочные эффекты. - person Nick Craver; 17.06.2010
comment
Как насчет использования этого решения? stackoverflow.com/questions/528241/ - person Joel; 03.02.2011
comment
Я согласен - вы абсолютно можете сделать это, используя режим jQuery noConflict. Даже плагины могут быть загружены в обе версии, передав версию noConflict переменной jQuery в IIFE, загрузив туда плагины и вернув новую переменную $ в, скажем, переменную $ j, которая принимает результат возврата IIFE. . Я знаю - я это сделал, и все работает отлично. Если кто-то захочет, я могу опубликовать образец кода (только не в комментариях - это слишком сложно). - person Andrew Faulkner; 08.09.2015

В основном мне нужны селекторы, поэтому на днях я наткнулся на это: Sizzle, механизм выбора CSS на чистом JavaScript, предназначенный для быть легко помещенным в главную библиотеку.

Его можно использовать, чтобы избежать конфликтов с любыми другими экземплярами Sizzle. Я очень рад, что нашел это решение.

person nimcap    schedule 21.07.2010
comment
Я знаю, что это устарело, но я хотел бы добавить, что jQuery фактически использует Sizzle для своего собственного механизма выбора. - person James Hay; 28.02.2012

Для этого вы сначала добавляете первую версию jQuery, например: scr = "/ jquery-1.2.3.js", а затем под ней добавляете:

var jq123 = jQuery.noConflict(true);

Итак, с этого момента для вызова этой версии jQuery вместо «$» используйте «jq123», например, я хотел вызвать функцию меню Lavalamp с помощью этой версии jQuery, я бы сделал:

    jq123(function() {

        jq123("#1, #2, #3").lavaLamp({

});

    });

Вместо: $ (function () {

        $("#1, #2, #3").lavaLamp({

});

    });

Затем вы добавляете другую версию jQuery без каких-либо изменений, например: и вы обычно вызываете в ней функции с символом «$». Надеюсь, это помогло.

person Nick Rameau    schedule 05.09.2011