处理一个非常奇怪的gChrome / Javascript问题

时间:2011-03-09 16:32:01

标签: javascript jquery google-chrome google-chrome-extension

我正在使用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分开并计算实现它的工作方式(虽然我没有看到它的工作方式有什么特别之处),但它仍然无法正常工作。控制台没有任何透露 - 没有错误,没有警告。

这使我的头部过热,所以非常感谢任何帮助!

1 个答案:

答案 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在单击按钮时评估您的脚本以便它可以正常工作,如果您尝试在没有按钮单击的情况下评估此脚本,它将无效。

我猜这是一个安全功能,只有当用户执行某些操作时才允许触发事件,而不是来自某些后台进程。