"Dosya seç" iletişim kutusunu programlı olarak tetikler


100

Gizli bir dosya giriş öğem var. Dosya seçme iletişim kutusunu bir düğmenin tıklama olayından tetiklemek mümkün müdür ?

Yanıtlar:


146

Kullanmak yerine dosya yüklemek için kendi düğmenizin olmasını <input type="file" />istiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:

<input id="myInput" type="file" style="visibility:hidden" />
<input type="button" value="Show Dialog" onclick="$('#myInput').click();" />

visibility: hiddenBunun yerine kullandığımı unutmayın display: none. Görüntülenmeyen bir dosya girişinde tıklama olayını çağıramazsınız.


Temel durumlar için basittir, ancak birçok tarayıcıyla uyumlu değildir. Lütfen, Xeon06'nın cevabında belirtildiği gibi, bu çözümü dosya giriş elemanını opaklık: 0'da bir düğmenin üzerine yerleştirmekle birleştirmenin çok daha iyi bir fikir olduğunu unutmayın.
SquareCat

10
Güncelleme: Modern tarayıcılarda, DOM'da bile olmayan bir girişi tıklayabilirsiniz. Harika!
Adria

7
click()bir display:nonegirdiyi denedim ve işe yaradı
Daniel Cheung

15
Evet, 2015 yılında burada, eserleri click()olan bir unsur üzerinde display: none! ;) Son dört yılda işler nasıl değişti.
ffxsam

Sen kullanabilirsiniz hiddenyerine niteliğini style="visibility:hidden": <input id="myInput" type="file" hidden>( w3schools.com/tags/att_global_hidden.asp )
cespon

115

Buradaki yanıtların çoğu yararlı bilgilerden yoksundur:

Evet, jQuery / JavaScript kullanarak giriş öğesini programlı olarak tıklayabilirsiniz, ancak bunu yalnızca KULLANICI TARAFINDAN BAŞLATILMIŞ bir olaya ait bir olay işleyicisinde yaparsanız!

Yani, örneğin, siz, komut dosyası, ajax geri aramasında programlı olarak düğmeye tıklarsanız hiçbir şey olmaz, ancak aynı kod satırını kullanıcı tarafından oluşturulan bir olay işleyicisine koyarsanız, işe yarayacaktır.

PS debugger;Anahtar sözcük, programlı tıklamadan önceyse gözatma penceresini bozar ... en azından krom 33 ...


@LouisBataillard'ın haklı olarak bahsettiği gibi: yalnızca orijinal olay işleyicisinin kullanıcı tarafından başlatılması gerekmez; özellikle bir tıklama olayı olmalıdır. İşte bunu gösteren bir keman: bağlantı
Souhaieb Besbes

1
dinamik olarak oluşturulan bir şeye tıklayabilirsiniz. jquery, yani$(staticElementParent).on("click", "dynamicChild", function(){})
Daniel Cheung

1
TEŞEKKÜR EDERİM!!!! Tüm bu cevapları javascript konsolunda test ediyorum ve delirmeye başladım!
jdkealy

8
Yarım saattir programlı olarak bir dosya giriş penceresi sorarak mücadele ediyorum. BAŞKA KİMSE, etkinlik kullanıcı tarafından başlatılmadıysa bunun imkansız olduğunu belirtti ... çok fazla +1 hak ediyorsun.
Umagon

1
Chrome 62'den itibaren, debugger;anahtar kelime artık programlı tıklamayı
Chris W.

62

Sadece kayıt için, javascript gerektirmeyen alternatif bir çözüm var. Bir etikete tıklamanın ilgili girdiye odaklanmayı ayarlaması gerçeğinden yararlanarak, biraz hacklemektir.

Bir ihtiyaç <label>uygun olan for(bootstrap ile, kullanım Optionnaly bir düğme gibi tarz öznitelik (girişine puan), btn btn-default). Kullanıcı etiketi tıkladığında, iletişim kutusu açılır, örneğin:

<!-- optionnal, to add a bit of style -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<!-- minimal setup -->
<label for="exampleInput" class="btn btn-default">
  Click me
</label>
<input type="file" id="exampleInput" style="display: none" />


2
Bunu beğendim, Angular projeme tam jQuery eklemek istemiyorum, güzel çalışıyor :)
Starscream1984

1
bu davranış tüm modern tarayıcılarda güvenilir midir?
JoshuaDavid

Bu, yerel tarayıcı davranışını kullanarak herhangi bir JS olmadan çalışır. OnDrop etkinlikleriyle eşleştirildiğinde, zengin özelliklere sahip bir dosya yüklemesi uygulamak harika çalışıyor!
Yanick Rochon

CSS ile uğraşmak zorunda kaldım ama sonra işe yaradı - yani "display: none" olan dosya girişi görünürlüğü tüm tarayıcılarda uygun değil. (Ancak 0, vb. Opaklık kullanılabilir)
driftcatcher

13

Tarayıcıların type="file"öğelere yapılan tıklamaları nasıl işlediğinden emin değilim (güvenlik endişeleri ve hepsi), ancak bu işe yaramalı:

$('input[type="file"]').click();

Bu JSFiddle'ı Chrome, Firefox ve Opera'da test ettim ve hepsi dosya tarama iletişim kutusunu gösteriyor.


