2017-04-24 42 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將會改變其行爲。

相關問題