2014-04-06 21 views
8

我試着用在不同的位置描述一劈它使用:找到,如果「取消」被點擊文件輸入

document.body.onfocus = checkOnCancel(); 

一個例子:

var fileSelectEle = document.getElementById('fileinput'); 

fileSelectEle.onclick = charge; 

function charge() 
{ 
    document.body.onfocus = checkOnCancel; 
} 

function checkOnCancel() 
{ 
    alert("FileName:" + fileSelectEle.value + "; Length: " + fileSelectEle.value.length); 
    if(fileSelectEle.value.length == 0) alert('You clicked cancel!') 
    else alert('You selected a file!'); 
    document.body.onfocus = null; 
} 

有什麼問題嗎?因爲fileSelectedEle.value總是返回以前的執行值而不是用戶選擇的值。 這是輸入文件的預期行爲?如何解決這個問題以讀取選擇的實際文件?

http://jsfiddle.net/smV9c/2/

可以通過重現該錯誤:

步驟1:選擇文件 - 一些選擇一些文件(並注意的輸出)

步驟2:選擇文件 - 按取消(和通知輸出)

+0

你的意思是'document.body.onfocus = checkOnCancel;'? (沒有函數調用。) – Scimonster

+0

@Scimonster - 不,我的意思是document.body.onfocus = checkOnCancel(); (帶函數調用) – SamSharma

回答

10

一種解決方案是使用inputonchange事件。

var fileSelectEle = document.getElementById('fileinput'); 

fileSelectEle.onchange = function() 
{ 
    if(fileSelectEle.value.length == 0) { 
    alert('You clicked cancel - ' + "FileName:" + fileSelectEle.value + "; Length: " + fileSelectEle.value.length); 
    } else { 
    alert('You selected a file - ' + "FileName:" + fileSelectEle.value + "; Length: " + fileSelectEle.value.length); 
    } 
} 

這正確響應所選擇的文件名更改,因爲你可以測試在這裏:http://jsfiddle.net/munderwood/6h2r7/1/

從你試圖做的方式行爲的唯一潛在的區別是,如果取消的權利或者連續兩次,或者連續兩次選擇同一個文件,那麼事件不會觸發。但是,每次文件名實際更改時,都會正確檢測到它。

我不知道爲什麼你的原始嘗試不起作用,但我最好的猜測是這是一個時間問題,異步觸發onfocus事件,並且在input控件的屬性完成更新之前。

UPDATE:,以確定哪些用戶已選擇每次關閉該文件對話框時,再次將接收焦點之間的短暫延遲,並檢查的值,即使沒有發生任何變化,計時問題可以被迴避文件輸入。在收到焦點後立即調用checkOnCancel,而以下版本的charge會導致它在十秒後被調用。

function charge() { 
    document.body.onfocus = function() { setTimeout(checkOnCancel, 100); }; 
} 

這是一個工作版本:http://jsfiddle.net/munderwood/6h2r7/2/

+0

使用onclick的目的是在連續兩次選擇同一文件時捕獲取消事件和情況。有沒有解決時間問題的方法?即強制更新值? – SamSharma

+0

真的好主意,當重點回到身體時聽;) – QuarK

+1

哦!是不是在Android的:( – QuarK

0

有什麼問題嗎?因爲fileSelectedEle.value總是返回前一個執行值而不是用戶選擇的值。這是輸入文件的預期行爲嗎?如何解決這個問題以讀取選擇的實際文件?

沒有什麼錯,這是預期的行爲。如果用戶取消文件選擇過程,那麼就好像他們從未開始過它。所以之前的值保留在原位。

+0

即使用戶選擇文件而不是取消,我也會得到前一個執行值 - http://jsfiddle.net/smV9c/2/ – SamSharma

+0

您可以通過訪問文件列表$(':file')[0] .files –

+0

獲得所選文件奇怪的「預期行爲」。在linux桌面上使用zenity時,我也會在取消窗口時獲得返回值。 – domih

0

您可以掛接到,當他們取消窗口的文件選擇對話框,其被炒魷魚的window.focus事件。然後檢查它是否實際上選擇了一個文件。

+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17998378) –

相關問題