2

我有一个本地程序,它将 JSON 对象写入文件,以便 JavaScript 可以获取其数据并进行处理。使用<input>对象选择文件:

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

用下面的 JS 函数setInterval每 300ms 重复一次。但是,当文件发生变化时,只有谷歌浏览器会重新加载文件并处理新的内容;我必须在 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 行为是一个隐私漏洞:当用户在文件输入中选择一个文件时,他们是在授予网页读取该文件数据的权限,而不是针对该文件的所有未来版本!这就是规范按原样编写的原因。

于 2013-07-22T13:08:26.753 回答