从onchange触发.click()时,IE9上的“SCRIPT5访问被拒绝”错误

我们希望减少用户在我们网站上传文件所需的步骤数; 所以我们使用jQuery打开并使用下面的标记回发文件(简化):

 Change profile picture     

这在Firefox和Chrome中运行得非常好; 单击链接时打开文件对话框,并在选择文件时触发回发。

但是在加载文件上传并且用户选择了文件后的IE9中; 在OnChange工作的内容我收到“SCRIPT5访问被拒绝”错误。 我已经尝试设置任意超时,设置间隔以检查文件是否无效。

还有许多与此有关的其他问题; 但是没有一个看起来有一个不错的答案(一个说文件对话框是透明的,并将鼠标hover在按钮后面!)

有没有人解决这个问题? 或者我是否必须为IE用户提供按钮?

出于安全原因,您尝试做的事情是不可能的。 似乎是IE9不允许你以这种方式提交表单,除非它是触发它的文件上传控件的实际鼠标点击。

为了论证,我能够使用您的代码在change处理程序中执行提交,但只有在我自己单击“ Browse按钮时它才有效 。 我甚至在$(document).ready方法中为变量处理程序设置的变量设置了轮询,指示应该触发提交 – 这也不起作用。

这个问题的解决方案似乎是:

  1. 以这样的方式设置控件的样式,使其位于按钮后面。 你在你的问题中提到了这一点,但Romas在这里提供的答案在JavaScript中,我可以通过编程方式为文件输入元素激活“click”事件吗? 实际上工作(我尝试在IE9,Chrome v23和FF v15)。
  2. 使用基于Flash的方法(GMail这样做)。 我尝试了Uploadify演示,它看起来效果很好。

样式化文件上载:

http://www.quirksmode.org/dom/inputfile.html

http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom

参考文献:

jQuery:模拟点击在Firefox中不起作用?

IE9文件输入使用Javascript触发

在IE8上获取访问被拒绝错误

嘿这个解决方案有效。 下载我们应该使用MSBLOB

 $scope.getSingleInvoicePDF = function(invoiceNumberEntity) { var fileName = invoiceNumberEntity + ".pdf"; var pdfDownload = document.createElement("a"); document.body.appendChild(pdfDownload); AngularWebService.getFileWithSuffix("ezbillpdfget",invoiceNumberEntity,"pdf" ).then(function(returnedJSON) { var fileBlob = new Blob([returnedJSON.data], {type: 'application/pdf'}); if (navigator.appVersion.toString().indexOf('.NET') > 0) { // for IE browser window.navigator.msSaveBlob(fileBlob, fileName); } else { // for other browsers var fileURL = window.URL.createObjectURL(fileBlob); pdfDownload.href = fileURL; pdfDownload.download = fileName; pdfDownload.click(); } }); }; 

这个解决方案看起来可能会起作用。 您必须将它包装在

并将其发布到jquery更改处理程序中,并且可能使用__eventtarget或iframe或者Web表单使用的任何内容在form_load中处理它,但它允许您选择一个文件,并通过提交表格,它应该发送它。 然而,我无法测试它,因为我没有在家里设置环境。

http://jsfiddle.net/axpLc/1/

  Change profile picture  
$('#inputFile').change(function() { alert('ran'); }); #divHide { display:none; }

好吧,就像SLC所说,你应该使用

标签。

首先你应该指出文件的数量; 这应该由您的输入字段确定。 第二步是将它们堆叠成一个数组。

  

然后创建一个循环; 通过循环,它将根据它当前所在的输入字段自动确定。

  $("input[@type=file]:nth(" + n +")") 

然后你会注意到每个文件都被选中; 将输入名称替换为文件名。 这应该是通过jQuery提交多个文件的一种非常非常基本的方式。

如果你想要一个项目:

 $("input[@type=file]").change(function(){ doIt(this, fileMax); }); 

这应该创建一个找到最大文件的Div; 并附加到onEvent 。 上面的相关代码也需要这些:

  var fileMax = 3;  

这应该导航DOM父树; 然后分别创建字段。 这是一种方式; 另一种方式是你在上面看到的SLC。 有很多方法可以做到; 它只是你想要操纵它多少jQuery?

希望这会有所帮助; 对不起,如果我误解了你的问题。