Eu tenho widgets que possuem controles javascript anexados a eles.
Se o widget estiver presente quando a página de administração do widget for carregada, os controles funcionarão corretamente.
Quando adiciono um novo widget, eles não funcionam corretamente, recebo a marcação, mas nenhum evento javascript entra em vigor.
Se eu salvar o novo widget, quando o formulário for recarregado, os controles serão criados corretamente e agora funcionarão.
A atualização da página também corrige o problema, mas apenas para os widgets existentes. Novos widgets ainda têm esse problema.
Especificamente, estou executando o selectize nas entradas selecionadas nesses pontos:
- documento pronto
- Ajaxcomplete
Eu verifiquei que meu código é executado em cada evento, conforme desejado, mas os resultados não são os esperados.
Aqui está um plug-in de teste que demonstra o problema:
https://gist.github.com/Tarendai/8466299
Você verá que tenho um contador que aumenta a cada elemento selecionado que ele pode converter.
Notas:
- Quando a página do widget é carregada, vejo o contador aumentando no console JS conforme o esperado
- Quando adiciono um novo widget, o código é executado, no entanto, ele não encontra nenhum elemento selecionado, como demonstrado por found.length sendo 0. Esse não deve ser o caso, pois todo novo widget desse tipo deve tem um elemento select
- Os elementos select possuem uma classe para identificá-los. Essa classe é removida quando a biblioteca selectize é aplicada para impedir a duplicação e o reprocessamento nos widgets existentes.
- Antes de usar o selectize, usei o Select2, que tinha o mesmo problema
- Comentando o código AJAX, eu esperaria que novos widgets tivessem uma entrada de seleção padrão. Eles não. Não sei por que esse é o caso
Então, como faço para que o controle de seleção funcione sem solicitar ao usuário que atualize / clique em salvar antes de fazer alterações?
jQuery( document ).ajaxStop( function() {
peça para poder inicializar os controles nos widgets recém-carregados. No entanto, se eu removesse essa linha, esperaria que novos widgets tivessem entradas de seleção HTML padrão, mas eles não = s
widget-updated
e widget-added
. Também quero enfatizar, no código @michaeljames, o uso do ID do elemento #widgets-right
. Certifique-se de usá-lo para direcionar elementos de widgets ativos em seu código JS, caso contrário, você poderá obter elementos duplicados, pois seu código também pode selecionar elementos de widget inativos ocultos no lado esquerdo da tela (e aqueles clonados quando o widget é adicionado).
.on()
método jQuerys . O que requer que você vincule um evento ao documento. No entanto, qual evento será apropriado, não tenho certeza no momento. Por fim, é porque suas ligações originais representam a versão inicial do DOM quando a página foi carregada e, na maioria das vezes, são cegos para os novos elementos (conteúdo do widget) que estão sendo adicionados via ajax. Espero que isso aponte a direção certa; se não, posso responder melhor quando estiver no trabalho.