5
Bu, yalnızca "çağıran" olayın kendisi bir tıklama olayı olduğunda işe yarıyor gibi görünüyor. Örneğin, bir hoverolaya bağlı olarak dosya iletişim kutusunu açmak mümkün görünmüyor : jsfiddle.net/UQfaZ/1
Louis B.

Giriş DOM'da değilse bunun Selenium ile nasıl test edilebileceğini biliyor musunuz?
Sebastien Lorber

4

Ben sarmak input[type=file], bir etiket etiketi sonra stilini labelbeğeninize ve gizlemek input.

<label class="btn btn-default fileLabel" data-toggle="tooltip" data-placement="top" title="Upload">
    <input type="file">
    <span><i class="fa fa-upload"></i></span>
</label>

<style>
    .fileLabel input[type="file"] {
        position: fixed;
        top: -1000px;
    }
</style>

Tamamen CSS Çözümü.


Sadece set <input type="file" hidden>CSS stili uygulamak için ihtiyacı ortadan kaldırmak için.
Sylvain Lesage

3

Doğal olarak tek yol, bir <input type="file">öğe oluşturmak ve maalesef bir tıklamayı simüle etmektir .

Bunu her zaman yapmak zorunda kalmanın acısını ortadan kaldıracak küçük bir eklenti (utanmaz eklenti) var: file-dialog

fileDialog()
    .then(file => {
        const data = new FormData()
        data.append('file', file[0])
        data.append('imageName', 'flower')

        // Post to server
        fetch('/uploadImage', {
            method: 'POST',
            body: data
        })
    })

3

En iyi çözüm, mobil cihazlarda bile tüm tarayıcılarda çalışır.

<div class="btn" id="s_photo">Upload</div>

<input type="file" name="s_file" id="s_file" style="opacity: 0;">';

<!--jquery-->

<script>
    $("#s_photo").click(function() {
        $("#s_file").trigger("click");
    });
</script>

Girdi dosyası türünü gizlemek tarayıcılarda sorunlara neden olur, opaklık en iyi çözümdür çünkü gizlenmez, sadece gösterilmez. :)


1
bunun bir jquery referansı gerektirdiğini belirtmelisiniz.
Brino

Opaklık tamamen ilgisiz bir kavram içerir - "şeffaf" unsur ile düzeninizi etkilemiyorsa sadece şanslısınız. Öğe orada olmalı, ancak görünmemelidir, bu nedenle visibility:hiddendaha iyi bir seçim olmalıdır.
conny

visibility: hiddenyine de düzeni etkiler. display: noneistediğin şey.
stommestack

1

Güvenlik nedeniyle tarayıcılar arası bunu yapmanın bir yolu yoktur. İnsanların genellikle yaptığı şey, girdi dosyasını başka bir şeyin üzerine yerleştirmek ve görünürlüğünü gizli olarak ayarlamak, böylece kendi başına tetiklenmesini sağlamaktır. Daha fazla bilgi burada.


2
OP bahsediyor <input type="file">, değil <select>.
Bojangles

Problem değil. Bunu daha önce kendim yaptım. Düzenlemenizle yanıt olarak, orada olup bunu yapmanın bir yolu; jQuery ile öğenin tıklama olayını tetikleyerek $.click().
Bojangles

1
@JamWaffles tamam bu tuhaf. Birkaç hafta önce bunun için bir gün geçirdiğimi açıkça hatırlıyorum. Firefox ve IE'de işe yaramadı. Ben anlaşma ... olduğunu merak
Alex Turpin

Meraklı. Cevabımda FF ile çalışan bir JSFiddle var. IE'de test edemiyorum (Linux'tayım), bu yüzden yine de ortaya çıkıp çıkmayacağını bilmiyorum.
Bojangles

2
İyi araştırma çabası var! Web geliştiricilerinin oldukça normal davranışları bir şeye dönüştürmek zorunda kaldığı her sefer için bir kuruş harcarsam, çok zengin olurdum.
Bojangles

1

REACT'ta bileşen sahne almak için bağlama kullandığınızdan emin olun

class FileUploader extends Component {
  constructor (props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
   onChange=(e,props)=>{
    const files = e.target.files;
    const selectedFile = files[0];
    ProcessFileUpload(selectedFile,props.ProgressCallBack,props.ErrorCallBack,props.CompleatedCallBack,props.BaseURL,props.Location,props.FilesAllowed);
  }
   handleClick = () => {
    this.refs.fileUploader.click();
  }
  render()
  {
  return(
      <div>
        <button type="button" onClick={this.handleClick}>Select File</button>  
        <input type='file' onChange={(e)=>this.onChange(e,this.props)} ref="fileUploader" style={{display:"none"}} />
      </div>)
  }
}



0

Aynısını isteyen ancak React'i kullananlar için

openFileInput = () => {
    this.fileInput.click()
}

<a href="#" onClick={this.openFileInput}>
    <p>Carregue sua foto de perfil</p>
    <img src={img} />
</a>
<input style={{display:'none'}} ref={(input) => { this.fileInput = input; }} type="file"/>

0
<div id="uploadButton">UPLOAD</div>
<form action="[FILE_HANDLER_URL]" style="display:none">
     <input id="myInput" type="file" />
</form>
<script>
  const uploadButton = document.getElementById('uploadButton');
  const myInput = document.getElementById('myInput');

  uploadButton.addEventListener('click', () => {
    myInput.click();
  });
</script>
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.