Quero disparar um evento quando o usuário selecionar um arquivo. Fazendo isso com.change
evento funcionará se o usuário alterar o arquivo toda vez.
Mas quero disparar o evento se o usuário selecionar o mesmo arquivo novamente.
- Arquivo de seleção do usuário
A.jpg
(evento disparado) - Arquivo de seleção do usuário
B.jpg
(evento disparado) - Arquivo de seleção do usuário
B.jpg
(o evento não é acionado, quero que seja acionado)
Como eu posso fazer isso?
jquery
html
events
cross-browser
Gadonski
fonte
fonte
.attr("value", "")
ou.val("")
(como sugerido por @ wagner-leonardi abaixo) Internet Explorer irá disparar o evento de alteração enquanto o Chrome não.prop("value", "")
Se você tentou
.attr("value", "")
e não funcionou, não entre em pânico (como eu fiz)basta fazê-lo
.val("")
e funcionará bemfonte
Você pode simplesmente definir como nulo o caminho do arquivo sempre que o usuário clicar no controle. Agora, mesmo que o usuário selecione o mesmo arquivo, o evento onchange será acionado.
fonte
Use o evento onClick para limpar o valor da entrada de destino, sempre que o usuário clicar no campo. Isso garante que o evento onChange seja acionado para o mesmo arquivo também. Trabalhou para mim :)
Usando TypeScript
fonte
Consegui que isso funcionasse limpando o valor de entrada do arquivo onClick e publicando o arquivo em Change. Isso permite que o usuário selecione o mesmo arquivo duas vezes seguidas e ainda tenha o acionamento do evento de alteração para postar no servidor. Meu exemplo usa o plugin do formulário jQuery .
fonte
onClick
dispara antesonChange
, então esse método funciona muito bem para mim.Esse trabalho pra mim
fonte
Solução VueJs
fonte
Inspirando em @braitsch, usei o seguinte no meu AngularJS2
input-file-component
Aqui o
onClick(event)
me resgatou :-)fonte
Provavelmente, a coisa mais fácil que você pode fazer é definir o valor como uma sequência vazia. Isso obriga a 'alterar' o arquivo sempre que o mesmo arquivo for selecionado novamente.
<input type="file" value="" />
fonte
Aqui está a solução React-y way que eu achei que funcionou para mim:
onClick={event => event.target.value = null}
fonte
Se você não quiser usar o jQuery
Funciona bem no Firefox, mas para o Chrome você precisa adicionar um
this.value=null;
alerta.fonte
Por padrão, a propriedade value do elemento de entrada é limpa após a seleção dos arquivos, se a entrada tiver vários atributos. Se você não limpar esta propriedade, o evento "change" não será acionado se você selecionar o mesmo arquivo. Você pode gerenciar esse comportamento usando o
multiple
atributoReferência
fonte
Você não pode fazer
change
fogo aqui (comportamento correto, pois nada mudou). No entanto, você também pode ligarclick
... embora isso possa disparar com muita frequência ... embora não haja muito meio termo entre os dois.fonte
.click()
não está "disparando ao selecionar novamente".click
mais próximo possível.Crie para a entrada um evento de clique e um evento de alteração. O evento click esvazia a entrada e o evento change contém o código que você deseja executar.
Portanto, o evento click ficará vazio quando você clicar no botão de entrada (antes da janela de seleção de arquivo abrir); portanto, o evento change será sempre acionado quando você selecionar um arquivo.
fonte
Você pode usar
form.reset()
para limpar afiles
lista de entradas do arquivo . Isso redefinirá todos os campos para os valores padrão, mas em muitos casos você pode usar apenas o tipo de entrada = 'arquivo' em um formulário para fazer upload de arquivos de qualquer maneira. Nesta solução, não há necessidade de clonar o elemento e reconectar os eventos novamente.Graças a philiplehmann
fonte
Corri para o mesmo problema, encontrei as soluções acima, mas elas não obtiveram nenhuma explicação boa sobre o que realmente estava acontecendo.
Esta solução que escrevi https://jsfiddle.net/r2wjp6u8/ não faz muitas alterações na árvore DOM, apenas altera os valores do campo de entrada. Do aspecto desempenho, deve ser um pouco melhor.
Link para o violino: https://jsfiddle.net/r2wjp6u8/
fonte
Portanto, não há como 100% garantir que eles estejam selecionando o mesmo arquivo, a menos que você armazene cada arquivo e compare-os programaticamente.
A maneira como você interage com os arquivos (o que JS faz quando o usuário 'envia' um arquivo) é a API de arquivos HTML5 e o JS FileReader .
https://www.html5rocks.com/en/tutorials/file/dndfiles/
https://scotch.io/tutorials/use-the-html5-file-api-to-work-with-files-locally-in-the-browser
Esses tutoriais mostram como capturar e ler os metadados (armazenados como objeto js) quando um arquivo é carregado.
Crie uma função que dispara 'onChange' que leia-> armazene-> compare os metadados do arquivo atual com os arquivos anteriores. Em seguida, você pode acionar seu evento quando o arquivo desejado for selecionado.
fonte
Acredite, definitivamente ajudará!
Espero que isso ajude muitos de vocês.
fonte