Adicionando jQuery para PrimeFaces resulta em TypeError não capturado em todo lugar

Estou usando o PrimeFaces 3.5 e o JSF 2.0. Eu queria usar um plugin jQuery, então eu incluí o jQuery no meu webapp.

    

No entanto, ao usar componentes PrimeFaces, recebo erros de tipo não capturados como este:

Incorreto TypeError: Não é possível ler a propriedade ‘length’ de undefined

Uncaught TypeError: Object [object Object] não possui método ‘autocomplete’

Uncaught TypeError: Não é possível ler a propriedade ‘keyCode’ de undefined

Incorreto TypeError: this.jq.draggable não é uma function

Incorreto TypeError: Não é possível ler a propriedade ‘LinearAxisRenderer’ de undefined

Uncaught TypeError: Object [object Object] não possui um método ‘fileupload’

Incorreto TypeError: this.jqEl.datetimepicker não é uma function

Etc.

Como isso é causado e como posso resolvê-lo?

PrimeFaces é uma biblioteca de componentes JSF baseada em jQuery. Ele vem com jQuery e jQuery UI fora da checkbox. Não é certo carregar manualmente outra cópia da jQuery / jQuery UI por algum motivo. Múltiplos arquivos jQuery com versões diferentes só entrariam em conflito um com o outro desta forma, porque eles não necessariamente usam / compartilham exatamente as mesmas variables ​​/ funções.

Livre-se de todos os arquivos jQuery / UI carregados manualmente. Isso não faz sentido.

Se você fez isso porque você precisa utilizar alguma mágica jQuery / UI em alguma página que não necessariamente use qualquer componente PrimeFaces (e, portanto, seu pacote jQuery não será incluído automaticamente e, portanto, $() estará indisponível), então você sempre pode include explicitamente manualmente o jQuery com o PrimeFaces em algum modelo mestre, conforme abaixo:

   

(o target="head" é desnecessário se você especificá-los diretamente dentro de )


Se você realmente precisa fornecer sua própria versão do jQuery, porque o pacote incluído no PrimeFaces está desatualizado, então você tem duas opções:

  • Deixe seu webapp fornecer seus próprios exatamente no mesmo identificador de resources (library / name) /resources/primefaces/jquery/jquery.js (não altere o caminho nem o nome do arquivo!). Este será então escolhido em vez do pacote PrimeFaces.

  • Descompacte o arquivo primefaces.jar , substitua o arquivo /META-INF/resources/primefaces/jquery/jquery.js pela versão mais recente (não altere o caminho nem nome do arquivo!), Empacote um novo arquivo primefaces.jar .

(e não esqueça de remover todas as referências à própria cópia)

Teste no entanto com rigor. Algumas funcionalidades específicas do PrimeFaces podem romper com a atualização devido a pequenas alterações / correções de bugs na versão mais recente do jQuery em comparação com a versão do pacote PrimeFaces.

Acima de tudo, você deve ter absoluta certeza de que você não fornece várias cópias do jQuery / UI, ou você ainda enfrentará conflitos / conflitos como atualmente. Usar $.noConflict() como algumas pessoas podem sugerir não é absolutamente intencionado para poder usar várias bibliotecas jQuery juntas. A intenção é poder usar o jQuery junto com outra biblioteca JS que coincidentemente também usa $() como function global, como Prototype. Veja também ao Jquery e protótipo noconflict .