JavaScript'te dosya iletişim kutusunu aç


109

Dosya aç iletişim kutusunu HTML'de görüntülemek için bir çözüme ihtiyacım var div. Dosya aç iletişim kutusu divtıklandığında açılmalıdır .

Girdi dosyası kutusunu HTML sayfasının bir parçası olarak görüntülemek istemiyorum. Web sayfasının bir parçası olmayan ayrı bir iletişim kutusunda görüntülenmelidir.


4
Bir uyarı, bir dosya diyaloğu değil mi? - Ne istediğini açıklayabilir misin?
LiamB

3
Sanırım standart "açık dosya" açılır
penceresini

1
bir div tıklandığında açık dosya iletişim kutusuna ihtiyacım var. web sayfasının parçası olmayan bir uyarı gibi olmalıdır
ArK

Yanıtlar:


52

İşte güzel bir tane

Fine Uploader demosu

Bir <input type='file' />kontrolün kendisidir. Ancak bunun üzerine bir div yerleştirilir ve bu hissi elde etmek için css stilleri uygulanır. Dosya kontrolünün opaklığı 0'a ayarlanmıştır, böylelikle div tıklandığında iletişim penceresi açılır.


1
görüntülenen dosyaları javascript ile kontrol etmenin bir yolu var mı ... Diyelim ki dosya diyaloğunu açmak istediğimi ve sadece .pdf ile dosya uzantısının görüntülenmesini istedim ..
Ajax3.14

1
@ Ajax3.14 yeni tarayıcılarda FileReader nesnesi bulunur, eski tarayıcılarda değeri kullanmanız ve dosya uzantısını aramanız gerekir.
Vicary

2
@ Ajax3.14 FileReader kullanmaya veya uzantıları ayrıştırmaya gerek yok. Birçok tarayıcı, dosya girişlerinde kabul özelliğini destekler. Bu, dosya tarayıcısı iletişim kutusunda görüntülenen dosya türlerini sınırlamanıza olanak tanır. İnce Yükleyici, doğrulama seçeneğinin acceptFiles özelliği aracılığıyla bu işleve erişim sağlar. Daha fazla ayrıntı için seçenek belgelerinin doğrulama bölümüne bakın. Accept özniteliğinin IE9 veya öncesinde desteklenmediğini unutmayın.
Ray Nicholus

1
nasıl olur bu iyi bu hiç de iyi bir uygulama mı? böyle bir şey olmamalı: stackoverflow.com/a/18659941/915865 ?
Kat Lim Ruiz

1
@KatLimRuiz Hayır, bağlantı kurduğunuz yanıt iyi bir çözüm değil. Bu, ilişkili formu programlı olarak da göndermeniz durumunda IE'nin bir hata vermesine neden olur.
Ray Nicholus

