JQuery kullanarak bir yükleme kutusunu (gözat düğmesi) tetiklemeye çalışıyorum.
Şimdi denedim yöntemi:
$('#fileinput').trigger('click');
Ama işe yaramıyor gibi görünüyor. Lütfen yardım et. Teşekkür ederim.
JQuery kullanarak bir yükleme kutusunu (gözat düğmesi) tetiklemeye çalışıyorum.
Şimdi denedim yöntemi:
$('#fileinput').trigger('click');
Ama işe yaramıyor gibi görünüyor. Lütfen yardım et. Teşekkür ederim.
Yanıtlar:
Bu bir güvenlik kısıtlamasından kaynaklanmaktadır.
Güvenlik kısıtlamasının yalnızca veya olarak <input type="file"/>ayarlandığında olduğunu öğrendim .display:none;visbilty:hidden
İ ayarlayarak görünümün dışında konumlandırarak çalıştı Yani position:absoluteve top:-100px;ve işte budur çalışıyor.
bkz. http://jsfiddle.net/DSARd/1/
buna bir hack deyin.
Umarım bu işe yarar.
left: -100px;. Bir sayfanın ne kadar uzun olabileceğini asla bilemezsiniz
bu benim için çalıştı:
JS:
$('#fileinput').trigger('click');
HTML:
<div class="hiddenfile">
<input name="upload" type="file" id="fileinput"/>
</div>
CSS:
.hiddenfile {
width: 0px;
height: 0px;
overflow: hidden;
}
>>> Çapraz Tarayıcıda çalışan bir tane daha: <<<
Fikir, özel düğmenizin üzerine görünmez bir büyük "Gözat" düğmesine bindirmenizdir. Kullanıcı özel düğmenizi tıkladığında, gerçekte yerel giriş alanının "Gözat" düğmesini tıklar.
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());
});
});
heightdeğiştirilmesi önerilirheight: 100%
LABEL öğesini ex.
<div>
<label for="browse">Click Me</label>
<input type="file" id="browse" name="browse" style="display: none">//
</div>
Bu giriş dosyasını tetikleyecektir
IE8 +, son FF ve krom çalışma (= test edilmiş) var:
$('#uploadInput').focus().trigger('click');
Anahtar, tıklamayı tetiklemeden önce odaklanır (aksi takdirde krom onu yok sayar).
Not: girişinizin görüntülenmesi ve görünür olması gerekir (olduğu gibi, değil display:noneve değil visibility:hidden). Girişi (daha önce olduğu gibi) kesinlikle girişi konumlandırıp ekrandan atmanızı öneririm.
#uploadInput {
position: absolute;
left: -9999px;
}
Kemanımı kontrol et.
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 , gizlendiğinde yoksayılan dosya giriş öğesine ilişkin çivilenmiştir. Ayrıca birçok kişinin eleman boyutunu 0'a kaydırdığını veya konumlandırma ve taşma ayarlarıyla sınırların dışına çıkardığını fark ettim. Bunların hepsi harika fikirler.
Mükemmel bir şekilde iyi işleyen alternatif bir yol da opaklığı 0'a ayarlamaktır . Ardından, diğer öğeleri dengelemesini engellemek için konumu her zaman ayarlayabilirsiniz gizle gibi . Bir öğeyi herhangi bir yönde yaklaşık 10K piksel kaydırmak biraz gereksiz görünüyor.
İşte bir tane isteyenler için küçük bir örnek:
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);
}
Sadece merak uğruna, DOM ağacına eklemeden dinamik olarak bir yükleme formu ve giriş dosyası oluşturarak istediğiniz gibi bir şey yapabilirsiniz:
$('.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();
});
UploadForm'u DOM'ye eklemenize gerek yok.
Doğru kod:
<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>
Amaç ve tasarım gereği. Bu bir güvenlik sorunu.
Aslında, bunun için gerçekten kolay bir yöntem buldum:
$('#fileinput').show().trigger('click').hide();
Bu şekilde, dosya giriş alanınızın hiçbiri üzerinde css özelliği görüntülenebilir ve yine de ticareti kazanabilirsiniz :)
Cevap vermek için çok geç ama bence bu minimal kurulum en iyi sonucu veriyor. Ben de aynısını arıyorum.
<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;
}
Bu çok eski bir soru, ancak maalesef bu konu hala alakalı ve bir çözüm gerektiriyor.
Geldiğim (şaşırtıcı derecede basit) çözüm, gerçek dosya giriş alanını "gizlemek" ve bir LABEL etiketi ile sarmaktır (geliştirme için Bootstrap ve HTML5'e dayanabilir).
See here:Burada örnek kod
Bu şekilde, gerçek dosya giriş alanı görünmez olur ve gördüğünüz tek şey, aslında değiştirilmiş bir LABEL öğesi olan özelleştirilmiş "düğme" dir. Bu ETİKET öğesini tıkladığınızda, bir dosya seçme penceresi açılır ve seçtiğiniz dosya gerçek dosya giriş alanına girer.
Bunun üzerine, görünümü ve davranışı istediğiniz gibi değiştirebilirsiniz (örneğin: seçildikten sonra seçilen dosyanın adını dosya girdi dosyasından alın ve bir yerde gösterin. LABEL öğesi bunu otomatik olarak yapmaz, Genellikle metin içeriği olarak LABEL'in içine koydum).
Yine de dikkat edin! Bunun görünüşünün ve davranışının manipülasyonu, hayal edebileceğiniz ve düşünebileceğiniz her şeyle sınırlıdır. ;-) ;-)
Basit bir $ (...) ile başardım. Click (); JQuery 1.6.1 ile
i <input type="file"/>tetiklemek için sahte bir düğme kullanırken özel istemci tarafı doğrulama ile ilgili sorunlar vardı ve @Guillaume Bodi çözümü (ayrıca opacity: 0;krom ile) benim için çalıştı
$("#MyForm").on("click", "#fake-button", function () {
$("#uploadInput").focus().trigger("click");
});
ve yükleme girişi için css stili
#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;
}
Bunu dene, bu bir hack. Konum: mutlak Chrome içindir ve tetikleyici ('değişiklik') IE içindir.
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: jQuery
Bu, çapraz tarayıcı sorunlarını göz önünde bulundurarak muhtemelen en iyi cevaptır.
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">
Sanırım problemini anlıyorum, çünkü benzerim var. Bu nedenle etiketin <label>özniteliği vardır, girişinizi type = "file" ile bağlamak için bu özniteliği kullanabilirsiniz. Ancak, düzeninizin bir kuralı olduğu için bu etiketi kullanarak bunu etkinleştirmek istemiyorsanız, bunu yapabilirsiniz.
$(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>
Tabii ki bunu kendi amacınız ve düzeniniz için uyarlayacaksınız, ancak bu çalışmayı daha kolay biliyorum!
Guillaume Bodi'nin cevabına dayanarak bunu yaptım:
$('.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();
});
Bu, tetikleyici ile başlamak ve sonra görüntülenmek ve sonra tekrar tekrar gizlemek anlamına gelir.