在 JavaScript 中,我可以为文件输入元素以编程方式触发“点击”事件吗?

IT技术 javascript html
2021-02-02 01:21:26

我想以<input type="file">编程方式标签上触发点击事件

只是调用 click() 似乎没有做任何事情,或者至少它不会弹出文件选择对话框。

我一直在尝试使用侦听器捕获事件并重定向事件,但我无法像有人单击它那样实际执行事件。

6个回答

我一整天都在寻找解决方案。这些是我得出的结论:

  1. 出于安全原因,Opera 和 Firefox 不允许触发文件输入。
  2. 唯一方便的替代方法是创建一个“隐藏”文件输入(使用不透明度,而不是“隐藏”或“显示:无”!)然后在它的“下方”创建按钮。通过这种方式可以看到按钮,但在用户单击时它实际上会激活文件输入。

希望这可以帮助!:)

<div style="display: block; width: 100px; height: 20px; overflow: hidden;">
<button style="width: 110px; height: 30px; position: relative; top: -5px; left: -5px;"><a href="javascript: void(0)">Upload File</a></button>
<input type="file" id="upload_input" name="upload" style="font-size: 50px; width: 120px; opacity: 0; filter:alpha(opacity=0);  position: relative; top: -40px;; left: -20px" />
</div>
这不是真的,请参阅下面的 Didier 的回应。编程点击必须来自用户操作上下文 - 就像在另一个按钮的点击处理程序中一样。然后它工作正常,不需要溢出元素。
2021-03-16 01:21:26
唯一的问题是,如果您想在悬停时更改按钮样式,则不能。这意味着如果您希望它看起来像应用程序中的所有其他按钮,则不能。
2021-03-22 01:21:26
谢谢你的回答,太棒了:D
2021-03-23 01:21:26
不错的解决方案。也适用于 android 移动浏览器。
2021-03-30 01:21:26
这个解决方案效果很好。不知道为什么它被忽视和未升级。这不是*正是问题所要求的,但它是一个很好的解决方法。您是否发现它与任何浏览器不兼容?我没有时间通过​​所有 10 种以上的相关口味进行测试。
2021-04-07 01:21:26

你可以这样做,在所有的浏览器,IE理应不会允许它,但Mozilla和Opera没有。

当您在 GMail 中撰写邮件时,“附加文件”功能以一种方式用于 IE 和任何支持此功能的浏览器,然后以另一种方式用于 Firefox 和不支持此功能的浏览器。

我不知道为什么你不能做到这一点,但有一点安全风险,并且不允许你在任何浏览器做的,是编程设置HTML文件元素的文件名。

澄清上述评论:Chrome 最近更改为检查文件input元素是否可见。click如果可以看到元素,则触发该方法有效,包括在控制台中。
2021-03-11 01:21:26
@Otvazhnii - 伙计,这个答案(你说的那个是错误的)已经有 10 年的历史了 - 这并不奇怪!(我不确定,我相信你的话)。:P
2021-03-14 01:21:26
更新了我的答案,使其比以前的答案更正确 - 要点是相同的,但澄清应该有所帮助。这家伙遇到了同样的问题:bytes.com/forum/thread542877.html
2021-03-20 01:21:26
感谢上帝 FF5 允许此点击
2021-03-22 01:21:26
德拉特。好吧,我当然明白它是可利用的。这在任何地方都有记录吗?我猜它会被每个浏览器实现?
2021-03-24 01:21:26

您可以在任何浏览器上触发 click() ,但某些浏览器需要元素可见并聚焦。这是一个 jQuery 示例:

$('#input_element').show();
$('#input_element').focus();
$('#input_element').click();
$('#input_element').hide();

它与之前的 hide 一起工作,click()但我不知道它是否可以在不调用 show 方法的情况下工作。从来没有在 Opera 上试过这个,我在 IE/FF/Safari/Chrome 上测试过,它可以工作。我希望这将有所帮助。

奇怪的。正如我测试的那样,它在 Ubuntu 的 Chrome 下不起作用。
2021-03-11 01:21:26
@HoàngLong 它适用于 IE 8 和 9、最新的 Chrome、Safari 和 Firefox。
2021-03-18 01:21:26
感谢分享。以防万一您不知道 - 您可以在 jQuery 中使用链接:$(...).show().focus().click().hide();:)
2021-03-19 01:21:26
@pimvdb:据我测试,您的解决方案仅适用于 Chrome。
2021-03-26 01:21:26
@Hoàng Long:您是指链接还是 Florin Mogos 的解决方案?我不相信链接会产生任何跨浏览器的差异。
2021-04-06 01:21:26

这是可能的:在 FF4+、Opera、Chrome 下:但是:

  1. inputElement.click()应该从用户操作上下文中调用!(不是脚本执行上下文)

  2. <input type="file" />应该是可见的 ( inputElement.style.display !== 'none') (你可以用可见性或其他东西隐藏它,但不是“显示”属性)

哈!我知道它必须与上下文有关!我观察到inputElement.click()从 keydown 事件(附加文件的快捷方式)中调用是有效的,但在超时或 ajax 回调中调用它没有。赞成。
2021-03-10 01:21:26
赞成唯一合理的解决方案。溢出方法很丑陋。
2021-03-15 01:21:26
@bretjonesdev 我认为这意味着它需要在用户启动的事件处理程序中执行,例如单击事件处理程序,而不是Promise、超时或任何其他非用户启动的事件。
2021-03-22 01:21:26
这为我解决了。我不得不将 javascript 添加到onclick属性而不是绑定到事件。
2021-03-23 01:21:26
顺便说一句,有人有关于“用户操作上下文”与“脚本执行上下文”的更多资源吗?我在搜索时看到的一切都与执行上下文和this. :/
2021-03-25 01:21:26

只需使用标签标签,这样您就可以隐藏输入,并通过其相关标签使其工作 https://developer.mozilla.org/fr/docs/Web/HTML/Element/Label

这是正确的答案。所有其他的都是漫长而痛苦的黑客。
2021-03-13 01:21:26
这是正确的答案,应该推广。
2021-04-06 01:21:26