お世話になります。
JavaScript学習中のものです。
ある参考書(SHOEISHA「HTML5 レベル2 ver2.0対応 スピードマスター問題集 初版」P199)に以下の文面があります。
「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」
この意味するところについてご教授をお願いします。
このことを自分で考えると、
オブジェクトとは、例えば
var person = {name: 'Tom'};
であればpersonオブジェクトと呼ばれるものになり、"name: 'Tom'"の部分がプロパティということは分かっています。
このことを踏まえると「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」とは、
JavaScriptにはもともと
var FileList = {(key): (value);…};というのがあって、
var input = {files: (value);…} というものもあるのだと思いますが、
このFileListオブジェクトとinputオブジェクトの関係がよく分かりません。
「継承」という概念であれば少し分かるのですが、それとも違うような気がしています。
どなたか分かる方いらっしゃればよろしくお願いします。
【追記】
SHOEISHA「HTML5 レベル2 ver2.0対応 スピードマスター問題集 初版」P199の抜粋
HTML
<input type="file" id="files" multiple>
JavaScript
var showFilesNames = function(){
var inputFiles = document.querySelector("#files");
var files = inputFiles.files;
for(var i = 0; i < files.length; i++){…}
(以下省略)…
上記のlengthが空白で、埋めるものを選択するという問題です。
この解説に、「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があったため、あるオブジェクトが別のオブジェクトのプロパティで取得できるとは、どういう意味なのかわからなかったため質問させていただきました。
ちなみに’length’はFileListオブジェクトのプロパティとなっています。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/01 23:07
2021/09/01 23:13 編集
2021/09/01 23:21
退会済みユーザー
2021/09/02 01:34
退会済みユーザー
2021/09/04 05:41
2021/09/04 07:15
回答5件
0
ベストアンサー
HTMLInputElement.prototype.files
HTMLInputElement.prototype.files
を参照すれば、「FileList.prototype
を [[Prototype]]
に持つオブジェクト」を返します。
HTML
1<input id="sample" type="file"> 2 3<script> 4 'use strict'; 5 const input = document.getElementById('sample'); 6 7 console.log(Object.getPrototypeOf(input) === HTMLInputElement.prototype); // true 8 console.log(Object.getPrototypeOf(input.files) === FileList.prototype); // true 9 console.dir(HTMLInputElement); 10 console.dir(FileList); 11</script>
FileList.prototype.length
FileList InterfaceのIDLは下記の通り。
[Exposed=(Window,Worker), Serializable] interface FileList { getter File? item(unsigned long index); readonly attribute unsigned long length; };
Google Chromeでも FileList.prototype.length
に getter が定義されていることを確認できます。
- Object.prototype.hasOwnProperty() - JavaScript | MDN
- Object.getOwnPropertyDescriptor() - JavaScript | MDN
HTML
1<input id="sample" type="file"> 2 3<script> 4 'use strict'; 5 const files = document.getElementById('sample').files; 6 const filesPrototype = Object.getPrototypeOf(files); 7 8 console.log(filesPrototype === FileList.prototype); // true 9 console.log(files.hasOwnProperty('length')); // false 10 console.log(filesPrototype.hasOwnProperty('length')); // true 11 console.log(Object.getOwnPropertyDescriptor(filesPrototype, 'length')); // {set: undefined, enumerable: true, configurable: true, get: ƒ} 12</script>
プロトタイプチェーン
前述のコードの理解が難しいようでしたら、「プロトタイプチェーン」を調べてみてください。
仕様書
JavaScriptはECMAScriptだけでなく、DOM, HTML Standard等、様々な仕様が定義されています。
それらの interface, IDLを読んでおくと、関係性を理解しやすいと思います。
Re: susumu-99 さん
投稿2021/09/02 01:04
編集2021/09/04 05:35総合スコア18166
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/02 03:13 編集
2021/09/02 01:39
2021/09/04 05:38
2021/09/04 05:49 編集
0
「FileListオブジェクトはInputオブジェクトのfilesプロパティで取得できる」
この意味するところについてご教授をお願いします。
これをもっと詳しく書くと以下のようになります。
「FileListクラスのインスタンスであるオブジェクトは、Inputクラスのインスタンスであるオブジェクトのfilesプロパティで取得できる」
(javascriptにおいては厳密には正しくない説明ですが、文章の解釈としては上記の理解の仕方で問題ありません。)
FileListやInputはシステム側で用意されているものなので実際には以下コードは動きませんが、以下のような感じです。
javascript
1var object1 = new FileList(); // object1はFileListクラスのインスタンス 2var object2 = new Input(); // object2はInputクラスのインスタンス 3object2.files = object1; // Inputクラスのインスタンスのfilesプロパティに、FileListクラスのインスタンスを入れておく 4 5// このとき、object2.files と書くと、new FileList()で作成したobject1を参照できる。 6// すなわち『FileListオブジェクト(object1)は、Inputオブジェクト(object2)のfilesプロパティで取得できる』
投稿2021/09/02 01:44
総合スコア4524
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/02 02:33
2021/09/02 03:01 編集
2021/09/02 03:45 編集
2021/09/02 06:52
0
こういうことです
javascript
1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 var files=f.files; 4 console.log(files instanceof FileList); // FileList型オブジェクトなのでtrue 5 console.log(files instanceof NodeList); // NodeList型オブジェクトではないのでfalse 6}); 7</script> 8<input type="file" id="f">
type=fileから得られるfilesはFileList(型の)オブジェクトとして
取得(参照したり場合によっては編集・削除したり)できるということ。
投稿2021/09/02 00:09
編集2021/09/02 00:37総合スコア114850
0
例えば次の例 (Pet オブジェクト (種類: 猫、名前: ジェリー) は person オブジェクト (名前: トム) の pet プロパティで取得できる) を考えると良いかも。
js
1var person = { 2 name: 'Tom', 3 pet: { 4 kind: 'cat', 5 name: 'Jerry' 6 } 7};
投稿2021/09/01 23:56
総合スコア7895
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/02 00:40
2021/09/02 00:56
2021/09/02 01:19
2021/09/02 01:26
2021/09/02 02:14
2021/09/02 02:22
0
「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」
もともと var input = {files: (value);…} というオブジェクトがあって、その value が FileList オブジェクトを指しているということだと思います。
【追記】
その「inputオブジェクト」というのは、html の <input>
要素のことだったのでしょうか?
https://developer.mozilla.org/ja/docs/Web/API/FileList
であれば、ちょっと話が違ってきますが。どのように使いたいのか、全体的な話を書いてもらった方が良さそうです。
【追記2】
質問の「追記」に対してレスします。
この解説に、「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があったため、あるオブジェクトが別のオブジェクトのプロパティで取得できるとは、どういう意味なのかわからなかったため質問させていただきました。
input 要素、files プロパティ、FileList オブジェクトの関係については、以下の記事の View のコードが説明になるのではと思います。
異なるフォルダのファイルをアップロード
http://surferonwww.info/BlogEngine/post/2020/07/09/uploading-multiple-files-in-different-folders.aspx
関係部分のみを抜粋すると、
html
1<input id="mutiplefileupload" type="file" 2 name="postedfiles" multiple="multiple" />
javascript
1<script type="text/javascript"> 2 //<![CDATA[ 3 4 $(function () { 5 // ブラウザの HTML5 File API サポートを確認 6 if (window.File && window.FileReader && window.FileList) { 7 8 // FormData オブジェクトを取得 9 var fd = new FormData(document.querySelector("form")); 10 11 // input type="file" 要素のオブジェクトを取得 12 var fileUpload = document.getElementById("mutiplefileupload"); 13 14 // input type="file" 要素でダイアログを開いてファイルを選択 15 // し[開く]ボタンをクリックすると、その都度 change イベン 16 // トが発生する。それにリスナ(下のコードの function )を 17 // アタッチして FormData オブジェクトを操作する 18 fileUpload.addEventListener('change', function (e) { 19 // files プロパティで FileList オブジェクトを取得 20 var filelist = fileUpload.files; 21 22 // 一回の操作で複数のファイルを選択できるので、以下 23 // のようにループを回して 24 for (let i = 0; i < filelist.length; i++) { 25 // File オブジェクトを FormData に追加していく 26 fd.append("postedfiles", filelist[i]); 27 } 28 }); 29 30 //]]> 31</script>
(1) input type="file" 要素がブラウザにロードされるとそのオブジェクトが生成されるので getElementById でそれを取得。
(2) ブラウザに表示された input type="file" 要素でダイアログ(紹介した記事の 2 つ目の画像参照)を開いてファイルを選択。multiple="multiple" 属性が設定してあるので複数のファイルを選択可能。
(3) files プロパティで FileList オブジェクトを取得。
(4) FileList.length プロパティで上記 (2) で選択したファイルの数を取得できる。
(5) なので、上記のコードのように for ループで選択したファイル(File オブジェクト)を一つずつ取得して操作できる。
投稿2021/09/01 23:13
編集2021/09/02 01:50退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/01 23:41
退会済みユーザー
2021/09/01 23:43
2021/09/01 23:45
退会済みユーザー
2021/09/01 23:55
2021/09/01 23:59
2021/09/02 00:07
退会済みユーザー
2021/09/02 00:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。