Autor Zpráva
luma64
Profil
Pozdravujem ! Mam Javascript s vnoreným cyklom. Do vnoreného, kde chcem pracovať sa kód vôbec nedostane. Pritom hodnota allinputs.length je 13. Môžete mi poradiť, kde mám chybu ? Vďaka !

<script type="text/javascript">
function validateForm()
{
    var allinputs = document.getElementsByTagName('input');
    alert("Som na zaciatku");
    for ( var i=0;i< allinputs.length;i++)
    {
        alert("V cykle - Sem sa este dostanem");
        for (var j=0;j<    allinputs[i].length;j++)
        { 
            alert("V cykle - Sem sa nedostanem");
        }
    }    
    alert ('Som na konci');
}
</script>
a
lionel messi
Profil
luma64:

Lebo v definícii vnoreného cyklu máš podmienku

j < allinputs[i].length;

a tá sa nikdy nesplní. V allinputs máš pole so všetkými inputmi, v allinputs[i] konkrétny input v rámci iterácie a ten nemá atribút length, čiže jeho hodnota je undefined.

Ak chceš pracovať s konkrétnym prvkom, myslím, že dva cykly ani nepotrebuješ, stačí použiť jeden a rovno v ňom allinputs[i]:

function validateForm()
{
    var allinputs = document.getElementsByTagName('input');
    alert("Som na zaciatku");
    for ( var i=0;i< allinputs.length;i++)
    {
        alert("V cykle - Sem sa este dostanem");
        var inputValue = allinputs[i].value; //priradenie value konkrétneho inputu do premennej
    }    
    alert ('Som na konci');
}
luma64
Profil
Dva cykly potrebujem preto, že si doň načítam údaje z formu, teda ku každému riadku (neviem kolko ich je) zodpovedá rovnaký počet stĺpcov. Teda sa potrebujem dostať ku konkrétnemu prvku riadka a stĺpca, t.j. allinputs[i][j].value. A podľa mňa, by som sa k tej hodnote mal dostať práve v tom vnorenom cykle.
Davex
Profil
V allinputs nejsou žádné řádky a sloupce, ale je tam kolekce elementů <input>.
Serg
Profil
Tak se zkus podívat co v proměnné allinputs skutečně je. A bylo by lepší si to vypsat do konzole přes console.log(allinputs) (a zjistit jak otevřít konzoli v prohlížeči - přes vývojářské nástroje). Alert by asi vypsal jen něco jako [HTMLInputElement]...

Každopádně, z document.getElementsByTagName('input'); nedostaneš 2D pole, ale jen 1D, a tam budou všechny inputy z celého dokumentu. Ta metoda ostatní elementy ignoruje, takže ani neví, že jsou inputy rozdělené do řádků a sloupců, všechny je naháže do jednoduchého pole.

Btw, kdybys potřeboval jen inputy z určité oblasti, tak by to šlo takle:
var oblast = document.getElementById('idKontejneru');
var inputy = oblast.getElementsByTagName('input');
Nebo
var inputy = document.forms.nazevFormulare.elements; // ale tady pak budou i textarea elementy
luma64
Profil
Mrzi ma to, nedokazal som to napísať podľa vašich návodov. Kód som trochu zjednodušil, pozrel som návody na webe ako to sfunkčniť, ale kód sa mi nedostane do vnoreného cyklu, aby som mohol prečítať hodnotu prvok[i,j] z poľa allinputs. Hodnotu i si vypíšem a zobrazí sa mi 0 - 4, t.j. počet i. Dokážem získať aj ich názvy, neprejdem ale do vnoreného for.

function validateForm()
{
    var allinputs = [];
    alert('Zaciatok');

    allinputs = document.getElementsByTagName('input');
    for (i=0;i<allinputs.length;i++)
    {

        alert('For1: ' + i);
        for (j=0;j<allinputs[i].length;j++)
        { 
            alert('For2');
        }
    }
}
</script>
Tomášeek
Profil
luma64:
neprejdem ale do vnoreného for.
Už ti bylo jednou řečeno, že allinputs[i].length vrátí undefined. Ta konstrukce je prostě nesmyslná.

Na 7. řádku procházíš elementy jeden po druhým, co chceš procházet tím vnořeným cyklem? Přečti si ještě jednou #4.
Radek9
Profil
luma64:
Nejlepší bude, když sem pošleš i HTML kód. Jak už bylo řečeno, document.getElementsByTagName ti vrátí jednorozměrnou kolekci. Nejspíš potřebuješ pro každý řádek vybírat jen určitou podmnožinu všech inputů.
luma64
Profil
Tu je HTML kód:
//Kvoli validovaniu hodnot v poliach sa potrebujem dostať na miesto, kde je alert(" For 2 ") - aspoň predpokladám;

<script type="text/javascript" src="scripts/jquery.js"></script>
 
<script type="text/javascript">

function validateForm()
{
    var allinputs = [];
    alert('Zaciatok');
 
    allinputs = document.getElementsByTagName('input');
    for (i=0;i<allinputs.length;i++)
    {
 
        alert('For1: ' + i);
        for (j=0;j<allinputs[i].length;j++)
        { 
            alert('For 2');
        }
    }
}
</script>

