Добавление jQuery к PrimeFaces приводит к Uncaught TypeError по всему месту

Я использую PrimeFaces 3.5 и JSF 2.0. Я хотел использовать плагин jQuery, поэтому я включил jQuery в свое веб-приложение.

<h:head>
    <h:outputScript name="js/jquery.min.js" />
    <h:outputScript name="js/jquery-ui.js" />
</h:head>

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

Uncaught TypeError: Невозможно прочитать свойство 'length' из неопределенного

Uncaught TypeError: Object [object Object] не имеет метода "автозаполнение"

Uncaught TypeError: Невозможно прочитать свойство 'keyCode' из неопределенного

Uncaught TypeError: this.jq.draggable не является функцией

Uncaught TypeError: Невозможно прочитать свойство 'LinearAxisRenderer' из неопределенного

Uncaught TypeError: Object [object Object] не имеет метода fileupload

Uncaught TypeError: this.jqEl.datetimepicker не является функцией

И т.п.

Как это вызвано и как я могу решить это?

1 ответ

Решение

PrimeFaces - это библиотека компонентов JSF на основе jQuery. Он уже поставляется с jQuery и jQuery UI из коробки. По какой-то причине неправильно загружать другую копию пользовательского интерфейса jQuery/jQuery. Таким образом, несколько разных версий файлов jQuery конфликтуют друг с другом только потому, что они не обязательно используют / совместно используют одни и те же переменные / функции.

Избавьтесь от всех тех загруженных вручную файлов jQuery/UI. Это не имеет никакого смысла.

Если вы сделали это, потому что вам нужно использовать магию jQuery/UI на некоторой странице, которая не обязательно использует какие-либо компоненты PrimeFaces (и, следовательно, его jQuery не будет автоматически включен и, следовательно, $() будет недоступно), то вы всегда можете вручную явно включить jQuery, связанный с PrimeFaces, в некоторый мастер-шаблон, как показано ниже:

<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" />

( target="head" не нужно, если вы указываете их непосредственно внутри <h:head> )


Если вам абсолютно необходимо предоставить собственную версию jQuery, поскольку та, что входит в PrimeFaces, устарела, у вас есть 2 варианта:

  • Пусть ваше веб-приложение предоставит свой собственный точно такой же идентификатор ресурса (библиотека / имя) /resources/primefaces/jquery/jquery.js (не меняйте ни путь, ни имя файла!). Этот будет выбран вместо PrimeFaces.

  • распаковывать primefaces.jar заменить /META-INF/resources/primefaces/jquery/jquery.js файл с более новой версией (не меняйте ни путь, ни имя файла!), перепакуйте новую primefaces.jar,

(и не забудьте удалить все эти <h:outputScript> ссылки на собственный экземпляр)

Испытайте однако тщательно. Некоторые специфические функции PrimeFaces могут выходить из строя при обновлении из-за незначительных изменений / исправлений в более новой версии jQuery по сравнению с PrimeFaces.

Прежде всего, вы должны быть абсолютно уверены, что вы не предоставляете несколько копий jQuery/UI, иначе вы все равно столкнетесь с конфликтами / столкновениями, как и в настоящее время. С помощью $.noConflict() как могут предположить некоторые люди, абсолютно не намерен использовать несколько библиотек jQuery вместе. Предполагается иметь возможность использовать jQuery вместе с другой библиотекой JS, которая по совпадению также использует $() как глобальная функция, такая как прототип. Смотрите также JQuery и прототип noconflict.

Другие вопросы по тегам