Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wartość input[type="file"] nie działa poprawnie?
deha21
post
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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">
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
viking
post
Post #3





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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)

Ten post edytował viking 24.01.2017, 13:39:03
Go to the top of the page
+Quote Post
deha21
post
Post #4





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post
deha21
post
Post #6





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


Generalnie tak, ale muszę mieć potem i tak i żeby móc pokolorować odpowiedni DIV innym kolorem.
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale majac swoj glowny obj to jaki potem problem pobrac sasiadow ktorych musisz pokolorowac?
Go to the top of the page
+Quote Post
deha21
post
Post #8





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Comandeer
post
Post #10





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


@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/
Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Od FF 50 forEach działa też bezpośrednio na NodeList (w końcu).
Go to the top of the page
+Quote Post
Comandeer
post
Post #12





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.09.2025 - 13:04