2014-04-06 6 views
8

Próbowałem za pomocą hack opisaną w różnych miejscach, które wykorzystuje:Znajdź jeżeli „anulować” został kliknięty na wejściu pliku

document.body.onfocus = checkOnCancel(); 

przykład:

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; 
} 

jest coś złego tutaj? Ponieważ fileSelectedEle.value zawsze zwraca poprzednią wartość wykonania, a NIE tę wybraną przez użytkownika. Czy jest to oczekiwane zachowanie pliku wejściowego? Jak rozwiązać ten problem, aby odczytać wybrany plik?

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

można odtworzyć błąd przez:

Krok 1: SelectFile - niektóre wybrać jakiś plik (i zauważyć wyjście)

Krok 2: SelectFile - Naciśnij przycisk Anuluj (i nota wyjście)

+0

Masz na myśli 'document.body.onfocus = checkOnCancel;'? (Brak wywołania funkcji.) – Scimonster

+0

@Scimonster - Nie, mam na myśli document.body.onfocus = checkOnCancel(); (z wywołaniem funkcji) – SamSharma

Odpowiedz

10

Jednym z rozwiązań jest użycie zdarzenia onchange z .

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); 
    } 
} 

ten reaguje prawidłowo na zmiany w wybranym pliku, jak można sprawdzić tutaj: http://jsfiddle.net/munderwood/6h2r7/1/

Jedyna różnica potencjałów w zachowaniu od sposobu próbowali to zrobić, jest to, że jeśli odwołać prawo dwa razy z rzędu lub wybierz ten sam plik dwa razy z rzędu, a następnie wydarzenie się nie uruchomi. Jednak za każdym razem, gdy nazwa pliku faktycznie się zmieni, wykryjesz go poprawnie.

Nie wiem na pewno, dlaczego oryginalna próba nie działa, mimo że mój najlepszy przypuszczenie to, że jest to problem synchronizacji ze zdarzeniem onfocus wypalania asynchronicznie, a przed jego właściwości input sterowania zakończeniu aktualizacji.

UPDATE: Aby ustalić, co użytkownik wybrał za każdym razem zamknąć okno dialogowe pliku, nawet jeśli nic się nie zmieniło, kwestia rozrządu można omijała dodając krótkie opóźnienie pomiędzy odbiorem naciskiem ponownie i sprawdzając wartość wejście do pliku. Zamiast dzwonić pod numer checkOnCancel natychmiast po otrzymaniu fokusu, następująca wersja charge powoduje, że zostanie nazwana dziesiąta sekundy później.

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

Oto działająca wersja: http://jsfiddle.net/munderwood/6h2r7/2/.

+0

Celem użycia onclick jest przechwytywanie zdarzeń anulowania i przypadków, gdy ten sam plik jest wybierany dwa razy z rzędu. Czy istnieje jakieś rozwiązanie problemu z regulacją czasu? tj. aby wymusić aktualizację wartości? – SamSharma

+0

Naprawdę dobry pomysł, aby słuchać, gdy ostrość jest zwracana do ciała;) – QuarK

+1

Oh! nie działa w Chrome na Androida :( – QuarK

0

Czy coś jest nie tak? Ponieważ fileSelectedEle.value zawsze zwraca poprzednią wartość wykonania, a NIE tę wybraną przez użytkownika. Czy jest to oczekiwane zachowanie pliku wejściowego? Jak rozwiązać ten problem, aby odczytać wybrany plik?

Nie ma nic złego, to jest oczekiwane zachowanie. Jeśli użytkownik anuluje proces wyboru pliku, to tak jakby nigdy go nie rozpoczął. Tak więc poprzednia wartość pozostaje na miejscu.

+0

Otrzymuję poprzednią wartość wykonania nawet wtedy, gdy użytkownik wybierze plik zamiast anulować - http://jsfiddle.net/smV9c/2/ – SamSharma

+0

Możesz pobrać wybrane pliki, otwierając listę plików $ (': file') [0] .files –

+0

Dziwne "oczekiwane zachowanie". Używając zenity na pulpicie na Linuksie, otrzymuję również wartość zwracaną po anulowaniu okna. – domih

0

Możesz podłączyć się do zdarzenia window.focus, które zostanie uruchomione po anulowaniu okna wyboru pliku. Następnie sprawdź, czy rzeczywiście ma wybrany plik.

+0

Nie zapewnia to odpowiedzi na pytanie. Gdy masz już wystarczającą [reputację] (https://stackoverflow.com/help/whats-reputation), będziesz mógł [komentować dowolny wpis] (https://stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/17998378) –