2012-11-08 50 views
9

我们希望减少用户在我们网站上传文件所需的步骤数量;所以我们使用jQuery打开和回发文件使用下面的标记(简化):在IE9上触发“SCRIPT5访问被拒绝”错误时发生。onclick()ongle

<a onclick="$('#uplRegistrationImage').click();"> 
    Change profile picture 
</a> 

<!-- Hidden to keep the UI clean --> 
<asp:FileUpload ID="uplRegistrationImage" 
       runat="server" 
       ClientIDMode="static" 
       Style="display:none" 
       onchange="$('#btnSubmitImage').click();" /> 

<asp:Button runat="server" 
      ID="btnSubmitImage" 
      ClientIDMode="static" 
      Style="display:none" 
      OnClick="btnSubmitImage_OnClick" 
      UseSubmitBehavior="False" /> 

这在Firefox和Chrome中绝对正常;单击链接时打开文件对话框,选择文件时触发回发。

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

还有一些与此有关的其他问题;然而,没有一个看起来有正确的答案(一个说,设置文件对话框是透明的,并悬停在按钮后面!)

有没有其他人解决这个问题?或者是否为IE用户提供按钮是绝对必要的?

回答

13

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

为了讨论各种情形,我可以用你的代码做的change处理程序提交,但它的工作只有当我点击该按钮Browse自己。我甚至在$(document).ready方法中设置了由change处理程序设置的变量的轮询,表明应该触发提交 - 这也不起作用。

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

  1. ,它位于一个按钮后面这种方式的样式控制。你在你的问题中提到过这个问题,但是这里提供的答案是由罗马在这里In JavaScript can I make a "click" event fire programmatically for a file input element?确实有效(我试过在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 : simulating a click on a <input type="file" /> doesn't work in Firefox?

IE9 file input triggering using Javascript

getting access is denied error on IE8

+1

完美答案欢呼尼克。我们最终使用了[FineUploader](http://fineuploader.com/)和HTTP Handler;用更多的锅炉代码实现大致相同的解决方案。 –

+0

奇怪的是,这jsfiddle似乎证明这个答案是错误的:http://jsfiddle.net/NkycS/27/文件输入点击通过JS触发,所以是提交,它在IE9中的作品。不知道我是否错过了一些东西。 – RwwL

+0

是的,我错过了一些东西:我的文件输入没有它的名称属性。一旦我添加一个,我确实得到访问被拒绝的错误。 http://jsfiddle.net/NkycS/32/ – RwwL

2

此解决方案看起来可能有效。你必须将它包装在<form>中,并让它在jQuery变更处理程序中发布,并且可能会使用__eventtarget或iframe或其他任何Web表单使用的form_load处理它,但它允许您选择一个文件,并提交表格,它应该发送它。但是我无法测试它,因为我没有在家设置环境。

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

<a onclick="$('#inputFile').click();"> 
    Change profile picture 
</a> 
<div id='divHide'> 

    <input id='inputFile' type='file' /> 

</div> 


$('#inputFile').change(function() { alert('ran'); }); 

#divHide { display:none; } 
0

嗯,就像SLC说,你应该利用<Form>标签。

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

<input type="file" class="upload" name="fileX[]"/> 

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

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

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

如果你想一个项目:

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

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

var fileMax = 3; 
<input type="file" class="upload" name="fileX[]" /> 

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

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

3

嘿,这个解决方案的作品。 下载,我们应该使用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();  
     } 
    }); 
}; 
相关问题