Sto cercando di attivare una casella di caricamento (pulsante Sfoglia) utilizzando jQuery.
Il metodo che ho provato ora è:
$('#fileinput').trigger('click');
Ma non sembra funzionare. Per favore aiuto. Grazie.
Sto cercando di attivare una casella di caricamento (pulsante Sfoglia) utilizzando jQuery.
Il metodo che ho provato ora è:
$('#fileinput').trigger('click');
Ma non sembra funzionare. Per favore aiuto. Grazie.
Risposte:
Ciò è dovuto a una limitazione della sicurezza.
Ho scoperto che la limitazione di sicurezza è solo quando <input type="file"/>
è impostata su display:none;
o è visbilty:hidden
.
Così ho provato posizionandolo al di fuori della finestra impostando position:absolute
ed top:-100px;
e voilà funziona.
vedi http://jsfiddle.net/DSARd/1/
chiamalo un hack.
Spero che funzioni per te
left: -100px;
. Non si sa mai quanto potrebbe durare una pagina
questo ha funzionato per me:
JS:
$('#fileinput').trigger('click');
HTML:
<div class="hiddenfile">
<input name="upload" type="file" id="fileinput"/>
</div>
CSS:
.hiddenfile {
width: 0px;
height: 0px;
overflow: hidden;
}
>>> Un altro che funziona su più browser: <<<
L'idea è quella di sovrapporre un enorme pulsante "Sfoglia" invisibile sopra il pulsante personalizzato. Pertanto, quando l'utente fa clic sul pulsante personalizzato, in realtà sta facendo clic sul pulsante "Sfoglia" del campo di input nativo.
JS Fiddle: http://jsfiddle.net/5Rh7b/
HTML:
<div id="mybutton">
<input type="file" id="myfile" name="upload"/>
Click Me!
</div>
CSS:
div#mybutton {
/* IMPORTANT STUFF */
overflow: hidden;
position: relative;
/* SOME STYLING */
width: 50px;
height: 28px;
border: 1px solid green;
font-weight: bold
background: red;
}
div#mybutton:hover {
background: green;
}
input#myfile {
height: 30px;
cursor: pointer;
position: absolute;
top: 0px;
right: 0px;
font-size: 100px;
z-index: 2;
opacity: 0.0; /* Standard: FF gt 1.5, Opera, Safari */
filter: alpha(opacity=0); /* IE lt 8 */
-ms-filter: "alpha(opacity=0)"; /* IE 8 */
-khtml-opacity: 0.0; /* Safari 1.x */
-moz-opacity: 0.0; /* FF lt 1.5, Netscape */
}
JavaScript:
$(document).ready(function() {
$('#myfile').change(function(evt) {
alert($(this).val());
});
});
height
si suggerisce di passare aheight: 100%
È possibile utilizzare l'elemento LABEL ex.
<div>
<label for="browse">Click Me</label>
<input type="file" id="browse" name="browse" style="display: none">//
</div>
Ciò attiverà il file di input
Ho funzionato (= testato) in IE8 +, FF e Chrome recenti:
$('#uploadInput').focus().trigger('click');
La chiave si sta focalizzando prima di sparare (altrimenti Chrome lo ignora).
Nota: è NECESSARIO che gli input siano visualizzati e visibili (come in, non display:none
e non visibility:hidden
). Suggerisco (come molti altri prima) di posizionare assolutamente l'input e di buttarlo fuori dallo schermo.
#uploadInput {
position: absolute;
left: -9999px;
}
Dai un'occhiata al mio violino.
http://jsfiddle.net/mohany2712/vaw8k/
.uploadFile {
visibility: hidden;
}
#uploadIcon {
cursor: pointer;
}
<body>
<div class="uploadBox">
<label for="uploadFile" id="uploadIcon">
<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Icon_-_upload_photo_2.svg/512px-Icon_-_upload_photo_2.svg.png" width="20px" height="20px"/>
</label>
<input type="file" value="upload" id="uploadFile" class="uploadFile" />
</div>
</body>
adardesign lo ha inchiodato per quanto riguarda l'elemento di input del file che viene ignorato quando è nascosto. Ho anche notato che molte persone spostano la dimensione dell'elemento su 0 o lo spingono fuori dai limiti con le regolazioni di posizionamento e overflow. Queste sono tutte grandi idee.
Un modo alternativo che sembra funzionare perfettamente è impostare l'opacità su 0 . Quindi puoi sempre semplicemente impostare la posizione per evitare che compensi altri elementi come nasconde. Sembra un po 'inutile spostare un elemento di quasi 10K pixel in qualsiasi direzione.
Ecco un piccolo esempio per coloro che ne vogliono uno:
input[type='file']{
position:absolute;
opacity:0;
/* For IE8 "Keep the IE opacity settings in this order for max compatibility" */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
/* For IE5 - 7 */
filter: alpha(opacity=0);
}
Solo per motivi di curiosità, puoi fare qualcosa come vuoi creando dinamicamente un modulo di caricamento e un file di input, senza aggiungerlo all'albero DOM:
$('.your-button').on('click', function() {
var uploadForm = document.createElement('form');
var fileInput = uploadForm.appendChild(document.createElement('input'));
fileInput.type = 'file';
fileInput.name = 'images';
fileInput.multiple = true;
fileInput.click();
});
Non è necessario aggiungere uploadForm al DOM.
Codice corretto:
<style>
.upload input[type='file']{
position: absolute;
float: left;
opacity: 0; /* For IE8 "Keep the IE opacity settings in this order for max compatibility" */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* For IE5 - 7 */
filter: alpha(opacity=0);
width: 100px; height: 30px; z-index: 51
}
.upload input[type='button']{
width: 100px;
height: 30px;
z-index: 50;
}
.upload input[type='submit']{
display: none;
}
.upload{
width: 100px; height: 30px
}
</style>
<div class="upload">
<input type='file' ID="flArquivo" onchange="upload();" />
<input type="button" value="Selecionar" onchange="open();" />
<input type='submit' ID="btnEnviarImagem" />
</div>
<script type="text/javascript">
function open() {
$('#flArquivo').click();
}
function upload() {
$('#btnEnviarImagem').click();
}
</script>
Questo è di proposito e di progettazione. È un problema di sicurezza.
In realtà, ho scoperto un metodo davvero semplice per questo, che è:
$('#fileinput').show().trigger('click').hide();
In questo modo, il campo di input del file può avere la proprietà css visualizzata su nessuno e comunque vincere lo scambio :)
È troppo tardi per rispondere, ma penso che questa configurazione minima funzioni meglio. Sto anche cercando lo stesso.
<div class="btn-file">
<input type="file" class="hidden-input">
Select your new picture
</div>
// css
.btn-file {
display: inline-block;
padding: 8px 12px;
cursor: pointer;
background: #89f;
color: #345;
position: relative;
overflow: hidden;
}
.btn-file input[type=file] {
position: absolute;
top: 0;
right: 0;
min-width: 100%;
min-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
cursor: inherit;
display: block;
}
Questa è una domanda molto vecchia, ma sfortunatamente questo problema è ancora rilevante e richiede una soluzione.
La soluzione (sorprendentemente semplice) che ho escogitato è quella di "nascondere" il campo di input del file effettivo e di avvolgerlo con un tag LABEL (può essere basato su Bootstrap e HTML5, per migliorare).
See here:
Codice di esempio qui
In questo modo, il campo di input del file reale è invisibile e tutto ciò che vedi è il "pulsante" personalizzato che in realtà è un elemento LABEL modificato. Quando si fa clic su questo elemento LABEL, viene visualizzata la finestra per la selezione di un file e il file scelto andrà nel campo di input del file reale.
Inoltre, puoi manipolare l'aspetto e il comportamento come desideri (ad esempio: ottenere il nome del file selezionato dal file di input del file, dopo averlo selezionato, e mostrarlo da qualche parte. L'elemento LABEL non lo fa automaticamente, ovviamente, di solito lo metto solo all'interno dell'ETICHETTA, come contenuto testuale).
Attenzione però! La manipolazione dell'aspetto e del comportamento di questo è limitata a qualsiasi cosa tu possa immaginare e pensare. ;-) ;-)
Sono riuscito con un semplice $ (...). Click (); con JQuery 1.6.1
ho avuto problemi con la convalida lato client personalizzata <input type="file"/>
durante l'utilizzo di un pulsante falso per attivarlo e la soluzione di @Guillaume Bodi ha funzionato per me (anche con opacity: 0;
su Chrome)
$("#MyForm").on("click", "#fake-button", function () {
$("#uploadInput").focus().trigger("click");
});
e stile CSS per l'input di upload
#uploadInput {
opacity: 0.0;
filter: alpha(opacity=0); /* IE lt 8 */
-ms-filter: "alpha(opacity=0)"; /* IE 8 */
-khtml-opacity: 0.0; /* Safari 1.x */
-moz-opacity: 0.0;
}
Prova questo, è un trucco. Posizione: assoluto è per Chrome e trigger ("modifica") è per IE.
var hiddenFile = $("<input type=\"file\" name=\"file\" id=\"file1\" style=\"position:absolute;left:-9999px\" />");
$('body').append(hiddenFile);
$('#aPhotoUpload').click(function () {
hiddenFile.trigger('click');
if ($.browser.msie)
hiddenFile.trigger('change');
});
hiddenFile.change(function (e) {
alert('TODO');
});
$.browser
è deprecato nelle versioni più recenti di jQuery
Questa è probabilmente la risposta migliore, tenendo presente i problemi del browser incrociato.
CSS:
#file {
opacity: 0;
width: 1px;
height: 1px;
}
JS:
$(".file-upload").on('click',function(){
$("[name='file']").click();
});
HTML:
<a class="file-upload">Upload</a>
<input type="file" name="file">
Penso di capire il tuo problema, perché ne ho uno simile. Quindi il tag <label>
ha l'attributo per, puoi usare questo attributo per collegare il tuo input con type = "file". Ma se non vuoi attivarlo usando questa etichetta perché alcune regole del tuo layout, puoi fare così.
$(document).ready(function(){
var reference = $(document).find("#main");
reference.find(".js-btn-upload").attr({
formenctype: 'multipart/form-data'
});
reference.find(".js-btn-upload").click(function(){
reference.find("label").trigger("click");
});
});
.hide{
overflow: hidden;
visibility: hidden;
/*Style for hide the elements, don't put the element "out" of the screen*/
}
.btn{
/*button style*/
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<div id="main">
<form enctype"multipart/formdata" id="form-id" class="hide" method="post" action="your-action">
<label for="input-id" class="hide"></label>
<input type="file" id="input-id" class="hide"/>
</form>
<button class="btn js-btn-upload">click me</button>
</div>
Naturalmente lo adatterai per il tuo scopo e layout, ma è il modo più semplice che conosco per farlo funzionare !!
Sulla base della risposta di Guillaume Bodi ho fatto questo:
$('.fileinputbar-button').on('click', function() {
$('article.project_files > header, article.upload').show();
$('article.project_files > header, article.upload header').addClass('active');
$('.file_content, article.upload .content').show();
$('.fileinput-button input').focus().click();
$('.fileinput-button').hide();
});
il che significa che è nascosto per cominciare e quindi visualizzato per il trigger, quindi nascosto di nuovo immediatamente.