我希望用户能够通过我的扩展程序的browserAction
弹出窗口上传文本文件作为输入,但我遇到了一些问题。
我一直在使用隐藏的input
标记,当用户点击文件上传按钮时,我会使用click()
触发该标记。文件浏览器对话框打开,所有内容似乎都运行良好,直到弹出窗口自动关闭。由于包含input
代码关闭的“网页”,change
事件永远不会触发。
由于扩展程序已经有一个后台脚本用于使用持久数据填充弹出窗口,我想我可以在后台脚本中创建input
并使用{{1}触发 当用户点击弹出窗口中的文件上传按钮时。
但是,即使在后台脚本中为.click()
触发click事件,也不会打开文件浏览器对话框。
我认为这是因为Chrome不允许以编程方式触发文件输入,除非是通过用户操作,但我不确定。这就是我尝试的方式;
popup.js
input
background.js
//Button in popup which should open file broswer dialog
//when clicked
browseBtn.addEventListener('click', function() {
chrome.runtime.sendMessage({msg: 'file_input'});
}
我知道var fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = 'text/*';
fileInput.addEventListener('click', function(e) {
console.log('fileInput clicked');
}, false);
fileInput.addEventListener('change', function(e) {
console.log('fileInput changed');
console.log(this.files);
}, false);
chrome.runtime.onMessage.addListener(function(e) {
if(e.msg === 'file_input')
fileInput.click();
});
事件已被触发,因为已记录click
。但是,文件浏览器对话框无法打开。
我还使用fileInput clicked
尝试使用此代码的变体来直接调用chrome.extension.getBackgroundPage()
。同样,fileInput.click()
事件被触发,但对话框未打开。
我的问题是;有没有办法让后台脚本触发文件click
来打开文件浏览器对话框?这将是最好的解决方案,因为即使弹出窗口以某种方式关闭,它也允许扩展从指定文件中提取数据。
如果没有,是否有办法避免在文件浏览器对话框打开时关闭弹出窗口?根据我的发现,使用隐藏的input
标签应该是一种解决方案,它确实适用于某些情况,但不适用于所有用户。
例如,我可以在Chrome,Windows 7上关闭没有弹出窗口的文件。但是,在Chromium,Ubuntu 14.04上,弹出窗口会在文件浏览器对话框打开的瞬间关闭。
感谢任何帮助。