2017-04-24 43 views
0

我正在使用CKEditor将一些文件拖到编辑器上。为什么instanceof在Chrome,Safari和Edge上返回false,在FireFox上是否为true?

我在drop事件中看到了这种奇怪的行为。在检查事件对象时,我可以使用files属性。调试器显示此类型为FileList。但是,当我做files instanceof FileList时,我在Chrome,Safari和Edge中获得false,在FireFox中获得true(请参阅this fiddle)。

这是怎么回事?

似乎它必须与CKEditor如何路由事件有关,因为如果没有CKEditor,它看起来确实有效。这是一个basic file drag-drop jsfiddle我叉,以便它打印instanceof FileList

我正在通过做Object.prototype.toString.call(files) == "[object FileList]"来解决这个问题。但这似乎不是一个好的长期解决方案。

编辑:我对铬公布a bug report,因为我觉得这是一件在Chrome中包含的回答这个问题,这是错误的

回答

0

的响应错误报告。

通过rbyers

这不只是文件列表,而是整个的dragEvent。调试这个,我发现CKEditor正在创建一个iframe,所以传递给iframe的事件类型与运行事件处理程序的主窗口有不同的原型对象。打破上的 '降' 事件侦听器(之前的任何的JS的运行,并可能与事件渣土):

Object.getPrototypeOf(c)===window.DragEvent.prototype
false

Object.getPrototypeOf(c)===document.querySelector('iframe.cke_wysiwyg_frame').contentWindow.DragEvent.prototype
true

见的instanceof和多的文件上下文在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof#instanceof_and_multiple_context_(e.g._frames_or_windows)

但是,我确实看到这种情况下在Firefox中返回true的实例。这里是一个非常简单的复制:http://jsbin.com/yefesuv

如果你读更多的答复,原来有网络IDL和ES规范之间的差异了火狐在下面的Web IDL和所有其他浏览器ES。 They have updated the Web IDL spec,并且FireFox有a bug report。由于向后兼容性,FireFox将会改变其行为。

相关问题