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

Posted

技术标签:

【中文标题】从 onchange 触发 .click() 时 IE9 上出现“SCRIPT5 访问被拒绝”错误【英文标题】:"SCRIPT5 Access is denied" error on IE9 when firing .click() from onchange 【发布时间】:2012-10-28 17:32:35 【问题描述】:

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

<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 用户提供一个按钮是绝对必要的吗?

【问题讨论】:

为什么不直接将 上的 onclick 发送到与 $('#uplRegistrationImage') 的 onclick 相同的函数? onclick 打开文件对话框; 应该在选择文件时触发回发。 我在 Safari 中也遇到了同样的问题,所以我猜 IE9 采取了相同的立场,即 click() 实际上需要用户点击,从安全的角度来看,您应该可以理解。 你有没有找到解决办法,或者你最终只是提供了一个按钮? 我最终更改了应用程序结构以抽象出相关部分。我只是将它用作快捷方式,我不依赖于代码背后/回发应用程序结构。有一种方法可以直接从 jquery 访问方法背后的代码,但这可能对您有所帮助。我建议使用 jQuery 直接链接到您的代码后面。您可以在encosia.com/… 阅读相关内容 【参考方案1】:

出于安全原因,您尝试执行的操作是不可能的。似乎 IE9 不允许您以这种方式提交表单,除非它是在 File Upload 控件上的实际鼠标单击触发它。

为了争论,我可以使用您的代码在 change 处理程序中进行提交,但它在我自己单击 Browse 按钮时才起作用。我什至在$(document).ready 方法中为change 处理程序设置的变量设置了轮询,指示应该触发提交 - 这也不起作用。

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

    设置控件样式,使其位于按钮后面。您在问题中提到了这一点,但 Romas 在这里提供的答案 In javascript can I make a "click" event fire programmatically for a file input element? 确实有效(我在 IE9、Chrome v23 和 FF v15 中尝试过)。 使用基于 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

【讨论】:

完美答案为尼克喝彩。我们最终使用带有 HTTP 处理程序的FineUploader;使用更多样板代码实现大致相同的解决方案。 奇怪,这个jsfiddle似乎证明了这个答案是错误的:jsfiddle.net/NkycS/27文件输入点击是通过JS触发的,提交也是如此,它在IE9中有效。不知道我是否遗漏了什么。 是的,我遗漏了一些东西:我的文件输入没有名称属性。只要我添加一个,我就会收到拒绝访问错误。 jsfiddle.net/NkycS/32【参考方案2】:

嘿,这个解决方案有效。 对于下载,我们应该使用 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();      
       
   );
;

【讨论】:

【参考方案3】:

这个解决方案看起来可能会奏效。您必须将其包装在 &lt;form&gt; 中并将其发布到 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; 

【讨论】:

【参考方案4】:

好吧,就像 SLC 所说,您应该使用 &lt;Form&gt; 标签。

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

<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?

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

【讨论】:

以上是关于从 onchange 触发 .click() 时 IE9 上出现“SCRIPT5 访问被拒绝”错误的主要内容,如果未能解决你的问题,请参考以下文章

WdatePicker 日历控件的onchange事件屏蔽

以编程方式更改值时触发Dojo Select onChange事件触发

input输入框的oninput和onchange事件

以编程方式更改值时触发 Dojo Select onChange 事件

p:日历 onselect/onchange 未触发

change和onchangeclick和onclick的区别,以及onchange和onclick的区别