2012-12-06 10 views
9

Mam prostą aplikację internetową, która wykorzystuje api filereadera w HTML5, aby akceptować przesyłanie plików przez przeciąganie i upuszczanie.Wygląda na to, że IE10 nie podoba się zdarzeniu upuszczającemu plik

Po przeciągnięciu pliku na stronę, odpowiednie zdarzenie przeciągania zostanie uruchomione, ale kiedy upuszczę plik IE po prostu go otworzy, zamiast pozwolić JS go obsłużyć.

Kod spadek jest bardzo prosty:

this.addEventListener("drop", function(event) { 
event.stopPropagation(); 
event.preventDefault(); 
Self.drop(event); //this event is not hit. IE just opens the file! 
}, false); 

Jest to specyficzny ograniczenie IE10 lub mogę robić coś złego?

Dzięki

Odpowiedz

23

będzie chciał też słuchać wydarzeń dragenter i dragover i zapobiec ich domyślne zachowanie. Będziesz także chciał zapobiec domyślnemu zachowaniu w obsłudze zdarzenia drop.

Na przykład może chcesz zrobić coś takiego ...

var $dropArea = $("#drop-area"); 

$dropArea.on({ 
    "drop" : makeDrop, 
    "dragenter": ignoreDrag, 
    "dragover": ignoreDrag 
}); 

function ignoreDrag(e) { 
    e.preventDefault(); 
} 

function makeDrop(e) { 
    var fileList = e.originalEvent.dataTransfer.files, 
     fileReader; 

    e.preventDefault(); 
    if (fileList && fileList.length > 0) { 
     fileReader = new FileReader(); 
     fileReader.onloadend = handleReaderOnLoadEnd($("<img />")); 
     fileReader.readAsDataURL(fileList[ 0 ]); 
    } 
} 

function handleReaderOnLoadEnd($image) { 
    return function(event) { 
     $image.attr("src", this.result) 
      .addClass("small") 
      .appendTo("#drop-area"); 
    }; 
} 

Można znaleźć pracy przykład w tym JSFiddle http://jsfiddle.net/qsyNW/

Uwaga: Nie musisz korzystać z tego jQuery Jak ja zrobiłem. Jeśli jednak użyjesz jQuery, musisz odwołać się do e.originalEvent wewnątrz programu obsługi zdarzeń drop, aby uzyskać numer dataTransfer.files.

+11

Znalazłem to w chromie, mogłem użyć przeciągania i upuszczania delikatnej obsługi tylko "dragover" i "drop", ale w IE10 musiałem obsługiwać "dragenter" i zapobiegać domyślnie, w przeciwnym razie moje zdarzenie "dragover" nigdy nie padło ... – markt

+3

Dodatkowo: Jeśli nie widzisz właściwości 'files' podczas próby własnego kodu, ale działa ona z Eliaszem, prawdopodobnie uruchamiasz test na swoim ** lokalnym ** (intranetowym) serwerze internetowym. Domyślną wartością domyślną IE10 jest obsługa treści intranetowych w widoku (w) zgodności, który wyłącza takie funkcje, jak właściwość 'files' w obiekcie' dataTransfer'. W menu klucza przejdź do "Ustawienia widoku zgodności" i usuń zaznaczenie pola "Wyświetlanie witryn intranetowych w widoku zgodności". Eejits. –

+1

Jeśli nie kontrolujesz konfiguracji IE, możesz to zrobić w kodzie HTML lub w niestandardowych nagłówkach HTTP. W HTML możesz umieścić to na ** bardzo top ** 'head':' '(Podobno niektóre wersje będą ignorować Jeśli nie chodzi o coś innego niż "tytuł" Oczywiście, że tak będzie, ponieważ to nie jest w ogóle załamane, co dalej działa dla mnie w IE11, nie ma podręcznego pola testowego IE10, ale umieściłbym go na szczycie dla bezpieczeństwo.) Lub, oczywiście, skonfiguruj swój serwer tak, aby wysyłał ten nagłówek w HTTP. –

Powiązane problemy