【问题标题】:Dealing with a very weird gChrome/Javascript problem处理一个非常奇怪的 gChrome/Javascript 问题
【发布时间】:2011-07-12 01:24:09
【问题描述】:

我正在开发一个 Chrome 扩展程序,我必须通过 jQuery 在 javascript 中单击 <input type='file' /> 才能显示“另存为”对话框。是的,有人告诉我——大多数浏览器不允许你这样做。但是,我发现了一些非常奇怪的东西——如果我通过地址栏点击文件输入元素(并弹出保存对话框),如下所示:

javascript: $("<input type='file' />").appendTo("body").click();

所以,我想如果我可以在那里做,那么我当然可以从我的内容脚本中做...

显然我错了。从我的内容脚本中运行 $("&lt;input type='file' /&gt;").appendTo("body").click(); 不仅会执行 zilch 除了附加元素之外,甚至模拟地址栏并执行 window.location = "javascript: $(\"&lt;input type='file' /&gt;\").appendTo(\"body\").focus().click();"; 也会执行 zilch

我最初的想法是,这可能是内容脚本中的某种 chrome 限制,但我错了 - 通过内容脚本工作的扩展 jsShell 能够运行命令并获得我想要的结果而无需搭便车。

那么,有谁知道为什么 jsShell 和浏览器可以单击文件输入并获得一个保存对话框,但我的扩展程序不能?我已经尝试将 jsShell 拆开并弄清楚它的工作方式(尽管我没有看到它的工作方式有什么特别之处),但它仍然无法正常工作。并且控制台没有显示任何内容 - 没有错误,没有警告。

这让我的头过热,非常感谢任何帮助!

【问题讨论】:

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


【解决方案1】:

不确定问题的根源是什么,但我设法缩小了范围,也许对你有帮助。

似乎只有在任何其他事件中触发点击事件才会触发。例如这有效:

$("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 在单击按钮时评估您的脚本,因此它可以工作,如果您尝试在不单击按钮的情况下评估此脚本,它将无法工作。

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

【讨论】:

  • 等等...废话,所以这意味着我仍然无法做我想做的...即在没有用户交互的情况下单击文件输入,对吧?
  • @motionman95 我稍微编辑了我的代码,body.click 不是一个很好的例子。好吧,我不知道你想做什么。如果用户没有单击某个按钮或移动鼠标以显示此对话框,那么它可能不起作用(如果它是我认为的那样)
  • 我不认为他测试过,无论哪种方式我相信他得出的结论是正确的..
  • @motionman95 我对它进行了测试,它可以工作,那些斜杠只是其他测试代码的剩余部分(拥有它们不会影响任何东西)。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多