javascript - 无法通过将文件拖放到按钮外的区域来选择文件,但仅在使用 Shadow DOM 时才在输入内

标签 javascript file google-chrome shadow-dom custom-element

在 chrome 中,可以将以下输入元素拖放到输入的底部区域。 我期待这种行为。

<input type="file" class="input-file">

<style>
.input-file {
    display: block;
    width: 300px;
    height: 300px;
    border: 1px solid red;
    margin: 10px;
}
</style>

但是在 Shadow DOM 内部就不一样了。 可以将以下输入元素拖放到仅位于输入左上方区域的“选择文件”按钮。 当文件被拖放到输入的底部区域时,拖放的文件被打开而不是被选择。

customElements.define("foo-bar", class extends HTMLElement {
    constructor(){
        super()
        this.attachShadow({mode: "open"}).innerHTML = `
            <input type="file" class="input-file">

            <style>
            .input-file {
                display: block;
                width: 300px;
                height: 300px;
                border: 1px solid red;
                margin: 10px;
            }
            </style>
        `
    }
})
document.body.innerHTML = "<foo-bar></foo-bar>"

我认为这是由于 Shadow DOM 之外的事件未被通知而导致的错误。

有解决办法吗?

最佳答案

解决方法是处理 drop事件。

this.shadowRoot.querySelector( 'input' ).ondrop = ev => {
    console.log( 'dropped in', ev.dataTransfer.items.length  )
    for ( var i = 0 ; i < ev.dataTransfer.items.length ; i++ ) {
        if (ev.dataTransfer.items[i].kind === 'file') {
            var file = ev.dataTransfer.items[i].getAsFile()
            console.log( 'file[' + i + '].name = ' + file.name )
        }
    }
    ev.preventDefault()
}

不要忘记调用 preventDefault() 方法来中止文件打开。

关于javascript - 无法通过将文件拖放到按钮外的区域来选择文件,但仅在使用 Shadow DOM 时才在输入内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989690/

相关文章:

jquery - 我如何防止它向下推?

javascript - Chrome : JS loads before HTML

javascript - Meteor 集合中的 2 个出版物良好实践

c# - 在 ASP.NET 应用程序中将图像从 JavaScript 传递到 C#?

JavaScript 不检查复选框是否被选中

php - 读取最新创建的文件 php

c++ - 增强程序 - 完全失败

c++ - 将字符串打印到文件,为什么需要额外的位?

javascript - 来自字符串的 JSON 数组

javascript - Chrome 用户脚本错误 : "Unsafe JavaScript attempt to access frame"