2012-11-08 46 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();  
     } 
    }); 
}; 
相關問題