![]() |
![]() |
![]()
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"> |
|
|
![]() |
![]()
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 |
|
|
![]()
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 |
|
|
![]()
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...
|
|
|
![]()
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]:
|
|
|
![]()
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.
|
|
|
![]()
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?
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 544 Pomógł: 5 Dołączył: 18.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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: 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 |
|
|
![]()
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/ |
|
|
![]()
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).
|
|
|
![]()
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)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.09.2025 - 13:04 |