Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wartość input[type="file"] nie działa poprawnie?
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
deha21
Mam problem ze zdarzeniem i odczytywaniem danych z input[type="file"]. Chcę zrobić tak że po wybraniu pliku, div .upload-button zmienia kolor. Mam taki kod:
Kod
var count = document.getElementsByClassName("upload").length;
var i=0;

for (i; i<count; i++) {
    document.getElementsByClassName("upload")[i].addEventListener("change", check_upload(i));
}

function check_upload(i) {
    if (document.getElementsByClassName("upload")[i].value!='') {
        document.getElementsByClassName("upload-button")[i].style.background="green";
        console.log("You have selected file to upload");
    } else {
        document.getElementsByClassName("upload-button")[i].style.background="red";
        console.log("No file choosen");
    }
}

Kod
<div class="upload-button"></div>
<input type="file" name="file" class="upload">
nospor
check_upload(i) - to powoduje natychmiastowe wykonanie funkcji check_upload a nie przypisanie jej jako callback
Jak koniecznie chcesz przekazywac to "i" to powinno byc tak:

document.getElementsByClassName("upload")[i].addEventListener("change", function() {
check_upload(i);
});

Choc i to nie jestem pewien czy to i pojdzie poprawnie. No i generalnie poczytaj o callbackach
viking
Lepiej by było:
Cytat
NodeList.prototype.addEventListener = function (eventName, callback, useCapture)
{
for (let i = 0; i < this.length; i++)
{
this[i].addEventListener(eventName, callback, useCapture);
}
};


i później do grupy elementów (NodeList) normalnie przypinać. Mogliby swoją drogą ujednolicić co poszczególne funkcje zwracają (querySelectorAll)
deha21
Pomogło (prawie) wrzucenie check_upload(i) do funkcji EventListenera, ale nadal nie działa poprawnie. Konkretnie, przeglądarka pluje się że nie może odczytać VALUE z danego inputa. A to dlatego, że zmienna i wypluwa liczbę swoich iteracji a nie właściwą. Zawsze jest z tym problem w petli for...
nospor
No bo ty w ogole tego i nie potrzebujesz...
Przeciez masz tam this ktore jest twoim elementem wiec:

Kod
for (i; i<count; i++) {
    document.getElementsByClassName("upload")[i].addEventListener("change", function() {check_upload(this)});
}

function check_upload(obj) {
//i potem nie
//document.getElementsByClassName("upload")[i]
//a
//obj
//itd
deha21
Generalnie tak, ale muszę mieć potem i tak i żeby móc pokolorować odpowiedni DIV innym kolorem.
nospor
No ale majac swoj glowny obj to jaki potem problem pobrac sasiadow ktorych musisz pokolorowac?
deha21
Cytat(nospor @ 24.01.2017, 14:54:25 ) *
No ale majac swoj glowny obj to jaki potem problem pobrac sasiadow ktorych musisz pokolorowac?

Wydaje mi się, że optymalniej było by pobrać numer i - mniej kodu i w przypadku rozbudowy skryptu stwarza większe możliwości.
nospor
No wlasnie operacje na i nie stwarza wiecej mozliwosci.

Twoj kod html dla danego input powinien wygladac tak:

  1. <div class="input-container">
  2. <input twoj input >
  3. <div class="jakas-klasa-dla-jednego-div"></div>
  4. <div class="jakas-klasa-dla-drugiego-div"></div>
  5. </div>


Wowczas majac obj twojego inputa, dobierasz sie do rodzica, czuli do .input-container i potem w nim sobie szukasz div o klasach jakie chcesz. To dopiero daje mozliwosci rozwoju smile.gif

Bawienie sie w jakies "i" predzej czy poznij przysporzy ci klopotow. A wiem bo sam tak zaczynalem wlasnie w zabawy w durne "i". Teraz jade poprostu na kontenerach i klasach i nie ma zadnych problemow. Masz obiekt bazowy i tylko na tej podstawie jestes w stanie dobrac sie do wszystkich innych elementow majacych cos wspolnego z tym obiektem
Comandeer
@viking istnieje złota zasada, żeby nie tykać prototypów obiektów hosta – zwłaszcza, że jak sam zauważyłeś, musiałbyś zmienić kilka klas kolekcji. A przecież wystarczy
Kod
[].forEach.call( nodeList, function( elem ) { /*itd*/ } );


Co do problemu: a czemu nie po prostu przypiąć jeden handler dla całego kontenera i sprawdzać, które pole zostało zmienione przez event.target? https://jsfiddle.net/Comandeer/vuveay15/
viking
Od FF 50 forEach działa też bezpośrednio na NodeList (w końcu).
Comandeer
W idealnym świecie NodeList byloby subklasą Array, która zwracałaby niemutowalne tablice (Object.freeze w konstruktorze choćby). No ale nie żyjemy w takim sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.