gpt4 book ai didi

javascript - html5 拖放 - items.webkitGetAsEntry() 方法不存在

转载 作者:行者123 更新时间:2023-11-28 04:23:35 24 4
gpt4 key购买 nike

你好,我正在尝试使用 chrome 将文件拖放到我的文件系统中,但我在控制台中收到以下错误:

var dnd = new DnDFileController('body', function(files, e) {
var items = e.dataTransfer.items;
for (var i = 0, item; item = items[i]; ++i) {
traverseFileTree(item.webkitGetAsEntry());
**Uncaught TypeError: Object #<DataTransferItem> has no method 'webkitGetAsEntry'**
}
});

我也试过像这样在循环中添加方法:

for (var i = 0, item; item = items[i].webkitGetAsEntry();; ++i) {
traverseFileTree(item);
}

错误是这样的:

Uncaught TypeError: Object #<DataTransferItem> has no method 'webkitGetAsEntry' app.js:513
(anonymous function) app.js:513
DnDFileController.drop dnd.js:27

DNDFileController.drop 代码如下:

this.drop = function(e) {
e.stopPropagation();
e.preventDefault();

el_.classList.remove('dropping');

onDropCallback(e.dataTransfer.files, e);
};

但是我得到了同样的错误,有什么想法吗?谢谢。

最佳答案

大概您正在使用这个 DnDFileController - http://html5-demos.appspot.com/static/filesystem/filer.js/demos/js/dnd.js .因此,首先,我已将您的代码置于可测试状态:

function DnDFileController(selector, onDropCallback) {
var el_ = document.querySelector(selector);

this.dragenter = function(e) {
e.stopPropagation();
e.preventDefault();
el_.classList.add('dropping');
};

this.dragover = function(e) {
e.stopPropagation();
e.preventDefault();
};

this.dragleave = function(e) {
e.stopPropagation();
e.preventDefault();
//el_.classList.remove('dropping');
};

this.drop = function(e) {
e.stopPropagation();
e.preventDefault();

el_.classList.remove('dropping');
onDropCallback(e.dataTransfer.files, e);
};

el_.addEventListener('dragenter', this.dragenter, false);
el_.addEventListener('dragover', this.dragover, false);
el_.addEventListener('dragleave', this.dragleave, false);
el_.addEventListener('drop', this.drop, false);
};

var dnd = new DnDFileController('body', function(files, e) {
var items = e.dataTransfer.items;
for (var i = 0, item; item = items[i]; ++i) {
if (item.kind == 'file') {
debugger
console.log(item.webkitGetAsEntry());
}
}
});

现在,在调试器中检查 item 的状态,在 Chrome 20.0.1132.27 beta 中,它仅公开当前规范 [1] 中的那些属性和方法 - 即 item.kind、item.type、item .getAsString(回调) 和 item.getAsFile()。 DataTransferItem.webkitGetAsEntry() 未公开。据我所知[2],Chrome 不应该公开他们提议的 webkitGetAsEntry,并且在将其打开仅一周后[3],他们又关闭了它的开关。所以目前,除非您使用任何标志来启用它,否则它不会启用[4]。

启用它后,它看起来也像 getAsString 一样与回调一起使用,而不仅仅是作为 getter。参见 [5] 中的示例:

    var items = e.dataTransfer.items;
for (var i = 0; i < items.length; ++i) {
if (items[i].kind == 'file') {
items[i].webkitGetAsEntry(function(entry) {
displayEntry(entry.name + (entry.isDirectory ? ' [dir]' : ''));
...
});
}
}

请注意,他们还将其包装在一个保护性检查中,以确保 file[i] 实际上是一个文件;这在我上面的测试代码中,但在您的代码中缺失。

但是如果您只是想访问这些文件,您是否有理由要使用这种实验方法?这是一个非常简单的循环,使用 FileReader 读取文件,然后对其进行 Blob 化,然后将其存储在本地文件系统中……所有这些方法都远没有那么实验性和新颖性。

引用:

[1] http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitem-interface

[2] http://trac.webkit.org/changeset/118507

[3] http://code.google.com/p/chromium/issues/detail?id=129702

[4] https://bugs.webkit.org/show_bug.cgi?id=87457

[5] http://lists.w3.org/Archives/Public/public-whatwg-archive/2012Apr/0078.html

============================================= =======

2012 年 7 月 26 日更新:

此方法现已删除标志要求,并可在 2012 年 7 月 23 日发布的 Chrome 21 中用于一般用途。但是,对于此处描述的用例,上述实现起来要简单得多,并且更符合需求,因为不需要同时读取整个目录。

关于javascript - html5 拖放 - items.webkitGetAsEntry() 方法不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com