JavaScriptでファイルダイアログボックスを開く


109

をクリックしているときにファイルを開くダイアログをHTMLで表示するソリューションが必要divです。をdivクリックすると、[ファイルを開く]ダイアログボックスが開く必要があります。

入力ファイルボックスをHTMLページの一部として表示したくない。Webページの一部ではない別のダイアログに表示する必要があります。


4
アラートはファイルダイアログではありませんか?-あなたが求めていることを明確にできますか?
LiamB 2010年

3
私は彼が標準の「ファイルを開く」ポップアップを望んでいると言っていると思います
Valentin Rocher

1
divをクリックしたときに[ファイルを開く]ダイアログボックスが必要です。Webページの一部ではないアラートのようなものでなければなりません
ArK

回答:


52

これはいいものです

Fine Uploaderのデモ

それ<input type='file' />自体がコントロールです。しかし、divはその上に配置され、CSSスタイルが適用されてその感触を得ます。ファイルコントロールの不透明度が0に設定されているため、divをクリックするとダイアログウィンドウが開いているように見えます。


1
...のJavaScriptによって表示されるファイルを制御私は、オープンファイルダイアログに望んでいたし、ディスプレイに.PDFとちょうど欲しかったファイルの拡張子を言うする方法はあります..です
Ajax3.14

1
@ Ajax3.14新しいブラウザーにはFileReaderオブジェクトがあり、古いブラウザーでは値を使用してファイル拡張子を探す必要があります。
Vicary 2013年

2
@ Ajax3.14 FileReaderや解析拡張機能を使用する必要はありません。多くのブラウザは、ファイル入力の受け入れ属性をサポートしています。これにより、ファイルブラウザダイアログに表示されるファイルタイプを制限できます。Fine Uploaderは、検証オプションのacceptFilesプロパティを介してこの機能へのアクセスを提供します。詳細については、オプションのドキュメントの検証セクションを参照してください。accept属性はIE9以前ではサポートされていないことに注意してください。
レイニコラス2013

1
どうしてこれがいいの?これはまったく良い習慣ですか?このようなものであってはなりません:stackoverflow.com/a/18659941/915865
Kat Lim Ruiz

1
@KatLimRuizいいえ、あなたがリンクした答えは良い解決策ではありません。これにより、プログラムで関連フォームも送信すると、IEでエラーがスローされます。
レイニコラス2013年

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の場合、これを追加します。

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

3
#select_logoクリックハンドラーでfalseを返すのはなぜですか?
Sethish

4
これは404エラーを生成せず、現在のページに移動して、末尾に#が追加されるだけです。これはページをトップにジャンプさせます。したがって、別の理由でそこにいるのは良いことです:)
manavo

3
私は十分にテストしていませんが、「可視性:非表示」; より互換性があるようです。さらに、opacity:0にもかかわらず、「invisible」要素がクリックされるとクリックイベントがトリガーされますが、visibility:hiddenはトリガーされません。
アロン2013

MDNはそれdocument.getElementById("logo").click()で十分であることを示しています。また、「ドラッグアンドドロップ」という別の方法も示しています。developer.mozilla.org/en-US/docs/Web/API/File/...
エリック・

2
これを通常のJavascriptに変換する必要があります
。JQuery

57

なぜ誰もがこれを指摘しなかった理由はわかりませんが、これはJavascriptなしでそれを行う方法であり、どのブラウザーとも互換性があります。


編集:Safariでは、でinput非表示にするとが無効になりますdisplay: none。より良い方法は、を使用することposition: fixed; top: -100emです。


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

必要に応じて、次のように入力のへのポインティングでを使用して「正しい方法」を実行できます。forlabelid

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

4
これは魅力のように機能しますが、いくつかの推奨事項があります。1. <input>タグにはname属性が必要です。2. for属性が指定されている場合、<input>ファイルタグにはが必要ですid
ラプター2015

5
Simplicity is the ultimate sophistication
ncubica

2
すごい!背景画像を使用したり、ラベルにクリックJavaScriptがトリガーされたりしても、魅力のように機能します。ありがとう!
Leo Nomdedeu、2015年

2
ところで、誰かがこのソリューションで1つの問題を指摘しました。Safariでは、非表示の入力display: noneは無効になっています。回避策は、別のアプローチを使用して入力を非表示にすることです。それを反映するように答えを更新します。
JP de la Torre

1
@JPdelaTorre入力を非表示にするには、不透明度:0を使用した方がよいでしょう。
エイドリアン

39

実際には、不透明度、可視性、<input>スタイリングなどのすべてのものは必要ありません。

<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のデモ。Chrome 30.0およびFirefox 24.0でテスト済み。ただし、Opera 12.16では機能しませんでした。


3
これが正解です。純粋なJavascript実装の場合、HTMLコードを変更する必要はありません。
Zhang Buzz、2015

21
ばかげた質問ですが、その後、選択したファイルをどのように取得しますか?
ジェイウィック

2
これは、予期しない問題を引き起こす可能性がある危険な解決策です。たとえば、一部のブラウザ(IEなど)では、ファイル入力もプログラムで開かれている場合、プログラムによるフォームの送信ができない場合があります。この問題を解決する最良の方法は、JavaScriptではなくCSSを使用することです。
レイニコラス

3
@Charleston残念ながら、一部のブラウザでは動作しません。彼らはそれを機能させるべきです:)
Tigran Saluev '12

