Конфликты JQuery с файлами?
Я включил JQuery1.5 в заголовок страницы JSF. На этой странице есть куча компонентов Primefaces, уже закодированных. После того, как я включил Jquery.js
в заголовок страницы, некоторые компоненты таких элементов, как <p:commandButton>
, теряют свой скин, а <p:fileUpload>
становится похожим на обычный JSP <input type="file">
и полностью утрачивает способность AJAX.
Есть ли способ безопасно использовать JQuery вместе с первичными (без конфликтов)?
Ответы
Ответ 1
У меня была та же проблема, что и в вопросе. Вот почему я придумал следующее решение:
Включить встроенную библиотеку jQuery (в настоящее время 1.4.1) в качестве встроенной библиотеки, в том числе собственную библиотеку jQuery, которая приводит к проблемам форматирования CSS. Добавление атрибута target="head"
позволяет указывать тег везде - например. при использовании шаблонов вы не всегда имеете доступ к тегу <head>
:
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
Поверхность jQuery-библиотека включена по умолчанию в режиме конфликта. Это означает, что ярлык $()
не может использоваться. Чтобы преодолеть эту проблему, включите следующую строку в тег <script>
или <h:outputScript>
:
<h:outputScript target="head">
// Add the $() function
$ = jQuery;
// Now you can use it
$(document).ready(function() {
...
});
</h:outputScript>
Это лучшее решение, которое я мог бы выкопать до сих пор, используя прайс-листы 2.2.1.
Ответ 2
Почему бы не использовать пакеты jquery с PrimeFaces?
<h:outputScript library="primefaces" name="jquery/jquery.js" />
PrimeFaces 2.2.1 имеет jQuery 1.4.4 и 3.0 (в разработке) имеет 1.5.1.
Ответ 3
Многие библиотеки JavaScript используют $ как имя функции или переменной, как это делает jQuery. В случае jQuery $ является просто псевдонимом для jQuery, поэтому все функции доступны без использования $. Ниже приведены некоторые методы:
-
Напишите jQuery.noConflict();
перед инициализацией jQuery, см. ниже
jQuery.noConflict();
$(document).ready(function(){
// your jQuery code
});
-
Создайте другой псевдоним вместо jQuery для использования в остальной части script.
var j = jQuery.noConflict();
// Do something with jQuery
j("div p").hide();
-
Измените все экземпляры $: замените $
на jQuery
в блоке кода jQuery
jQuery(document).ready(function){
jQuery("div p").hide();
})
-
Полностью переместить jQuery в новое пространство имен в другом объекте.
var dom = {};
dom.query = jQuery.noConflict(true);
// Do something with the new jQuery
dom.query("div p").hide();
-
Задайте область $ для локальной, а не глобальной
// Method 1
jQuery(document).ready(function($){
$("div").hide();
});
// Method 2
(function($) {
/* some code that uses $ */
})(jQuery);
Примечание. этот момент имеет один недостаток, у вас не будет доступа к другой библиотеке $().
Original Reference
Ответ 4
Мое решение добавляет этот код на страницу по умолчанию:
<script type="text/javascript">var $j = jQuery.noConflict(true);</script>
После этого я использую jquery с $j.
спасибо
Ответ 5
jQuery имеет режим noConflict ', который позволяет ему играть красиво рядом с другими библиотеками. Я не использовал компоненты Primefaces, поэтому я не знаю точно, но если вы включите jQuery в режиме noconflict, ваши проблемы, скорее всего, исчезнут.
Ответ 6
Мой опыт:
У меня была такая же проблема, и я никогда не работал с обоими jquery libs. (Я использую jQuery
вместо $
, но никогда не пробовал jQuery.noConflict()
).
Мое решение состояло в том, чтобы использовать только lib, связанный с файлами, как описано в ответе Кагатайса.
Ответ 7
чтобы решить конфликт между Primefaces и jQuery, не нужно импортировать какой-либо внешний файл jQuery, поэтому для решения проблемы импортируйте файлы jQuery, расположенные в файле jfp
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />
и в вашем коде jQuery замените $на jQuery.