Eu gostaria de fazer um evento de clique disparar em uma <input type="file">
tag programaticamente.
Apenas chamar click () não parece fazer nada ou, pelo menos, não abre uma caixa de diálogo de seleção de arquivo.
Venho experimentando capturar eventos usando ouvintes e redirecionando o evento, mas não consegui fazer isso para realmente executar o evento como se alguém tivesse clicado nele.
javascript
html
user28655
fonte
fonte
Respostas:
Você não pode fazer isso em todos os navegadores, supostamente o IE faz permitem, mas Mozilla e Opera não.
Quando você redige uma mensagem no GMail, o recurso 'anexar arquivos' é implementado de uma maneira para o IE e qualquer navegador que ofereça suporte a isso e, em seguida, implementa outra maneira para o Firefox e os navegadores que não.
Não sei por que você não pode fazer isso, mas uma coisa que é um risco à segurança e que você não tem permissão para fazer em nenhum navegador é definir programaticamente o nome do arquivo no elemento Arquivo HTML.
fonte
input
elemento do arquivo está visível. Disparar oclick
método funciona, inclusive no console, se o elemento puder ser visto.Eu tenho procurado a solução para este dia inteiro. E estas são as conclusões que tirei:
Espero que isto ajude! :)
fonte
Você pode acionar click () em qualquer navegador, mas alguns navegadores precisam que o elemento seja visível e focado. Aqui está um exemplo de jQuery:
Ele funciona com o hide antes do,
click()
mas não sei se funciona sem chamar o método show. Nunca tentei isso no Opera, testei no IE / FF / Safari / Chrome e funciona. Espero que isso ajude.fonte
$(...).show().focus().click().hide();
:)ISTO É POSSÍVEL: em FF4 +, Opera?, Chrome: mas:
inputElement.click()
deve ser chamado do contexto de ação do usuário! (não contexto de execução de script)<input type="file" />
deve estar visível (inputElement.style.display !== 'none'
) (você pode ocultá-lo com visibilidade ou outra coisa, mas não a propriedade "display")fonte
onclick
atributo em vez de vincular ao evento.inputElement.click()
de dentro de um evento de pressionamento de tecla (atalho para anexar um arquivo) funcionou, mas a chamada em um tempo limite ou retorno de chamada ajax NÃO. Votado.this
. : /Para aqueles que entendem que você precisa sobrepor um formulário invisível sobre o link, mas têm preguiça de escrever, eu escrevi para você. Bem, para mim, mas também pode compartilhar. Comentários são bem-vindos.
HTML (em algum lugar):
HTML (em algum lugar em que você não se importa):
JavaScript:
fonte
Experimente esta solução: http://code.google.com/p/upload-at-click/
fonte
basta usar uma tag label, para ocultar a entrada e fazê-la funcionar através do rótulo relacionado https://developer.mozilla.org/fr/docs/Web/HTML/Element/Label
fonte
Se você deseja que o
click
método funcione no Chrome, Firefox, etc, aplique o seguinte estilo ao seu arquivo de entrada. Será perfeitamente escondido, é como se você fizesse umadisplay: none;
É simples assim, eu testei que funciona!
fonte
height
ewidth
para0
?Funcionou para mim quando tive um problema semelhante, é um eRube Goldberg regular.
fonte
Deixe-me adicionar a este post antigo, uma solução funcional que eu costumava usar que funciona provavelmente em 80% ou mais de todos os navegadores, novos e antigos.
A solução é complexa, porém simples. A primeira etapa é usar CSS e disfarçar o tipo de arquivo de entrada com "subelementos" que são mostrados como opacos por 0. A próxima etapa é usar JavaScript para atualizar seu rótulo conforme necessário.
Exemplo de jsFiddle de trabalho
fonte
Funciona :
Por motivos de segurança no Firefox e Opera, você não pode acionar o clique na entrada do arquivo, mas pode simular com o MouseEvents:
fonte
createEvent()
einitMouseEvent()
agora estão obsoletos.Eu sei que isso é antigo, e todas essas soluções são hacks em torno das precauções de segurança do navegador com valor real.
Dito isto, a partir de hoje, fileInput.click () funciona no Chrome atual (36.0.1985.125 m) e no Firefox ESR atual (24.7.0), mas não no IE atual (11.0.9600.17207). A sobreposição de um campo de arquivo com opacidade 0 em cima de um botão funciona, mas eu queria um elemento de link como acionador visível, e o sublinhado ao passar o mouse não funciona muito bem em nenhum navegador. Ele pisca e desaparece, provavelmente o navegador pensando se o estilo de foco flutuante realmente se aplica ou não.
Mas eu encontrei uma solução que funciona em todos esses navegadores. Não afirmo ter testado todas as versões de todos os navegadores, ou sei que continuará funcionando para sempre, mas parece atender às minhas necessidades agora.
É simples: posicione o campo de entrada do arquivo fora da tela (position: absolute; top: -5000px), coloque um elemento de rótulo em torno dele e acione o clique no rótulo, em vez do próprio campo do arquivo.
Observe que o link precisa ser script para chamar o método click do rótulo; ele não faz isso automaticamente, como quando você clica no texto dentro de um elemento do rótulo. Aparentemente, o elemento do link captura o clique e não chega ao rótulo.
Observe também que isso não fornece uma maneira de mostrar o arquivo selecionado no momento, pois o campo está fora da tela. Eu queria enviar imediatamente quando um arquivo foi selecionado, então isso não é um problema para mim, mas você precisará de uma abordagem um pouco diferente se sua situação for diferente.
fonte
JS Fiddle: http://jsfiddle.net/eyedean/1bw357kw/
fonte
Este código funciona para mim. É isso que você está tentando fazer?
fonte
Minha solução para o Safari com jQuery e jQuery-ui:
fonte
Aqui está a solução JavaScript pura para esse problema. Funciona bem em todos os navegadores
fonte
Existem maneiras de redirecionar eventos para o controle, mas não espere poder disparar facilmente eventos para o controle de incêndio, pois os navegadores tentarão bloquear isso por (boas) razões de segurança.
Se você só precisa que a caixa de diálogo de arquivo apareça quando um usuário clica em algo, digamos que você queira botões de upload de arquivo com melhor aparência, dê uma olhada no que Shaun Inman inventou .
Consegui alcançar o acionamento do teclado com uma mudança criativa de foco dentro e fora do controle entre eventos de pressionamento de tecla, pressionamento de tecla e keyup. YMMV.
Meu conselho sincero é deixar isso em paz, porque este é um mundo de dor de incompatibilidade de navegador. Atualizações menores do navegador também podem bloquear truques sem aviso prévio, e você pode precisar reinventar os hacks para mantê-lo funcionando.
fonte
Eu estava pesquisando isso há um tempo atrás, porque queria criar um botão personalizado que abrisse a caixa de diálogo do arquivo e iniciasse o upload imediatamente. Acabei de perceber algo que pode tornar isso possível - o Firefox parece abrir a caixa de diálogo quando você clica em qualquer lugar do upload. Portanto, o seguinte pode ser feito:
Isso é apenas teórico, pois eu já usei outro método para resolver o problema, mas pode funcionar.
fonte
Eu tinha uma
<input type="button">
tag oculta. O que eu fiz foi anexar o"onClick"
evento a qualquer componente visível de qualquer tipo, como um rótulo. Isso foi feito usando as Ferramentas de desenvolvedor do Google Chrome ou o Firebug do Mozilla Firefox usando o botão direito do mouse em "editar HTML". Nesse evento, especifique o seguinte script ou algo semelhante:Se você possui JQuery:
se não:
Obrigado.
fonte
Ei, esta solução funciona. para download, deveríamos estar usando o MSBLOB
Para AngularJS ou mesmo para javascript normal.
fonte
Agora isso será possível no Firefox 4, com a ressalva de que ele conta como uma janela pop-up e, portanto, será bloqueado sempre que uma janela pop-up tiver sido.
fonte
Aqui está a solução que funciona para mim: CSS:
HTML com ajuda "pequena" do JQuery:
Apenas certifique-se de que o maskfied seja coberto de maneira completa pelo verdadeiro campo de upload.
fonte
Você pode fazer isso conforme a resposta da caixa de diálogo Abrir arquivo na tag <a>
fonte
Descobri que se a entrada (arquivo) estiver fora do formulário, o acionamento do evento click invocará a caixa de diálogo do arquivo.
fonte
Espero que isso ajude alguém - passei duas horas batendo minha cabeça contra ele:
No IE8 ou IE9, se você acionar a abertura de uma entrada de arquivo com javascript de qualquer forma (acredite, eu tentei todas elas), ele não permitirá que você envie o formulário usando javascript, apenas falhará silenciosamente.
Enviar o formulário através de um botão de envio regular pode funcionar, mas chamar form.submit (); falhará silenciosamente.
Eu tive que recorrer a sobrepor meu botão de seleção de arquivo com uma entrada de arquivo transparente que funcione.
fonte
Isso funcionou para mim:
fonte
Não é impossível:
Mas, de alguma forma, funciona apenas se estiver em uma função chamada por meio de um evento de clique.
Então você pode ter a seguinte configuração:
html:
JavaScript:
fonte
createEvent()
einitMouseEvent()
foi preterido. Você tem que usar umCustomEvent()
agora ...Você pode usar
fonte