在 IE 中可以打开文件输入对话框并上传 onchange 吗?

2024-04-22

这基本上是我现在所拥有的简化:

<style>
form.noshow { height: 0; overflow: hidden; }
</style>

<form class=noshow target="SomeIframeThatExists">
  <input type=file id=uf>
</form>

<a id=uflink href="/user/photo">Upload photo</a>

<script>
$('uf').addEvent('change', function(e) {
  // alert('oele'); // this would work fine
  this.form.submit(); // auch in IE > "Access denied" exception
});
$('uflink').addEvent('click', function(e) {
  $('uf').click(); // opens file dialog in all browsers inc IE
  return false;
});
</script>

它在 Chrome 11 和 FF 4 中的作用(完美):

  1. 表格被隐藏。
  2. 您点击链接
  3. 选择文件对话框打开
  4. 您选择一个文件
  5. 对话框关闭
  6. 表格已提交
  7. 执行 iframe 中的脚本并替换照片

非常高科技和甜蜜。

在 IE 中,除了 [6] 之外,所有这些都有效。表格未提交。 JavaScript 错误:“访问被拒绝”。无论表单如何不可见,只要对话框是用以下命令打开的input.click()表单无法在更改时提交。 (onchange函数执行得很好。错误仅发生在form.submit()叫做。)

现在这一切我都可以接受。 IE 太烂了。我忍受它。

到目前为止我的解决方案是检查navigator对于“MSIE”,然后单击链接而不是打开对话框时,显示表单(带有文件输入)。然后用户必须单击实际的、丑陋的文件输入,然后一切正常。但很丑。

问题是双重的:

  1. 有没有办法在 IE 中做到这一点,就像在 Chrome 中一样酷?没有令人讨厌的 flash/java 垃圾。只有 html 元素和 javascript。
  2. 如果没有:有没有办法在从链接打开对话框后检查 form.submit() 支持(除了!navigator.contains("MSIE"))?

[2] 可能会捕获 IE 中引发的“访问被拒绝”异常,但为时已晚:用户已经打开对话框并浏览到照片。你不想让他再这样做。 (即使是 IE 用户也不值得这样做。)

附言。我只对 Chrome 10+、Firefox 3.6+ 和 IE8+ 感兴趣。

附言。可能很重要:文件输入元素不能位于链接附近的任何位置,因为链接位于表单内,并且该表单(必须)与文件上传表单分开。

UPDATE
其次:检测对这种仅在 IE 中不起作用的高科技行为的支持。我不想用navigator.appName.contains('MSIE')因为这不灵活,也不一定正确。


@Rudie,在这里 - 感谢您的代码!它在 IE 和 Chrome 中运行良好,但在 FireFox 中则不然。

我设法采用我的旧代码(适用于 FF 和 Chrome)并将您的代码合并为 MSIE。

在这里查看:

针对 IE、Chrome 和 Firefox 的修复

https://gist.github.com/4337047 https://gist.github.com/4337047

PROBLEM:当通过脚本化的强制 click() 事件打开文件输入时,IE 不会让您提交表单。 如果您通过自己的鼠标单击文件输入(我们不希望这样做),IE 将让您提交表单。

请注意,截至目前,如果文件输入字段通过脚本化“单击”事件发生更改,则 IE11 允许提交表单。

Solution(部分感谢 R​​udie @ Stackoverflow,https://stackoverflow.com/users/247372/rudie https://stackoverflow.com/users/247372/rudie , http://hotblocks.nl/ http://hotblocks.nl/):

为 IE 中的输入制作标签。如果你点击它,它会强制点击输入字段 - 并且 IE 会接受这一点(愚蠢的 IE 认为用户点击了输入字段,哈哈)

因此,我们将在该标签中放置我们自己风格的 DIV。

下一个问题是,这在 FF 中不起作用。因此,我们进行了一个简单的(可能是令人讨厌的)浏览器检查,并根据浏览器我们将显示不同的按钮。

解决方案就在这里。测试于:

  • 赢7x64
  • 火狐浏览器 13.01
  • 铬 23.0.1271.97 m
  • 常规 IE9 模式下的 IE9

非常欢迎更多测试/添加代码!

EDIT:

去引用罗伊·麦肯齐

如果文件输入字段通过脚本化“单击”事件发生更改,IE11 现在允许提交表单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 IE 中可以打开文件输入对话框并上传 onchange 吗? 的相关文章

  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 请解释与 Google Chrome 扩展程序的后台通信

    我已经阅读并重新阅读了此页面 并运行了示例 http code google com chrome extensions background pages html http code google com chrome extension
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 在 MongoDB 中查找具有字符串 ID 数组的文档

    我有一个 id 字符串数组 我想将其与 find 函数一起使用 db companies find id in arr arr看起来像这样 563a2c60b511b7ff2c61e938 563a2c60b511b7ff2c61e8b7
  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • 如何向 jQuery Tokeninput 添加占位符?

    如何将占位符添加到 jQuery Tokeninput 字段 一个正常的placeholder属性在这里不起作用 对于这样的输入
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 如何在 d3 js 中突出显示从根到选定节点的路径?

    我使用 d3 js 创建了一棵树 现在我创建了一个下拉菜单 其中包含树中所有节点的列表 现在 从下拉菜单中选择一个节点时 我想突出显示从根到该特定节点的路径 这个怎么做 首先创建一个 flatten 函数 它将分层数据变成一个 n 数组 f
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • KeyboardEvent.keyCode 已弃用。这在实践中意味着什么?

    根据 MDN 我们绝对应该not正在使用 keyCode财产 它已被弃用 https developer mozilla org en US docs Web API KeyboardEvent keyCode https develope
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定

随机推荐