プログラムで「ファイルの選択」ダイアログボックスをトリガーする


99

隠しファイルinput要素があります。ボタンのクリックイベントからファイル選択ダイアログボックスをトリガーすることは可能ですか?

回答:


146

を使用する代わりに、ファイルをアップロードするための独自のボタン<input type="file" />が必要な場合は、次のようにします。

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

visibility: hidden代わりにを使用したことに注意してくださいdisplay: none。表示されていないファイル入力でクリックイベントを呼び出すことはできません。


基本的なケースでは簡単ですが、多くのブラウザとの互換性はありません。Xeon06の回答で言及されているように、このソリューションをopacity:0のボタンの上にファイル入力要素をオーバーレイすることと組み合わせる方がはるかに優れていることに注意してください。
SquareCat 2013年

10
更新:最近のブラウザーでは、DOMにない入力をクリックすることもできます。驚くばかり!
Adria

7
click()display:none入力を試してみましたが、うまく
Daniel Cheung

15
うん、ここ2015年、作品でclick()要素にdisplay: none取り組みます!;)過去4年間で状況はどのように変化したか。
ffxsam 2015年

hidden代わりに属性を使用できますstyle="visibility:hidden"<input id="myInput" type="file" hidden>w3schools.com/tags/att_global_hidden.asp
cespon

113

ここでのほとんどの回答には有用な情報が不足しています:

はい、jQuery / JavaScriptを使用してプログラムでinput要素をクリックできますが、これは、ユーザーが開始したイベントに属するイベントハンドラーでクリックした場合のみです。

したがって、たとえば、スクリプトでajaxコールバックのボタンをプログラムでクリックしても何も起こりませんが、ユーザーが発生させたイベントハンドラーに同じコード行を配置すると機能します。

PSこのdebugger;キーワードは、プログラムによるクリックの前にある場合、参照ウィンドウを中断します...少なくともChrome 33では...


@LouisBataillardが正しく言及しているように:元のイベントハンドラーをユーザーが開始する必要があるだけでなく、具体的にはクリックイベントである必要があります。これは彼がこれを実証するために提供したフィドルです:リンク
Souhaieb Besbes

1
動的に生成されたものをクリックできます。jqueryでは、つまり$(staticElementParent).on("click", "dynamicChild", function(){})
Daniel Cheung

1
ありがとうございました!!!!私はこれらすべての答えをJavaScriptコンソールでテストしてきました。
jdkealy

8
プログラムでファイル入力ウィンドウを表示するのに30時間苦労してきました。NOBODY ELSEは、イベントがユーザーによって開始されない場合は不可能であると述べました...あなたは多くの+1に値します。
Umagon

1
Chrome 62以降、debugger;キーワードによってプログラマティッククリックが中断されることはなくなりました
Chris W.

62

参考までに、JavaScriptを必要としない代替ソリューションがあります。これは少しハックであり、ラベルをクリックすると関連する入力にフォーカスが設定されるという事実を悪用します。

あなたは必要とする<label>適切にfor(ブートストラップと、使用optionnalyボタンのようなスタイル属性(入力へのポイント)、 btn btn-default)。ユーザーがラベルをクリックすると、ダイアログが開きます。例:

<!-- 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
私はこれを気に入っています。Angularプロジェクトに完全なjQueryを含めたくなく、うまくいきます:)
Starscream1984

1
この動作はすべての最新のブラウザで信頼できますか?
JoshuaDavid 2017

これは、ネイティブブラウザの動作を使用して、JSがまったくなくても機能します。onDropイベントと組み合わせることで、機能豊富なファイルアップロードの実装がうまくいきます。
Yanick Rochon、2018年

CSSをいじる必要がありましたが、うまくいきました。つまり、「display:none」を含むファイル入力の可視性は、すべてのブラウザーで適切ではありません。(ただし、不透明度0などを使用できます)
ドリフトキャッチャー

13

ブラウザがtype="file"要素のクリック(セキュリティ上の問題など)をどのように処理するかはわかりませんが、これは機能するはずです。

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

私はこのJSFiddleをChrome、Firefox、Operaでテストしましたが、すべてファイル参照ダイアログが表示されます。


5
これは、「calling」イベント自体がクリックイベントである場合にのみ機能するようです。たとえば、次のhoverイベントに基づいてファイルダイアログを開くことができないようです:jsfiddle.net/UQfaZ/1
Louis B.

入力がDOMにない場合、これをSeleniumでテストする方法を知っていますか?
Sebastien Lorber

4

をラベルタグで囲み、好みに合わせてinput[type=file]スタイルを設定しlabel、を非表示にし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>

純粋にCSSソリューション。


<input type="file" hidden>CSSスタイルを適用する必要をなくすように設定するだけです。
Sylvain Lesage

3

本来、唯一の方法は<input type="file">、残念ながら要素を作成し、クリックをシミュレートすることです。

小さなプラグイン(恥知らずなプラグイン)があり、これをいつもやらなければならないという苦痛を取り除きます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

最善の解決策は、すべてのブラウザで動作します。モバイルでも。

<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>

入力ファイルタイプを非表示にすると、ブラウザで問題が発生します。非表示ではなく表示されないため、不透明度が最適なソリューションです。:)


1
これにはjquery参照が必要であることを言及する必要があります。
ブリノ

不透明度にはまったく関係のない概念が含まれます。「シースルー」要素を使用してレイアウトに影響を与えない場合は、幸運です。要素は存在する必要がありますが、表示されないためvisibility:hidden、より適切な選択である必要があります。
conny 2015年

visibility: hiddenそれでもレイアウトに影響します。display: noneあなたが欲しいものです。
stommestack 2016

1

セキュリティ上の理由から、ブラウザ間で実行する方法はありません。人々が通常行うことは、入力ファイルを他のものの上にオーバーレイし、その可視性を非表示に設定して、それ自体でトリガーされるようにすることです。詳細はこちら。


2
OPは話しているの<input type="file">ではなく、<select>です。
Bojangles

問題ない。以前に自分でやったことがあります。あなたの編集に対応して、そこにあるそれを行う方法は、jQueryで要素のクリックイベントをトリガーする$.click()
Bojangles

1
@JamWaffles大丈夫、それは変だ。数週間前にこのことに丸一日費やしたことを私ははっきりと覚えています。FirefoxとIE afairでは機能しませんでした。契約は何だったのだろう...
アレックスターピン

奇妙な。私の答えには、FFで動作するJSFiddleがあります。IEでテストできない(Linuxを使用している)ため、それがまだ発生するかどうかはわかりません。
ボジャングル2011

2
良い研究努力があります!Web開発者がかなり正常な動作を何かにハッキングしなければならないたびにペニーを費やしたら、私は不潔な金持ちになるでしょう。
ボジャングル、2011

1

バインディングを使用してREACTでコンポーネントの小道具を取得していることを確認してください

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

jQueryを使用してclick()、クリックをシミュレートするために呼び出すことができます。



0

同じものが欲しいが、Reactを使用している人のために

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.