回答后更新 - 根据以下答案,我决定在目标页面中复制该文件,以便它成为该窗口的File对象的实例。
function makeFileLocal(file, callBack) {
var localFile;
var reader = new FileReader();
reader.addEventListener("loadend", function () {
// reader.result contains the contents of blob as a typed array
var a = new Array(reader.result);
localFile = new File(a, file.name, { type: file.type, lastModified: file.lastModified });
callBack(localFile);
});
reader.readAsArrayBuffer(file);
}
我将此函数放在目标页面中,并通过window.opener.makeFileLocal(file, callback)
从文件创建者调用它。现在我有一个文件传回到与其File对象匹配的目标窗口。
===================原始问题======================
我正在函数中的两个Chrome窗口之间传递一个File对象。在目标窗口中,我需要将对象评估为File
的实例,但事实并非如此。
在Chrome控制台中,在传递的浏览器中,object instanceof File
的评估结果为true;当对象传递到目标窗口时,object instanceof File
的计算结果为false。但是在目标窗口中Object.prototype.toString.call(file) === '[object File]'
的计算结果为true。文件对象的所有属性保持不变。
要重新创建问题,请使用以下两页:
<html>
<head>
<script type="text/javascript">
function displayFiles(files) {
window.alert("File 0 is a file? " + (files[0] instanceof File)); // false, should be true
window.alert("It's an object that's a file though, right? " + (Object.prototype.toString.call(files[0]) === '[object File]')); // true
}
</script>
</head>
<body>
<h1>Page 1</h1>
<div onclick="window.open('page2.html');">
Click here to open page two...
</div>
<div id="files">
Files:
</div>
</body>
</html>
第二页:
<html>
<head>
<script type="text/javascript">
function sendFiles() {
var files = document.getElementById('files').files
window.alert("File 0 is a file? " + (files[0] instanceof File)); // true
window.opener.displayFiles(files);
}
</script>
</head>
<body>
<h1>Page 2</h1>
<div onclick="sendFiles();">
Click here to send files...
</div>
<div>
<input type="file" id="files" multiple="multiple" />
</div>
</body>
</html>
必须提供这些页面,如果只是从文件启动,Chrome会抱怨跨窗口脚本。任何想法都会非常感激,如果有什么我可以澄清让我知道。
答案 0 :(得分:0)
您正在检查错误的File
班级。
由于每个窗口都有自己的范围,因此需要
files[0] instanceof opener.File