通过ajax(chrome)在vanillajs中以编程方式启动文件输入点击
Fire a file input click programmatically in vanilla js via ajax (chrome)
我有一个webapp,其中任何按钮点击都会向服务器发送ajax请求,服务器验证并将js代码发送回客户端。我使用的框架不允许我实现jQuery(它会导致不可预测的问题)。
我的问题是,我有一个按钮,当点击时应该打开一个文件选择器。它已经在firefox和ie中工作了。为了实现这一点,我设置了一个隐藏的文件输入:
<input type="file" style="z-index: 999999999; visibility: hidden; position: absolute; top: 0px; left: 0px;">
现在,当我点击按钮时,会发生以下情况:
一个ajax请求被发送到服务器,通知它按钮被点击了。
服务器知道动态创建的html元素的ID,找到正确的ID并向客户端回答:
dropzone_[ID].inputClick();
([ID]是动态创建的ID,只有我的服务器才能确定)
然后,在客户端上调用方法"inputClick()",并对隐藏的输入字段执行单击。代码如下:
dropzone.hiddenFileInput.focus();dropzone.hiddenFileInput.click();
最后,文件选择器出现了,我可以正确地选择文件。
让chrome这样工作似乎是一个安全问题。我已经看到很多其他人也有类似的问题,关注输入字段有帮助,但这在这里不适用。此外,firefox和ie似乎明白点击是一种合法的、通过ajax委托的点击,但chrome不这么认为。
服务器通信本身没有问题。添加到inputClick()
方法的console.log()
将始终在所有浏览器上激发,但单击事件不会在chrome中激发。
有人知道如何为此编写变通方法吗?
试试这个:
el = dropzone.hiddenFileInput;
if (el.onclick) {
el.onclick();
} else if (el.click) {
el.click();
}
某些浏览器使用onclick()
。正因为如此,人们使用jQuery、Mootools等框架和库来避免跨浏览器问题。我不知道为什么你的框架不允许jQuery,因为不可预测的问题,这意味着你的框架编码错误,因为jQuery在所有浏览器中都能完美运行。
编辑
我认为你在试验chrome中的一个bug。请测试此代码:
if (BrowserDetect.browser.indexOf("Chrome") != -1) {
var fireOnThis = document.getElementById('element');
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent( 'click', true, true, window, 0, 0, 345, 7, 220, false, false, true, false, 0, null );
fireOnThis.dispatchEvent(evObj);
return true;
}
- Node SocketIO以编程方式强制在损坏的套接字上重新启动
- 创建一个键盘快捷方式来启动Google Chrome扩展
- 函数未以编程方式启动.click()
- this.collection.each不会以这种方式启动(backbone.js)
- 以处理错误的方式启动javascript承诺蓝鸟链
- Photowipe 4.0:以编程方式启动“滑动到下一个”
- 以编程方式启动 UIWebView 键盘
- 是否可以以编程方式触发点击/拖动事件以启动轮播移动
- 如何在不重新启动 Web 应用程序的情况下以编程方式使 JavaScript 和 CSS 包失效或刷新
- blur() 无法以编程方式工作 |但在从用户启动时会这样做
- 如果以编程方式启动提交,则不会触发提交事件
- Youtube视频事件未启动[在本地测试或以其他方式测试时]
- CKEditor插件-如何以正确的方式启动DialogCommand
- 什么'这是等待指令中启动的承诺得到解决的最佳方式
- 通过ajax(chrome)在vanillajs中以编程方式启动文件输入点击
- 以编程方式启动输入的更改事件
- 防止停止事件在启动后立即触发的优雅方式
- SproutCore以编程方式在菜单栏中启动项目选择
- 防止显示以编程方式附加的HTML对象,直到对象启动JS完成
- 定义回调并立即启动一次的最佳方式