3
2020年の時点で、このソリューションは最も優れているようです。Edge、Safari、Opera、Firefox、ChromeのBrowserStackでテストしました。それらのすべてで動作します。
V.ルビネッティ

14

これが私にとって最も効果的でした(IE8、FF、Chrome、Safariでテスト済み)。

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

説明: クリックする要素のすぐ上にファイル入力を配置したので、クリックはその要素またはそのラベル(ラベル自体をクリックしたかのようにアップロードダイアログを表示します)に到達します。デフォルトの入力のボタン部分がラベルの側面からはみ出すという問題があったためoverflow: hidden、入力とdisplay: inline-blockラベルに必要でした。


1
入力を最大化し、不透明度をゼロに設定します。それはうまくいきます!
キノルシ2017

13

クライアントマシンでJavaScriptがオフになっている場合はどうなりますか?すべてのシナリオで次のソリューションを使用します。javascript / jQueryも必要ありません。:

HTML

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

CSS

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

説明:for="Your input Id"。HTMLでは、デフォルトでクリックイベントをトリガーします。したがって、デフォルトではクリックイベントをトリガーします。jQuery/ javascriptは必要ありません。それが単にHTMLで行われるのであれば、なぜjQuery / jScriptを使用するのですか?そして、クライアントがJSを無効にしたかどうかはわかりません。JSがオフになっていても、機能は動作するはずです。

動作するjsFiddle(JS、jqueryは必要ありません)


3
なぜ背景?
ソロモンウッコ2016年

12

で最初に追加し頭のタグ:

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

すでにスクリプトがある場合タグ、上記の関数を追加してください。

あなたのボディまたはフォームタグに追加:

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

あなたのhtmlで、ちょうどされてどんなにそのようにあなたがしたようなタイプOpenFileDialogクラスの新しいインスタンスを作成したグローバル名前がある変数、ID要素の、どこコードまたはXAMLで、どんなにしかし、スクリプトやコードで、あなたがすることができない要素の入力タイプ=「ファイル」で定義されていないものを行うグローバル関数があるので、彼の名前を入力し、[機能のプロパティを読み取りまたは呼び出します。これらの関数に、OpenFileDialogインスタンスの名前である非表示の入力type = "file"のIDを文字列として指定するだけです。

オープンファイルダイアログインスタンスをhtmlに作成する作業を簡単にするために、それを行う関数を作成できます。

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

ファイルを開くダイアログを削除する場合は、次の関数を作成して使用できます。

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

ただし、ファイルを開くダイアログを削除する前に、次の関数を作成して使用することにより、ダイアログが存在することを確認してください。

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

本文を開くダイアログを作成したり、htmlのフォームタグを追加したりしない場合は、これにより非表示の入力type = "file"が追加されるため、上記のcreate関数を使用してスクリプトで実行できます。 :

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

あなたのボディまたはフォームタグの近くに、あなたが追加したことを確認してください:

onload="yourBodyOrFormId_onload()"

すでに実行している場合は、上記のこの行を実行する必要はありません。

ヒント:プロジェクトまたはWebサイトに新しいJScriptファイルをまだ追加していない場合は追加できます。このファイルでは、開いているすべてのファイルダイアログ関数をスクリプトタグやhtmlまたはwebフォームページから離して配置し、それらをこのJScriptファイルからhtmlまたはwebフォームページに追加しますが、htmlまたはwebフォームページをJScriptファイルにリンクすることを忘れないでください。JScriptファイルを頭の htmlページにドラッグするだけで実行できますタグ。ページが単純なhtmlではなくWebフォームであり、headタグがない場合は、機能するようにどこかに配置します。そのJScriptファイルでグローバル変数を定義することを忘れないでください。その値は、文字列としての本体またはフォームIDです。JScriptファイルをHTMLまたはWebフォームページにリンクした後、フォームの本体のonloadイベントを実行し、その変数の値を本体またはフォームIDに設定できます。次に、JScriptファイルで、ドキュメントの本文または1ページのフォームのIDを指定する必要がなくなり、その変数の値を指定するだけです。その変数bodyIdformIdbodyOrFormId、またはその他の任意の名前を呼び出すことができます。

頑張って!


1
innerHTMLを直接変更しないことをお勧めします。
ソロモンウッコ2016年

9

最も簡単な方法:

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

重要なのは、の使用display: noneにより、隠しファイルの入力(を使用して何が行われるか)によって場所が占有されないようにすることopacity: 0です。


3

私の知る限り、あなたはまだ<input type="file">要素が必要です、そしてあなたはそれをスタイルアップするためにquirksmodeからのもののいくつかを使うことができます


2

唯一必要なの<input type="file">は、divの上に透明なFlashムービーを埋め込むことです。次に、ユーザー生成のクリックイベント(Flash 10の新しいセキュリティルールに準拠)を使用して、FlashのFileReference.browseの呼び出しをトリガーできます。

quirksmodeの方法に対する追加の依存関係を提供しますが、見返りに多くのイベント(組み込みの進行状況イベントなど)を取得します。


-1

使用できます

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

私の場合、これにより、元のクリックイベントが発生した同じページに自動的にリダイレクトされます。つまり、ページ全体がリロードされ、以前にページに入力されたすべてのデータが失われます。
ムンタシル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.