Neste artigo você aprenderá a Select2 com HTMX, um recurso frequentemente utilizado com o framework Django

Fala programador(a), beleza? Bora aprender mais sobre HTMX!
Antes de seguir com o artigo, não deixe de conferir nosso curso completo de HTMX!
São mais de 6 horas de aula, do básico ao avançado e com dois projetos completos! Além disso, você tem acesso vitalício, equipe de suporte especializada para te ajudar e certificado de conclusão.

O Problema
Quando um elemento <select> é enriquecido com Select2 e configurado para disparar uma solicitação HTMX em sua mudança, a expectativa é que qualquer seleção do usuário resulte em uma ação HTMX correspondente.
Contudo, essa integração direta falha, pois o Select2 manipula os eventos de mudança de uma maneira que não aciona automaticamente os ouvintes de eventos HTMX associados ao elemento original <select>.
Solução Proposta
Para resolver o problema, a solução envolve um pequeno script JavaScript que manualmente dispara o evento de mudança (change) no elemento <select> original, sempre que uma seleção é feita com Select2.
Isso assegura que o HTMX reconheça a mudança e execute a solicitação conforme esperado.
Implementação
A implementação recomendada utiliza o evento select2:select do Select2, que é disparado após a seleção de um item.
O script abaixo deve ser incluído em seu documento HTML ou arquivo JavaScript externo:
window.addEventListener("DOMContentLoaded", () => {
$('select').each(function () {
const selectElement = this;
$(this).on('select2:select', function () {
selectElement.dispatchEvent(new Event('change'));
});
});
});
Esse código escuta o carregamento do DOM e, em seguida, para cada elemento <select> na página, adiciona um ouvinte para o evento select2:select.
Quando o evento é acionado, ele manualmente dispara um evento de mudança no elemento <select> original, garantindo que o HTMX processe a mudança.
Solução Proposta com JavaScript Puro
A solução envolve ouvir diretamente os eventos disparados pelo Select2 e manualmente propagá-los para o elemento <select> original como eventos de mudança, que então podem ser capturados pelo HTMX.
Passo 1: Inicializar o Select2
Primeiramente, é necessário inicializar o Select2. Como estamos evitando jQuery, isso pode ser feito selecionando o elemento <select> com JavaScript puro e aplicando o Select2.
Este passo pode variar dependendo de como o Select2 é integrado ao seu projeto.
document.addEventListener('DOMContentLoaded', function() {
var selectElements = document.querySelectorAll('.select2');
selectElements.forEach(function(select) {
new Select2(select); // Substitua isso pela sua própria inicialização do Select2 sem jQuery, se necessário
});
});
Passo 2: Detectar Seleção e Disparar Evento de Mudança
Agora, precisamos adicionar um ouvinte para o evento select2:select e disparar um evento de mudança no elemento <select> original.
document.addEventListener('DOMContentLoaded', function() {
var selectElements = document.querySelectorAll('.select2');
selectElements.forEach(function(select) {
select.addEventListener('select2:select', function(event) {
// Criando e disparando o evento de mudança
var changeEvent = new Event('change');
select.dispatchEvent(changeEvent);
});
});
});
Note que o 'select2:select' é um evento específico do Select2 usado para detectar quando uma seleção é feita.
Quando esse evento ocorre, criamos e disparamos um novo evento de mudança no elemento <select> original, o qual pode ser capturado e tratado pelo HTMX.
Considerações Adicionais
Para garantir que esse script funcione com o HTMX, é importante que o HTMX já esteja carregado e operacional no momento em que o script é executado.
Isso significa que o script HTMX deve ser carregado antes desse código JavaScript personalizado.
Além disso, se seu elemento <select> for carregado ou modificado dinamicamente após o carregamento inicial da página, você pode precisar ajustar o script para aplicar o ouvinte de eventos a esses novos elementos de forma adequada.
Conclusão
A solução proposta oferece uma maneira eficaz de garantir que os eventos de mudança sejam reconhecidos pelo HTMX, mantendo a funcionalidade avançada do Select2 e a interatividade dinâmica do HTMX.
Esse método reforça a flexibilidade e a potência das aplicações web modernas, nos permitindo a criar interfaces ricas e responsivas com facilidade.