</head>

<body>


<form name="MyForm" method="post" action="" onsubmit="return validateForm()">
<table>
    <thead>
    <tr class="red">
    <th>Prichod</th><th>Odchod</th><th>Meno</th>
    </tr>
    </thead>
      
<tbody>
            
        <tr style="background-color:#f8c28e;onmouseover='this.className='yellowThing''; onmouseout='this.className='whiteThing'';  !important;" >

        <td>
        <input name="prichod[]" type="text" id="prichod" size="2" value="">
        </td>
        <td>
        <input name="odchod[]" type="text" id="odchod" size="2" value="">
        </td>
        <td>
        <input name="meno[]" type="text" id="meno" size="2" value="">
        </td>

        </tr>    
        
        <tr style="background-color:#f8c28e;onmouseover='this.className='yellowThing''; onmouseout='this.className='whiteThing'';  !important;" >

        <td>
        <input name="prichod[]" type="text" id="prichod" size="2" value="">
        </td>
        <td>
        <input name="odchod[]" type="text" id="odchod" size="2" value="">
        </td>
        <td>
        <input name="meno[]" type="text" id="meno" size="2" value="">
        </td>

        </tr>    
        
        <tr style="background-color:#a1daf9;onmouseover='this.className='yellowThing''; onmouseout='this.className='whiteThing'';  !important;" >

        <td>
        <input name="prichod[]" type="text" id="prichod" size="2" value="">
        </td>
        <td>
        <input name="odchod[]" type="text" id="odchod" size="2" value="">
        </td>
        <td>
        <input name="meno[]" type="text" id="meno" size="2" value="">
        </td>

        </tr>
    </tbody>
</table>

<input type="submit" name="Submit" value="Uloženie časových údajov">
Tomášeek
Profil
luma64:
Narozdíl od kolegy výše si nemyslím, že zveřejnění HTML něco řeší. Akorát vidíme, že v HTML (nebo těch inline CSS stylech) máš nesmysly, a to jak logické, tak syntaktické, které ale nemají nic co dělat s tím tvým problémem.

To ale nemění nic na tom, že ty vnořené cykly jsou nesmyslné, ten druhý cyklus tam nemá co dělat. Co je tvou snahou v tom vnořeném cyklu? Co jím chceš dokázat?
Davex
Profil
luma64:
Přemýšlím, jak ti pomoci, když nečteš, co všichni píšou. V jednorozměrné kolekci neexistuje druhý rozměr a tudíž vnořeným cyklem nejde číst něco, co neexistuje. V kolekci jsou všechny input elementy a stačí jí projít jednoduchým cyklem.

Také je dobré vědět, že indexovaná pole vytvoří až PHP po odeslání na server, takže nejsou přístupná JavaScriptu na stránce v prohlížeči.
Serg
Profil
Tak to bude trochu složitější se k těmto vstupům dostat.

Jen se musíš rozhodnout kterou metodu zvolit. Buď musíš psát jména těch vstupů, nebo vědět na jaké jsou pozici.
function validateForm() 
{
  var myForm = document.forms.MyForm;
  var controlElements = myForm.elements;
  var prichody = controlElements['prichod[]'];
  var odchody = controlElements['odchod[]'];
  var jmena = controlElements['meno[]'];
  
  for (var i = 0; i < prichody.length; i++) {
    var prichod = prichody[i].value;
    var odchod = odchody[i].value;
    var jmeno = jmena[i].value;
    
    // Tady uz mas konkretni inputy z daneho radku
  }
}

Způsob přístupu podle pozice se mi psát nechce, protože se mi osobně nelíbí, ale šlo by o to, psát něco jako allinputs[i * 3 + j], pak bys 2 for cykly potřeboval no. Zároveň by muselo být zajištěný, že se tam nezamíchají jiný inputy.

Alternativně k prvnímu způsobu, místo document.forms...elements, by šlo použít rovnou document.getElementsByName('prichod[]'), ušetřilo by to první 2 řádky.
Tomášeek
Profil
Serg:
Proč tak slozite? Vybranou kolekci inputu už dávno má. Nejake i*3+j nedává absolutně smysl.
Serg
Profil
Jestli k tomu chce přistupovat jako ke 2D poli, tak bych čekal, že chce asi rozlišovat řádky a sloupce, kvůli něčemu...

Možná by bylo fakt lepší se nejdřív zeptat, co má ta validační funkce dělat :D
Třeba to půjde udělat úplně jednoduše jedním for cyklem přes všechny inputy. Každý input může mít nějaký vlastní atribut, který pak té funkci předá pravidla pro validaci, např něco jako
<input type="text" name="prichod[]" data-validation="time-format">
Nebo použít atribut pattern.
<input type="text" name="prichod[]" pattern="\d{2}:\d{2}">
luma64
Profil
Serg, ďakujem, v [#12] je presne to, čo som potreboval !

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:

0