2

JavaScript がそのデータを取得して処理できるように、JSON オブジェクトをファイルに書き込むローカル プログラムがあります。ファイルは<input>オブジェクトを使用して選択されます。

<form id = "getfiles">
    <input type = "file" multiple id = "files" />
</form>

次の JS 関数setIntervalを使用して、300 ミリ秒ごとに繰り返します。ただし、ファイルが変更されると、Google Chrome だけがファイルを再読み込みして新しいコンテンツを処理します。IE 10 および Firefox 20 では、ページ上のファイルを手動で再選択する必要があります。

function speakText() 
{
    var thefile = document.getElementById('files').files[0];
    var lastChanged = thefile.lastModifiedDate;
    var reader = new FileReader();               

    reader.onload = function(event)
    {
        var lcd = document.getElementById("last_change_date");
        if (!lcd)
        {
            var spanLastChanged = document.createElement("span");
            spanLastChanged.id = "last_change_date";
            spanLastChanged.innerText = lastChanged;
            console.log(lastChanged);
            document.body.appendChild(spanLastChanged);
        }
        else
        {
            // compare lastChanged with last_change_date
            var last_known_change = Date.parse(lcd.innerText);
            // var last_known_change = Date.parse(thefile.lastModifiedDate);
            if (last_known_change !== Date.parse(lastChanged))
            {
                console.log("Something is new since " + lcd.innerText);
                var fileContent = event.target.result;
                var commands = JSON.parse(fileContent);
                handleJSON(fileContent);
                lcd.innerText = lastChanged;
            }
        }
    }
    reader.readAsText(thefile, "UTF-8"); 
}
4

1 に答える 1

2

Firefox と IE は、仕様に従って正しいことを行っています。ファイル入力に関連付けられた File オブジェクトは、File オブジェクトが作成された時点でのファイルの不変のスナップショットであると想定されています。WebKit/Blink の既知のバグであり、ファイルのデータへの参照を保存するだけなので、データを変更すると File オブジェクトの表示が変更されます。

実際、WebKit/Blink の動作はプライバシー バグです。ユーザーがファイル入力でファイルを選択すると、その時点でファイルのデータを読み取る許可が Web ページに与えられますが、ファイルの将来のすべてのバージョンではありません。 ! これが、仕様がそのまま書かれている理由です。

于 2013-07-22T13:08:26.753 に答える