ここから本文です

JavaScriptについて質問です。 例えば以下のようなコードがあったとします。

アバター

ID非公開さん

2019/6/2708:20:46

JavaScriptについて質問です。

例えば以下のようなコードがあったとします。

let files = document.getElementById( 'fileオブジェクト' ).files;

document.getElementById( 'fileオブジェクト' ).addEventListener( 'change', function( ) {
console.log( files ); // 1
console.log( document.getElementById( 'fileオブジェクト' ).files ); // 2
}, false );

この時、1ではFireFoxではfilesの中身が更新されて表示されますが、GoogleChromeでは中身が更新されていません(ファイルを選択していたとしてもlengthが0で、Itemがありません)。
2ではどちらのブラウザも更新されたFileListが表示されます。

JavaScriptの場合、オブジェクト型は全て参照となっているはずですが
GoogleChromeのこの実装はバグなのでしょうか?
それとも仕様?
後者だとすれば、なぜこのような仕様になっているのかと
他にもこういったオブジェクトが存在するかどうかを教えていただけると幸いです。

よろしくお願いします。

閲覧数:
34
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

shi********さん

2019/6/2718:41:56

HTML 5.1 の仕様によるとこうあります
https://www.w3.org/TR/html51/sec-forms.html#dom-htmlinputelement-fi...

The files IDL attribute allows scripts to access the element’s selected files. On getting, if the IDL attribute applies, it must return a FileList object that represents the current selected files. The same object must be returned until the list of selected files changes. (略)

「選択されたファイルに変更がない限り、files 属性は同じ (FileList) オブジェクトを返すこと」

とあります。選択ファイルに変更があった場合については、この仕様は何も言っていませんが、おそらく Chrome では変更後 (ソースの2のところ) は新しい FileList オブジェクトが作られて、それが返されているのではないでしょうか。

  • アバター

    質問者

    ID非公開さん

    2019/6/2921:28:19

    (DOMがLIVEであるので)FileListオブジェクトは1と2(または3)で同じ参照を持つというのが原則であるはずなのですが、そうでないということはやはりバグかGoogleChromeでの仕様と言うことになるのでしょうね。

    例えば
    let style = document.getElementById( 'foo' ).style;
    console.log( style.display ); // undefined or ''
    document.getElementById( 'foo' ).style.display = 'none';
    console.log( style.display ); // 'none'

    となるのが正常な動きであるはずです。
    おそらくおっしゃられているのはGoogleChromeはFileListをクローンして返却するのではないかと言うことだと思います。そうだとすれば、やはりセキュリティ上の問題でしょうか。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2019/6/29 21:33:36

ありがとうございました。
GoogleChromeのJavaScriptのソースはネット上に公開されているはず(C#でしたっけ?)ですので、それを読んでみることにします。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

ama********さん

2019/6/2710:16:04

>GoogleChromeのこの実装はバグなのでしょうか?
>それとも仕様?

恐らく仕様です。

>後者だとすれば、なぜこのような仕様になっているのかと

Chromeの場合、下記のコマンドで、まだファイルが読まれていないのだと思われます。

>let files = document.getElementById( 'fileオブジェクト' ).files;

>他にもこういったオブジェクトが存在するかどうか

(オブジェクトに限らず)ブラウザごとに仕様が違います。
(仕様が違う)ブラウザごとに同じように「動作、表示」させることをクロスブラウザ と言います。
特に問題なのは古いIEの どのバージョンまで対応するのか?(まあ、アマチュアは そこまでしなくても良いかもしれません)。

クロスブラウザ
http://e-words.jp/w/%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%96%E3%83%A9%E...


3サイトで見る最新ブラウザシェア率
https://kigiroku.com/frontend/browser-share201707.html

下記にIEのシェアが記載されている。

Internet Explorer
https://ja.wikipedia.org/wiki/Internet_Explorer

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる