2014-11-05 72 views
1

Primefaces 5呼叫改變事件在IE8 programmaticaly

我在代碼<input type="file" class="ui-fileupload-choose>上傳的文件。此input -Tag自動從PrimeFaces組件<p:fileUpload>生成。 我想隱藏input元素的按鈕,並使用我自己的樣式化按鈕進行上傳。

所以這是風格化的按鈕。

<input type="button" onclick="$('#formId\\:uploaderId .ui-fileupload-choose input').click();"> 

這確實功能FF,Chrome和IE9,10,11 但在IE8什麼也沒有發生在上載階段。顯示「選擇文件」對話框。生成的input file具有JQuery更改事件。我相信這個事件不會被調用,因爲如果我點擊input file按鈕,它會在所有瀏覽器中進行。

我已經試過

<input type="button" onclick="$('#formId\\:uploaderId .ui-fileupload-choose input').click(); #formId\\:uploaderId ui-fileupload-choose input').trigger('change');"> 

,但它並不能幫助。

而且我已經試過

$('#formId\\:uploaderId .ui-fileupload-choose input').change(function() { 
    // Cause the change() event 
    // to be fired in IE8 et. al. 
    //some checks against recursion. 
    alert("I'm in change"); 
    $('#formId\\:uploaderId .ui-fileupload-choose input').change();    
}); 

在變化的函數被調用,但它也沒有幫助。

在這種情況下我該怎麼辦?

+1

神奇的是,我現在正在我的一個項目中處理同樣的問題。 看來,這是一個安全問題,輸入文件的點擊/改變是由javascript onclick手動觸發的。啓動上傳的過程正在進行,但請求永遠不會被髮送!如果我找到一些優雅的解決方案,我會更新這個問題!目前我正在檢查瀏覽器版本,如果它是IE,我正在改變上傳的方式。 – 2014-11-05 08:54:06

+0

@HatemAlimam酷,謝謝你的評論。如果沒有簡單的解決方案來解決這個問題,我將使用''而不做任何更改。祝你好運 ! – Tony 2014-11-05 08:59:48

+0

我剛剛發現了另一個[問題](http:// stackoverflow。com/questions/12556988/ie-doesnt-allow-to-upload-the-file-if-it-not-keybord-click-for-input-type-f)關於該主題,我認爲我是對的一個安全的東西IE:( – 2014-11-05 09:01:10

回答

1

這是由於IE中的安全限制。

當有<input type="file"/>具有

  • display:none
  • visbilty:hidden
  • opacity: 0

IE塊上載文件的請求,如果它被手動地稱爲(JavaScript的點擊)。

在PrimeFaces案例中,輸入文件有opacity: 0

這裏的輸入文件看起來像沒有CSS額外的口味:

fileupload

的變通方法是把輸入文件外p:fileUpload組件,因此它可以鬆CSS角色,並將其追加到帶按鈕樣式的跨度或div,這將導致實際點擊文件輸入。

按鈕

<span class="btn btn-primary btn-file"> 
    <i class="fa fa-upload"></i> Upload File 
</span> 

的JavaScript

$(document).ready(function() { 
    $('.ui-fileupload-buttonbar span input[type=file]').addClass('uploadBtn'); 
    $('.btn-file').append($('.uploadBtn')); 
}); 

東西此鏈接:

append1

現在爲了讓它看起來很好,並在包括IE在內的所有瀏覽器上同時工作,應該添加一些CSS。 首先忽略前兩個CSS類btn btn-primary(顏色,填充等)

btn-file是自定義特技:

.btn-file { 
    position: relative; 
    overflow: hidden; 
} 

.btn-file input[type=file] { 
    position: absolute; 
    top: 0; 
    right: 0; 
    min-width: 100%; 
    min-height: 100%; 
    font-size: 999px; 
    text-align: right; 
    filter: alpha(opacity=0); 
    opacity: 0;   
    cursor: inherit; 
    display: block; 
} 

最終的結果是,在後臺輸入文件的按鈕:

final

p:fileUpload部件應該被隱藏:

<p:fileUpload style="display: none" /> 

爲了顯示錯誤信息,您可以使用onchange事件爲輸入文件:

$('.uploadBtn').change(function() { 
    var a = $('.ui-fileupload-content').html(); var b = $('#editUserUploadMessages').html(a); 
}) 

哪裏#editUserUploadMessages是包含所有消息的股利。

最後隱藏其他上傳的文件:

#editUserUploadMessages .ui-fileupload-files { 
    display: none; 
} 

你可以找到github一個小例子和哈特姆的出色答卷一個Demo

+0

哇,謝謝你的回答。我還需要顯示錯誤(fileSize和fileType),所以我發佈了額外的解決方案。 – Tony 2014-11-05 13:11:16

+1

我還添加了一種顯示消息的方法,重試演示,上傳一個非圖像文件:) – 2014-11-05 13:37:24

-1
  1. 添加樣式display:none來輸入類型=「文件」
  2. 在輸入類型文件的位置創建新的文本框和按鈕
  3. 創建js函數單擊按鈕單擊文件的按鈕時上傳
+1

請不要回答問題沒有先仔細閱讀! – 2014-11-05 08:56:16

1

其他的解決方案。 它使用這個SO answer

您可以使用html標記<label>將點擊轉發到輸入按鈕。

<h:form id="formId" > 
<style> 

#formId\:uploaderId .ui-fileupload-buttonbar { 
    position: absolute; 
    left: -10000px; 
} 

#formId\:uploaderId .ui-fileupload-content { 
    border: none; 
} 
</style> 

<p:fileUpload id="uploaderId" mode="advanced" auto="true" allowTypes="..." fileLimit="..."> 


<label for="formId:uploaderId_input"> 
    <span class="fa fa-upload" />  
</label> 
</h:form> 

這樣的誤差將在點被示出,其中被包括<p:fileUpload>

+0

有趣,清晰,小解決方案 – 2014-11-05 13:37:49