77

    $("#logo").css('opacity','0');
    
    $("#select_logo").click(function(e){
       e.preventDefault();
       $("#logo").trigger('click');
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" id="select_logo">Select Logo</a> <input type="file" id="logo">

IE için şunu ekleyin:

$("#logo").css('filter','alpha(opacity = 0');

3
#Select_logo tıklama işleyicisinde neden yanlış döndürüyorsunuz?
Sethish

4
Bir 404 hatası üretmez, sadece sonuna # eklenmiş olarak geçerli sayfaya gitmeyi dener. Bu, sayfanın en üste atlamasını sağlar. Yani orada olmak güzel, sadece farklı bir sebeple :)
manavo

3
Yeterince test etmemiş olsam da, "görünürlük: gizli"; daha uyumlu görünüyor. Ayrıca, opaklık: 0'a rağmen, "görünmez" öğe tıklandığında bir tıklama olayı tetiklenirken, görünürlük: gizli tetiklenmeyecektir.
Aron

MDN bunun document.getElementById("logo").click()yeterli olduğunu gösterir . Ayrıca başka bir şekilde "Sürükle ve Bırak" gösterirler. developer.mozilla.org/en-US/docs/Web/API/File/…
Eric

2
Bunu normal Javascript'e dönüştürmelisiniz, JQuery bu kadar küçük bir projede kullanmak için mantıklı değil ^ _ ^
Mister SirCode

57

Neden kimsenin buna işaret etmediğini bilmiyorum ama işte bunu herhangi bir Javascript olmadan yapmanın bir yolu ve ayrıca herhangi bir tarayıcıyla da uyumlu.


DÜZENLEME: Safari'de, inputile gizlendiğinde devre dışı bırakılır display: none. Kullanmak daha iyi bir yaklaşım olacaktır position: fixed; top: -100em.


<label>
  Open file dialog
  <input type="file" style="position: fixed; top: -100em">
</label>

İsterseniz gidebilirsiniz "Doğru yolu" kullanarak foriçinde labelhiç işaret idböyle girdi:

<label for="inputId">file dialog</label>
<input id="inputId" type="file" style="position: fixed; top: -100em">

4
bu cazibe gibi çalışır, ancak, işte bazı öneriler: 1. <input>etiketin nameniteliği olmalıdır ; 2. foröznitelik belirtilmişse, <input>dosya etiketi bir id.
Raptor

5
Simplicity is the ultimate sophistication
ncubica

2
harika! bir arka plan resmiyle veya etiketin javascript tetiklemeli bir tıklama almasını sağlasa bile bir cazibe gibi çalışır. Teşekkürler!
Leo Nomdedeu

2
BTW, birisi bu çözüme işaret etti, Safari'de gizli girişler display: nonedevre dışı bırakıldı. Çözüm, girdiyi gizlemek için farklı bir yaklaşım kullanıyor. Cevabı bunu yansıtacak şekilde güncelleyeceğim.
JP de la Torre

1
@JPdelaTorre Girişi gizlemek yerine opaklık: 0 kullanmanız çok daha iyi olurdu.
Adrian

39

Aslında, opaklık, görünürlük, <input>stil vb. İle ilgili tüm bu şeylere ihtiyacınız yok . Sadece bir göz atın:

<a href="#">Just click me.</a>
<script type="text/javascript">
    $("a").click(function() {
        // creating input on-the-fly
        var input = $(document.createElement("input"));
        input.attr("type", "file");
        // add onchange handler if you wish to get the file :)
        input.trigger("click"); // opening dialog
        return false; // avoiding navigation
    });
</script>

JsFiddle üzerinde demo . Chrome 30.0 ve Firefox 24.0'da test edilmiştir. Ancak Opera 12.16'da çalışmadı.


3
Bu doğru cevap olmalı. Tam bir Javascript uygulaması için, herhangi bir HTML kodunu değiştirmenize gerek yoktur.
Zhang Buzz

21
Aptalca bir soru, ama daha sonra seçilen dosyayı nasıl elde edersiniz?
Jay Wick

2
Bu, beklenmedik sorunlara neden olabilecek tehlikeli bir çözümdür. Örneğin, bazı tarayıcılar (IE gibi), dosya girişi de programlı olarak açılmışsa programlı bir form gönderimini engelleyebilir. Bu sorunu çözmenin en iyi yolu JavaScript değil CSS kullanmaktır.
Ray Nicholus

3
@Charleston Maalesef bazı tarayıcılarda çalışmıyor. Yine de çalışmasını sağlamalılar :)
Tigran Saluev

3
2020 itibariyle, bu çözüm en güzel görünüyor. BrowserStack'te Edge, Safari, Opera, Firefox ve Chrome'da test etti. Hepsinde çalışıyor.
V.Rubinetti

14

Benim için en iyi sonuç veren buydu (IE8, FF, Chrome, Safari'de test edildi).

#file-input {
  cursor: pointer;
  outline: none;
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  overflow: hidden;
  filter: alpha(opacity=0); /* IE < 9 */
  opacity: 0;
}
.input-label {
  cursor: pointer;
  position: relative;
  display: inline-block;
}
<label for="file-input" class="input-label">
  Click Me <!-- Replace with whatever text or icon you wish to use -->
  <input type="file" id="file-input">
</label>

Açıklama: Dosya girişini, tıklanacak öğenin hemen üzerine yerleştirdim, böylece herhangi bir tıklama ya üzerine ya da etiketi üzerine gelirdi (bu, tıpkı etiketin kendisine tıklamışsınız gibi yükleme iletişim kutusunu açar). Varsayılan girişin düğme kısmının etiketin kenarından dışarı çıkmasıyla ilgili bazı sorunlar yaşadım, bu nedenle overflow: hiddengirişte ve display: inline-blocketikette gerekliydi.


1
Girişi maksimize edin ve opaklığı sıfıra ayarlayın. Bu harika çalışıyor!
Kinorsi

13

İstemci makinesinde javascript Kapalıysa ne olur? Tüm senaryolar için aşağıdaki çözümü kullanın. Hatta javascript / jQuery'ye ihtiyacınız yok. :

HTML

<label for="fileInput"><img src="File_upload_Img"><label>
<input type="file" id="fileInput"></label>

CSS

#fileInput{opacity:0}  
body{
    background:cadetblue;
}

Açıklama: for="Your input Id". Varsayılan olarak HTML ile tıklama olayını tetikler. Bu yüzden varsayılan olarak tıklama olayını tetikler, jQuery / javascript'e gerek yoktur. Basitçe HTML ile yapılıyorsa neden jQuery / jScript kullanılsın? Ve istemcinin JS'yi devre dışı bırakıp bırakmadığını anlayamazsınız. JS kapalı olsa bile özelliğiniz çalışmalıdır.

Çalışma jsFiddle (JS, jquery'ye ihtiyacınız yok)


3
Neden arka plan?
Solomon Ucko

12

Önce başlık etiketlerini ekleyin :

<script>
   function showDialog(openFileDialog) {
       document.getElementById(openFileDialog).click();
   }
   function fileName(openFileDialog) {
       return document.getElementById(openFileDialog).value;
   }
   function hasFile(openFileDialog) {
       return document.getElementById(openFileDialog).value != "";
   }
   function fileNameWithoutFakePath(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(fileName.lastIndexOf('\\') + 1);
   }
   function fakePathWithoutFileName(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(0, fileName.lastIndexOf('\\'));
   }
</script>

zaten senaryonuz varsa etiketleriniz varsa, bu işlevleri yukarıya eklemeniz yeterlidir.

Sizin de vücudun veya formu ekleyerek etiketleri:

<input type="file" style="display:none" id="yourDesiredOrFavoriteNameForTheNewOpenFileDialogInstance"/>

HTML'nizin neresinde olursa olsun, tıpkı kodunuzda veya xaml'de nerede olursa olsun, ancak komut dosyanızda veya kodunuzda global değişken olarak adı öğenin kimliği olan yeni bir OpenFileDialog sınıfı örneği oluşturmuş olmanız gibidir. , sen yapamazsın eleman input type = "file" tanımlanmamış olanlar bunu küresel fonksiyonlar olduğundan, onun adını yazın ve sonra bir işlevi bir özellik okumak veya arayın. Bu işlevlere, dizge olarak OpenFileDialog örneğinin adı olan gizli girdi türü = "dosya" kimliğini vermeniz yeterlidir.

HTML'nizde açık dosya diyalog örnekleri oluştururken hayatınızı kolaylaştırmak için, bunu yapan bir işlev yapabilirsiniz:

function createAndAddNewOpenFileDialog(name) {
     document.getElementById("yourBodyOrFormId").innerHtml += "<input type='file' style='display:none' id='" + name + "'/>"
}

ve açık dosya iletişim kutusunu kaldırmak isterseniz, aşağıdaki işlevi oluşturabilir ve kullanabilirsiniz:

function removeOpenFileDialog(name) {
    var html = document.getElementById("yourBodyOrFormId").innerHtml;
    html = html.replace("<input type='file' style='display:none' id='" + name + "'/>", "");
    document.getElementById("yourBodyOrFormId").innerHtml = html;
}

ancak açık dosya iletişim kutusunu kaldırmadan önce, aşağıdaki işlevi yaparak ve kullanarak var olduğundan emin olun:

function doesOpenFileDialogExist(name) {
    return document.getElementById("yourBodyOrFormId").innerHtml.indexOf("<input type='file' style='display:none' id='" + name + "'/>") != -1
}

ve html'deki gövde veya form etiketlerinde dosya açma diyalogları oluşturmak ve eklemek istemiyorsanız , çünkü bu gizli input type = "file" s ekliyor, o zaman yukarıdaki create işlevini kullanarak bunu komut dosyasında yapabilirsiniz :

function yourBodyOrFormId_onload() {
    createAndAddNewOpenFileDialog("openFileDialog1");
    createAndAddNewOpenFileDialog("openFileDialog2");
    createAndAddNewOpenFileDialog("openFileDialog3");
    createAndAddNewOpenFileDialog("File Upload");
    createAndAddNewOpenFileDialog("Image Upload");
    createAndAddNewOpenFileDialog("bla");
    //etc and rest of your code
}

Gövde veya form etiketlerinizin yakınına şunları eklediğinizden emin olun:

onload="yourBodyOrFormId_onload()"

Zaten yaptıysanız, yukarıdaki satırı yapmak zorunda değilsiniz.

İPUCU: Henüz sahip değilseniz, projenize veya web sitenize yeni JScript Dosyası ekleyebilir ve bu dosyada tüm açık dosya diyalog işlevlerini komut dosyası etiketlerinden ve html veya web form sayfasından uzağa koyabilir ve bunları bu JScript dosyasından html veya web formu sayfanıza ekleyin, ancak html veya web formu sayfasını elbette JScript dosyasına bağlamayı unutmayın. Bunu yalnızca JScript dosyasını html sayfanıza sürükleyerek yapabilirsiniz. kafaetiketleri. Sayfanız web formuysa ve basit html değilse ve head etiketleriniz yoksa, çalışabilmesi için herhangi bir yere koyun. Bu JScript Dosyasında, değeri sizin bedeniniz olacak veya dizge olarak id oluşturacak global değişken tanımlamayı unutmayın. JScript dosyasını html veya web formu sayfanıza bağladıktan sonra, form gövdenizin olayını yükleyebilir, bu değişkenin değerini bedeninize veya form kimliğinize ayarlayabilirsiniz. Daha sonra JScript Dosyasında, artık belgeye gövde kimliğini veya bir sayfanın formunu vermeniz gerekmez, ona sadece o değişkenin değerini verin. Bu değişken bodyId veya formId veya bodyOrFormId veya istediğiniz başka bir adı çağırabilirsiniz .

İyi şanslar dostum!


1
InteriorHTML'yi doğrudan değiştirmemek en iyisidir.
Solomon Ucko

9

En basit yol:

#file-input {
  display: none;
}
<label for="file-input">
  <div>Click this div and select a file</div>
</label>
<input type="file" id="file-input"/>

Önemli olan, öğesinin kullanımı display: none, gizli dosya girdisi tarafından hiçbir yerin işgal edilmemesini sağlar (ne olursa olsun opacity: 0).



2

Tek olmayan <input type="file">, div üzerine şeffaf bir flash film yerleştirmektir. Daha sonra flash'ın FileReference.browse'ı için bir çağrıyı tetiklemek için kullanıcı tarafından oluşturulan bir tıklama olayını (Flash 10 yeni güvenlik kurallarıyla uyumlu) kullanabilirsiniz. .

Tuhaf mod yöntemine göre ek bir bağımlılık sunar, ancak karşılığında çok daha fazla olay (yerleşik ilerleme olayları gibi) alırsınız.


-1

Kullanabilir

$('<input type="file" />').click()

benim durumumda, bu, orijinal tıklama olayının meydana geldiği aynı sayfaya otomatik yeniden yönlendirmeye neden olur - tüm sayfanın yeniden yüklenmesine ve sayfaya önceden girilmiş tüm verilerin kaybolmasına neden olur.
Muntasir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.