我正在使用Chrome扩展程序,我必须通过jQuery点击javascript中的<input type='file' />
,以显示“另存为”对话框。是的,我被告知 - 大多数浏览器都不允许你这样做。但是,我发现了一些非常奇怪的东西 - 如果我通过地址栏执行此操作,我可以单击文件输入元素(并弹出“保存”对话框),如下所示:
javascript: $("<input type='file' />").appendTo("body").click();
所以,我想如果我能在那里做,那么我当然可以从我的内容脚本中做到这一点......
显然我错了。从我的内容脚本运行$("<input type='file' />").appendTo("body").click();
不仅可以附加元素,还可以模拟地址栏,并且window.location = "javascript: $(\"<input type='file' />\").appendTo(\"body\").focus().click();";
也可以执行zilch 。
我最初的想法是,这可能是内容脚本中的某种限制,但我错了 - 通过内容脚本工作的扩展jsShell能够运行命令并获得我想要的结果顺手而已。
那么,有谁知道为什么jsShell&amp;浏览器可以单击文件输入并获取保存对话框,但我的扩展名不能?我已经尝试将jsShell分开并计算实现它的工作方式(虽然我没有看到它的工作方式有什么特别之处),但它仍然无法正常工作。控制台没有任何透露 - 没有错误,没有警告。
这使我的头部过热,所以非常感谢任何帮助!
答案 0 :(得分:1)
不确定问题的根源是什么,但我设法缩小了一点,也许对你有所帮助。
似乎只有在任何其他事件中触发时才触发click事件。例如,这有效:
$("body").mouseover(test);
function test() {
$("<input type='file' />").appendTo("body").click();
}
这也有效:
$("body").append($("<a/>").text("test").click(test));
但这不是:
$("body").append($("<a/>").text("test").click(function(){
setTimeout(test,1000);
}));
Jsshell在单击按钮时评估您的脚本以便它可以正常工作,如果您尝试在没有按钮单击的情况下评估此脚本,它将无效。
我猜这是一个安全功能,只有当用户执行某些操作时才允许触发事件,而不是来自某些后台进程。