Autor Zpráva
xROAL
Profil
O čo mi ide: chcem vytvoriť jednoduchú webovú aplikáciu, ktorá bude čítať textové súbory. Najlepšie by bolo, keby sa dali súbory otvoriť jednoducho ich potiahnutím do určeného divu.

Toto je kód, ktorý by mal odchytiť drop udalosť:
dropHere.addEventListener('drop', function(e) {
  e.preventDefault();
  var data = e.dataTransfer.getData('text');
  console.log(data);
});

Čo som tak pozeral na nete, nič viac by nemalo byť potrebné (akurát tak ešte zrušiť nejaké iné drag udalosti, ale to mám).

Problém je, do konzoly sa vypíše prázdny string. Našiel som sa nete rôzne problémy s tým, že getData() vracalo null alebo undefined, ale nenarazil som na problém, kde by to vrátilo prázdny reťazec.

Keď do konzoly vypíšem e.dataTransfer.files[0], tak tam po správnosti je File objekt, ktorý má nastavený správny názov, dátum poslednej úpravy, veľkosť súboru a aj správny typ súboru.

Problém sa prejavoval na Windows 7 s Chrome. Na inom zariadení som to netestoval. Môže byť problém v tom? Alebo máte iné nápady?
_es
Profil
xROAL:
Našiel som sa nete rôzne problémy s tým, že getData() vracalo null alebo undefined, ale nenarazil som na problém, kde by to vrátilo prázdny reťazec.
A nie je to vlastne jedno? Je prirodzené, že prístup k dátam z lokálneho disku v JS má rôzne obmedzenia. Možno to treba nejako špeciálne v prehliadači povoliť, možno pre konkrétnu adresu. Alebo, nie je súbor priveľký - možno vtedy prehliadač odmietne hentak načítať jeho obsah.

Najlepšie by bolo, keby sa dali súbory otvoriť jednoducho ich potiahnutím do určeného divu.
Nie je to nepraktické? To sa potom prehliadač ani nebude dať použiť maximalizovaný. Či ak sa pri tom „potiahnutí“ súbor „pustí“ niekde inde ako v prehliadači - tu bude radosť pracovať s takou aplikáciou.
xROAL
Profil
_es:
A nie je to vlastne jedno?
NULL alebo undefined podľa mňa značí chybu v samotnom celkovom procese/súbor nemá žiadny obsah. Ak ale prehliadač rozozná, že ide o súbor "test.txt", ktorý bol naposledy upravený 22.8.2015 o 18:13, je to "text/plain" a jeho veľkosť je 96B, no pri tom ako jeho obsah vráti len prázdny reťazec, tak ten celkový proces asi až tak úplne nezlyhal.

Je prirodzené, že prístup k dátam z lokálneho disku v JS má rôzne obmedzenia.
Áno, jedno obmedzenie ktoré napríklad existuje je, že prehliadač umožní prístup k dátam a súboru len v handleri drop udalosti. Mimo tejto funkcie ti dataTransfer.getData() vráti undefined (väčšinou sa ľudia pýtali na toto, aspoň čo som ja našiel).
Všeobecne platí, že takéto veci sa môžu vykonávať len v handleroch určitých udalostí (drop, click, submit, a pod., resp. udalosti spustené priamo návštevníkom stránky).

Možno to treba nejako špeciálne v prehliadači povoliť, možno pre konkrétnu adresu.
Existuje viacero webov/služieb ktoré umožňujú nahrávať súbory ich potiahnutím a pustením. Nikdy na to nepýtali žiadne povolenie.

Nie je to nepraktické? To sa potom prehliadač ani nebude dať použiť maximalizovaný. Či ak sa pri tom ‚potiahnutí‘ súbor ‚pustí‘ niekde inde ako v prehliadači - tu bude radosť pracovať s takou aplikáciou.
Drag & drop vyzeral jednoduchý na implementáciu a mne osobne sa často stane, že sa preklikám na zdielanom disku do 15 podpriečinku, kde sa zrazu nachádza súbor, ktorý by som chcel v tejto aplikácii otvoriť. Príde mi pohodlnejšie v takomto prípade mať možnosť drag & drop, ako byť nútený sa znovu do toho priečinku preklikávať, či kopírovať cestu k súboru - toto sa pokojne môže stať aj niekomu inému. Podpora drag & drop samozrejme nevylučuje iné možnosti otvárania súborov - ani iné možnosti vynechať nechcem.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: