1

ファイルをアップロードする小さなアプリがあります。

<html>
<script type="text/javascript">
 var upload = function(){
    alert(document.getElementById('up_file').files[length]);
 };
</script>   
<body>

<input type='file' id='up_file'   />
<input type='button' value='Submit' onclick="upload();" />
    <p id="p"></p>

</body></html> 

(非常に短い)

コード エディタでこれをコピー アンド ペーストしてから、Google で開いてください。これをGoogleブラウザで開いた後、開発者ツールを開き、これをコンソールに書き込みます

document.getElementById('up_file').files

その後、それは戻ります

FileList{0:File, Length:1, item:function}(このオブジェクトを展開してください)

ファイルをアップロードする必要があり、そのファイルの名前を取得したい場合は、コードを記述する必要がdocument.getElementById('up_file').files[0].nameあります。すると、ファイル名が flower.jpg と返されます。

ケース1

オブジェクトを展開するFileListと、プロパティ名があることに気付きましたlength。入力document.getElementById('up_file').files[length]すると 1 が返されるはずです。これはFileList、オブジェクトを展開したときにプロパティlengthが 1 であることがわかりましたが、予期せず、書き込むdocument.getElementById('up_file').files[length]と別のオブジェクトが返され、次に 1 ! そのオブジェクトは次のとおりです。

File {webkitRelativePath: "", lastModifiedDate: Fri Aug 30 2013 13:42:08 GMT+0530 (India Standard Time), name: "Creek.jpg", type: "image/jpeg", size: 264409…}

そして、私たちが書くと、それはそのファイルの名前であるdocument.getElementById('up_file').files[length].nameによって返されるものと同じものを返します!document.getElementById('up_file').files[0].name

質問:

1) 書き込み時に javascript がファイル数の長さを表すオブジェクトを返すのはなぜdocument.getElementById('up_file').files[length]ですか?

ケース2

そのオブジェクトには、展開する前にFileList別のプロパティ名がありますが、オブジェクトを展開すると、その名前のプロパティはありませんが、オブジェクトをさらに展開すると、それがわかります(これはコンストラクターである可能性がありますよくわかりませんが、50%)。itemFileListitemFileListitem

参照してください、オブジェクトの場合、アイテムは dot(.) 国家を使用してアクセスできますが、書き込み時typeof __proto__に常に返されます。的外れなのでこれ以上は説明しませんが…undefined__proto__.item

質問:

1) このアイテムは何ですか?

2}__proto__オブジェクトのプロパティを取得する方法は?


実は私はとても混乱していて、インターネットで検索すると、さらに困惑してしまいます! あなたはこの質問を嫌うかもしれません...少し紛らわしいからです


ご回答ありがとうございます。

4

2 に答える 2

2

document.getElementById('up_file').files[length]

この問題は、ファイルのプロパティへのアクセスに関するものです。

JS でオブジェクトのプロパティにアクセスするには、2 つの方法があります。

[]配列型表記 - リテラル文字列または文字列を含む変数を使用してインデックスを定義します。

files['length']

また

var lengthProp = 'length';
files[lengthProp]

.表記法 -
単にドットでプロパティにアクセス
files.length

files1) 返されるオブジェクトが配列であるためです。インデックスの長さ(javascriptは未定義の変数として読み取っています)は実際には未定義です。配列ブラウザの未定義のインデックスが配列内の最初のアイテムを返すためです。これは最初のファイル オブジェクトです。

2)拡張とは、コンソールでオブジェクトを表示することを意味すると思います。__proto__プロパティは、実際にはオブジェクトのプロトタイプへのアクセサーです。オブジェクトのfilesプロトタイプは未定義です。コンストラクターに関してコンソールに表示される__proto__もの。JSでは実際には未定義

于 2014-04-08T17:44:01.053 に答える
0
document.getElementById('up_file').files[length]

// should be:
document.getElementById('up_file').files.length

2}__proto__オブジェクトのプロパティを取得する方法は?

document.getElementById('up_file').files.item(0)
// return the first file

var files = document.getElementById('up_file').files;
console.log(files.__proto__ === Object.getPrototypeOf(files));
// -> true
于 2014-04-08T17:35:35.633 に答える