Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z document.getElementById w pętli for
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Jarod
Mam takie pola formualrza:
  1. <input type="text" name="nazwa1" id="nazwa1" />
  2. <input type="text" name="nazwa2" id="nazwa2" />
  3. <input type="text" name="nazwa3" id="nazwa3" />
  4. <input type="text" name="nazwa4" id="nazwa4" />

Wpisuję do nich kolejno cyfry: 1,2,3,4 i wysyłam formularz. Mam zdarzenie onSubmit, które wywołuje funkcję JS.

Kod
function formValidator()
{
    var aId = new Array("nazwa1", "nazwa2", "nazwa3", "nazwa4");
    
    // Ten fragment zadziała prawidłowo i wyświetli cyfry: 1,2,3,4
    a = document.getElementById('nazwa1');
    b = document.getElementById('nazwa2');
    c = document.getElementById('nazwa3');
    d = document.getElementById('nazwa4');
    document.write(a.value + " " + b.value + " " + c.value + " " + d.value);

    //Ten fragment wyświetla tylko cyfrę 1 i się zatrzymuje (tak jakby zawieszał)
    for (var klucz in aId )
    {
        var temp = document.getElementById(aId[klucz]);
        document.write(temp.value + "<br>");
    }
    
    return false;
}


Nie jestem pewny dlaczego pętla nie działa prawidłowo ale chyba problem leży w tym, że najpierw pobieram zawartość i zaraz wpisuję w dokument.
Jeśli najpierw pobiorę zawartość każdego inputa a następnie wrzucę w tablicę i osobną pętlą ją wylistuję to jest ok.
Ale to moje przypuszczenia więc proszę wyjaśnienie tego przypadku.

pzdr.
ziqzaq
Błąd jest chyba związany z instrukcją document.write(), z alert() działa jak ta lala.
  1. <title>Quiz</title>
  2. <link rel="stylesheet" href="style.css" type="text/css"/>
  3. <script type="text/javascript">
  4. function formValidator()
  5. {
  6. var aId = new Array("n1", "n2", "n3", "n4");
  7.  
  8. // Ten fragment zadziała prawidłowo i wyświetli cyfry: 1,2,3,4
  9. a = document.getElementById('n1');
  10. b = document.getElementById('n2');
  11. c = document.getElementById('n3');
  12. d = document.getElementById('n4');
  13. //document.write(a.value + " " + b.value + " " + c.value + " " + d.value);
  14.  
  15. //Ten fragment wyświetla tylko cyfrę 1 i się zatrzymuje (tak jakby zawieszał)
  16. for (var klucz in aId)
  17. {
  18. var temp = document.getElementById(aId[klucz]);
  19. alert(klucz+" "+temp.value);
  20. //document.writeln(temp.value + "<br>");
  21. }
  22.  
  23. return false;
  24. }
  25. </head>
  26. <input type="text" name="n1" id="n1" value="val1" />
  27. <input type="text" name="n2" id="n2" value="val2" />
  28. <input type="text" name="n3" id="n3" value="val3" />
  29. <input type="text" name="n4" id="n4" value="val4" />
  30. <input type="submit" value="Klik!" onclick="return formValidator();"
  31. </form>
  32. </body>
  33. </html>


Edit:
Na szybkiego z tej stronki "The document.write command must be carried out during the loading of the page."
Jarod
Cytat(ziqzaq @ 16.12.2008, 22:15:24 ) *
Błąd jest chyba związany z instrukcją document.write(), z alert() działa jak ta lala.

Nie jestem pewny dlaczego pętla nie działa prawidłowo ale chyba problem leży w tym, że najpierw pobieram zawartość i zaraz wpisuję w dokument.
Jeśli najpierw pobiorę zawartość każdego inputa a następnie wrzucę w tablicę i osobną pętlą ją wylistuję to jest ok.
ziqzaq
A więc jeszcze raz z tej samej stronki.
"The document.write command must be carried out during the loading of the page. So, if it is attached to any event that executes after the page has loaded, then the whole page will be replaced with the contents of the document.write command."
Chyba przez to. Pętla działa prawidłowo IMHO. winksmiley.jpg
Jarod
Cytat(ziqzaq @ 16.12.2008, 22:26:06 ) *
A więc jeszcze raz z tej samej stronki.
"The document.write command must be carried out during the loading of the page. So, if it is attached to any event that executes after the page has loaded, then the whole page will be replaced with the contents of the document.write command."
Chyba przez to. Pętla działa prawidłowo IMHO. winksmiley.jpg


Nie zauważyłem, że edytowałeś. A jest inny sposób wypisania na stronie bez skutków ubocznych?winksmiley.jpg

pzdr.
ziqzaq
Z tego co wiem - a wiem niewiele winksmiley.jpg - to:
  1. <script type="text/javascript">
  2. // Masz np. jakiegoś diva z id=moj_divek
  3. d = document.getElementById('moj_divek');
  4.  
  5. // Dodajemy zawatosc do diva
  6. // Z czego trzeba zauwazyc ze innerHTML odpada na stronkach xml/xhtml
  7. d.innerHTML('Tutaj idzie zawartosc diva');


Ewentualnie jeśli interesują cie większe możliwości parsowania html i edycji to polecam jakiś framework do tego np. jQuery

Edit: literówka
Jarod
Cytat(ziqzaq @ 16.12.2008, 22:35:35 ) *
Z tego co wiem - a wiem niewiele winksmiley.jpg - to:
  1. // Z czego trzeba zauwazyc ze innerHTML odpada na stronkach xml/xhtml


Ewentualnie jeśli interesują cie większe możliwości parsowania html i edycji to polecam jakiś framework do tego np. jQuery


Interesuje mnie rozwiązanie działające na stronach xhtml.
Nie chcę frameworka bo nie ma sensu a armatą na muchy.
ziqzaq
Jeśli serwujesz stronę xhtml jako text/html (zupa tagów) to nie ma przeszkody.
Problem wystąpi jeśli będziesz ją serwował jako application/xml lub application/xhtml+xml. Jeśli się dobrze orientuję to nie można zmieniać sparsowanego dokumentu xml bo mogłaby wystąpić sytuacja gdy dokument nie waliduje się (np. jakiś niezamknięty znacznik). Dlatego metoda "innerHTML" została wyłączona w dokumentach serwowanych z takimi nagłówkami.
Innych metod nie znam, ale jeśli są to chętnie poznam winksmiley.jpg

Edit:
Hmm wcześniej się tym nie interesowałem, ale widzę, że są alternatywy np.
innerHTML: the ultimate alternative solution, innerHTML alternatives.
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.