Ich versuche mit jQuery eine Upload-Box (Schaltfläche zum Durchsuchen) auszulösen.
Die Methode, die ich jetzt ausprobiert habe, ist:
$('#fileinput').trigger('click');
Aber es scheint nicht zu funktionieren. Bitte helfen Sie. Danke dir.
Ich versuche mit jQuery eine Upload-Box (Schaltfläche zum Durchsuchen) auszulösen.
Die Methode, die ich jetzt ausprobiert habe, ist:
$('#fileinput').trigger('click');
Aber es scheint nicht zu funktionieren. Bitte helfen Sie. Danke dir.
Antworten:
Dies ist auf eine Sicherheitsbeschränkung zurückzuführen.
Ich habe herausgefunden, dass die Sicherheitsbeschränkung nur dann besteht, wenn das <input type="file"/>
auf display:none;
oder eingestellt ist visbilty:hidden
.
Also versuchte ich es aus dem Bildfenster , indem die Positionierung position:absolute
und top:-100px;
und voilà es funktioniert.
siehe http://jsfiddle.net/DSARd/1/
Nennen wir es einen Hack.
Hoffe das funktioniert bei dir.
left: -100px;
. Sie wissen nie, wie lange eine Seite sein könnte
das hat bei mir funktioniert:
JS:
$('#fileinput').trigger('click');
HTML:
<div class="hiddenfile">
<input name="upload" type="file" id="fileinput"/>
</div>
CSS:
.hiddenfile {
width: 0px;
height: 0px;
overflow: hidden;
}
>>> Eine andere, die Cross-Browser funktioniert: <<<
Die Idee ist, dass Sie eine unsichtbare riesige Schaltfläche "Durchsuchen" über Ihre benutzerdefinierte Schaltfläche legen. Wenn der Benutzer auf Ihre benutzerdefinierte Schaltfläche klickt, klickt er tatsächlich auf die Schaltfläche "Durchsuchen" des nativen Eingabefelds.
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
empfohlen, zuheight: 100%
Sie können das LABEL-Element ex verwenden.
<div>
<label for="browse">Click Me</label>
<input type="file" id="browse" name="browse" style="display: none">//
</div>
Dies löst die Eingabedatei aus
Ich habe es funktioniert (= getestet) in IE8 +, aktuelle FF und Chrome:
$('#uploadInput').focus().trigger('click');
Die Taste fokussiert vor dem Auslösen des Klicks (andernfalls wird er von Chrome ignoriert).
Hinweis: Sie MÜSSEN Ihre Eingabe anzeigen und sichtbar machen (wie in, nicht display:none
und nicht visibility:hidden
). Ich schlage vor (wie viele andere zuvor), den Eingang absolut zu positionieren und vom Bildschirm zu werfen.
#uploadInput {
position: absolute;
left: -9999px;
}
Schau dir meine Geige an.
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 hat es geschafft, dass das Dateieingabeelement ignoriert wird, wenn es ausgeblendet ist. Ich bemerkte auch, dass viele Leute die Elementgröße auf 0 verschoben oder sie durch Positionierungs- und Überlaufanpassungen aus dem Rahmen schoben. Das sind alles großartige Ideen.
Eine alternative Methode, die ebenfalls einwandfrei zu funktionieren scheint, besteht darin , die Deckkraft auf 0 zu setzen . Dann können Sie immer nur die Position festlegen, um zu verhindern, dass andere Elemente wie beim Ausblenden versetzt werden. Es scheint nur ein wenig unnötig, ein Element um fast 10 KB Pixel in eine beliebige Richtung zu verschieben.
Hier ist ein kleines Beispiel für diejenigen, die eines wollen:
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);
}
Aus Neugier können Sie etwas tun, was Sie möchten, indem Sie dynamisch ein Upload-Formular und eine Eingabedatei erstellen, ohne sie dem DOM-Baum hinzuzufügen:
$('.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();
});
Sie müssen die uploadForm nicht zum DOM hinzufügen.
Richtiger Code:
<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>
Das ist absichtlich und beabsichtigt. Es ist ein Sicherheitsproblem.
Eigentlich habe ich eine wirklich einfache Methode dafür gefunden, nämlich:
$('#fileinput').show().trigger('click').hide();
Auf diese Weise kann in Ihrem Dateieingabefeld die CSS-Eigenschaft auf keiner angezeigt werden und trotzdem den Handel gewinnen :)
Es ist zu spät, um zu antworten, aber ich denke, dass dieses minimale Setup am besten funktioniert. Ich suche auch das gleiche.
<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;
}
Dies ist eine sehr alte Frage, aber leider ist dieses Problem immer noch relevant und erfordert eine Lösung.
Die (überraschend einfache) Lösung, die ich mir ausgedacht habe, besteht darin, das eigentliche Dateieingabefeld zu "verbergen" und es mit einem LABEL-Tag zu versehen (kann zur Verbesserung auf Bootstrap und HTML5 basieren).
See here:
Beispielcode hier
Auf diese Weise ist das Eingabefeld für die reale Datei unsichtbar und Sie sehen nur die angepasste "Schaltfläche", die tatsächlich ein modifiziertes LABEL-Element ist. Wenn Sie auf dieses LABEL-Element klicken, wird das Fenster zur Auswahl einer Datei geöffnet und die von Ihnen ausgewählte Datei wird in das Eingabefeld für die reale Datei verschoben.
Darüber hinaus können Sie das Aussehen und Verhalten nach Ihren Wünschen ändern (z. B. den Namen der ausgewählten Datei nach der Auswahl aus der Dateieingabedatei abrufen und irgendwo anzeigen. Das LABEL-Element führt dies nicht automatisch aus. Natürlich. Normalerweise lege ich es einfach als Textinhalt in das ETIKETT.
Aber Vorsicht! Die Manipulation des Aussehens und Verhaltens ist auf alles beschränkt, was Sie sich vorstellen und denken können. ;-) ;-)
Ich habe es mit einem einfachen $ (...) geschafft. Click (); mit JQuery 1.6.1
Ich hatte Probleme mit der benutzerdefinierten clientseitigen Validierung, <input type="file"/>
während ich eine gefälschte Schaltfläche zum Auslösen verwendete, und die Lösung von @Guillaume Bodi funktionierte für mich (auch mit opacity: 0;
auf Chrom).
$("#MyForm").on("click", "#fake-button", function () {
$("#uploadInput").focus().trigger("click");
});
und CSS-Stil für Upload-Eingabe
#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;
}
Versuchen Sie dies, es ist ein Hack. Die Position: absolut ist für Chrome und Trigger ('change') ist für 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
in neueren Versionen von jQuery
Dies ist wahrscheinlich die beste Antwort, wenn man die browserübergreifenden Probleme berücksichtigt.
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">
Ich glaube, ich verstehe dein Problem, weil ich ein ähnliches habe. Damit das Tag <label>
das Attribut für hat, können Sie dieses Attribut verwenden, um Ihre Eingabe mit type = "file" zu verknüpfen. Wenn Sie dies jedoch nicht mit dieser Bezeichnung aktivieren möchten, weil dies eine Regel Ihres Layouts ist, können Sie dies tun.
$(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>
Natürlich werden Sie dies für Ihren eigenen Zweck und Ihr eigenes Layout anpassen, aber das ist der einfachere Weg, den ich kenne, damit es funktioniert !!
Basierend auf Guillaume Bodis Antwort habe ich Folgendes getan:
$('.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();
});
Das heißt, es wird zunächst ausgeblendet und dann für den Auslöser angezeigt und dann sofort wieder ausgeblendet.