J'essaie de déclencher une boîte de téléchargement (bouton Parcourir) en utilisant jQuery.
La méthode que j'ai essayée maintenant est:
$('#fileinput').trigger('click');
Mais cela ne semble pas fonctionner. Veuillez aider. Je vous remercie.
J'essaie de déclencher une boîte de téléchargement (bouton Parcourir) en utilisant jQuery.
La méthode que j'ai essayée maintenant est:
$('#fileinput').trigger('click');
Mais cela ne semble pas fonctionner. Veuillez aider. Je vous remercie.
Réponses:
Cela est dû à une restriction de sécurité.
J'ai découvert que la restriction de sécurité est uniquement lorsque le <input type="file"/>
est défini sur display:none;
ou est visbilty:hidden
.
J'ai donc essayé le positionner en dehors de la fenêtre en définissant position:absolute
et top:-100px;
et cela fonctionne le tour est joué.
voir http://jsfiddle.net/DSARd/1/
appelez ça un hack.
J'espère que cela fonctionne pour vous.
left: -100px;
. Vous ne savez jamais combien de temps peut durer une page
cela a fonctionné pour moi:
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 autre qui fonctionne Cross-Browser: <<<
L'idée est que vous superposiez un énorme bouton "Parcourir" invisible sur votre bouton personnalisé. Ainsi, lorsque l'utilisateur clique sur votre bouton personnalisé, il clique en fait sur le bouton "Parcourir" du champ de saisie natif.
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
est suggéré de passer àheight: 100%
Vous pouvez utiliser l'élément LABEL ex.
<div>
<label for="browse">Click Me</label>
<input type="file" id="browse" name="browse" style="display: none">//
</div>
Cela déclenchera le fichier d'entrée
Je le fais fonctionner (= testé) dans IE8 +, FF récent et chrome:
$('#uploadInput').focus().trigger('click');
La clé se concentre avant de déclencher le clic (sinon Chrome l'ignore).
Remarque: vous devez avoir votre entrée affichée et visible (comme dans, pas display:none
et non visibility:hidden
). Je suggère (comme beaucoup d'autres l'ont fait auparavant) de positionner absolument l'entrée et de la jeter hors de l'écran.
#uploadInput {
position: absolute;
left: -9999px;
}
Regarde mon violon.
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 l'a cloué sur le fait que l'élément d'entrée du fichier était ignoré lorsqu'il est masqué. J'ai également remarqué que de nombreuses personnes changeaient la taille de l'élément à 0 ou le poussaient hors des limites avec des ajustements de positionnement et de débordement. Ce sont toutes de bonnes idées.
Une autre façon qui semble également fonctionner parfaitement est de simplement définir l'opacité sur 0 . Ensuite, vous pouvez toujours simplement définir la position pour l'empêcher de compenser d'autres éléments comme le fait hide. Il semble juste un peu inutile de déplacer un élément de près de 10K pixels dans n'importe quelle direction.
Voici un petit exemple pour ceux qui en veulent un:
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);
}
Par simple curiosité, vous pouvez faire quelque chose comme vous le souhaitez en créant dynamiquement un formulaire de téléchargement et un fichier d'entrée, sans l'ajouter à l'arborescence 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();
});
Pas besoin d'ajouter le uploadForm au DOM.
Code correct:
<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>
C'est exprès et par conception. C'est un problème de sécurité.
En fait, j'ai découvert une méthode très simple pour cela, à savoir:
$('#fileinput').show().trigger('click').hide();
De cette façon, votre champ de saisie de fichier peut afficher la propriété css sur aucun et gagner la transaction :)
Il est trop tard pour répondre mais je pense que cette configuration minimale fonctionne le mieux. Je recherche également la même chose.
<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;
}
C'est une question très ancienne, mais malheureusement, ce problème est toujours d'actualité et nécessite une solution.
La solution (étonnamment simple) que j'ai trouvée est de "cacher" le champ d'entrée du fichier réel et de l'envelopper avec une balise LABEL (peut être basée sur Bootstrap et HTML5, pour une amélioration).
See here:
Exemple de code ici
De cette façon, le champ d'entrée du fichier réel est invisible et tout ce que vous voyez est le "bouton" personnalisé qui est en fait un élément LABEL modifié. Lorsque vous cliquez sur cet élément LABEL, la fenêtre de sélection d'un fichier apparaît et le fichier que vous choisissez ira dans le champ de saisie du fichier réel.
En plus de cela, vous pouvez manipuler l'apparence et le comportement à votre guise (par exemple: obtenir le nom du fichier sélectionné à partir du fichier d'entrée, après l'avoir sélectionné, et l'afficher quelque part. L'élément LABEL ne le fait pas automatiquement, Bien sûr, je le mets généralement à l'intérieur du LABEL, comme contenu textuel).
Attention cependant! La manipulation de l'apparence et du comportement de ceci est limitée à tout ce que vous pouvez imaginer et penser. ;-) ;-)
J'ai réussi avec un simple $ (...). Click (); avec JQuery 1.6.1
J'ai eu des problèmes avec la validation personnalisée côté client <input type="file"/>
pendant l'utilisation d'un faux bouton pour le déclencher et la solution de @Guillaume Bodi a fonctionné pour moi (également avec opacity: 0;
sur chrome)
$("#MyForm").on("click", "#fake-button", function () {
$("#uploadInput").focus().trigger("click");
});
et style css pour l'entrée de téléchargement
#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;
}
Essayez ceci, c'est un hack. la position: absolue est pour Chrome et le déclencheur («changement») est pour 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
c'est obsolète dans les nouvelles versions de jQuery
C'est probablement la meilleure réponse, en gardant à l'esprit les problèmes entre navigateurs.
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">
Je pense que je comprends votre problème, car j'ai un similaire. Donc, la balise <label>
a l'attribut pour, vous pouvez utiliser cet attribut pour lier votre entrée avec type = "file". Mais si vous ne voulez pas l'activer en utilisant cette étiquette parce que certaines règles de votre mise en page, vous pouvez faire comme ceci.
$(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>
Bien sûr, vous allez l'adapter à vos propres fins et mise en page, mais c'est le moyen le plus simple que je connaisse pour le faire fonctionner !!
Sur la base de la réponse de Guillaume Bodi, j'ai fait ceci:
$('.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();
});
ce qui signifie qu'il est masqué au départ, puis affiché pour le déclencheur, puis à nouveau masqué immédiatement.