Odczyt wartości z Selecta

0

Próbuję wyłuskać indeks,treść,cokolwiek z SELECTa i nie daję rady. Dostaję undefined w funkcyjce setNumber. Ktoś poratuje? Pliczek HTML w załączniku.

 
<!DOCTYPE html>

<html>

<head>
</head>

<body>

<table name="MainFlow">
<tr>
	<th>Krok</th>
	<th>Rodzaj</th>
</tr>
<tr>
	<td><input type="text" name="txt2" value="AAA"></input></td>
	<td>
		<select name="lstBasic">
			<option value="tekst" selected="selected">tekst</option>
			<option value="petla">petla</option>
		</select>
	</td>
</tr>
<tr>
	<td><input type="text" name="gg" value="BBB"></input></td>
	<td>		
		<select name="lstBasic2">
			<option value="tekst">tekst</option>
			<option value="petla" selected="selected">petla</option>
		</select>
	</td>
</tr>
<tr>
	<td><input type="text" name="bb" value="CCC"></input></td>
	<td>		
		<select name="lstBasic3">
			<option value="tekst" selected="selected">tekst</option>
			<option value="petla">petla</option>
		</select>
	</td>
</tr>
</table>
<script type="text/javascript">

function SetNUMBER()
{
  var tbl = document.getElementsByName("MainFlow");
  var cnt = 0;
  for(var i=1; i < tbl[0].rows.length; ++i)
  {
		var edtStep = tbl[0].rows[i].cells[0].firstChild;
		var cbType = tbl[0].rows[i].cells[1].firstChild;
		
		alert(edtStep.value);
		alert(cbType.selectedIndex);
		
  }
  
}
</script>
<input type="button" id="sendButton" value="Wyslij" onclick="SetNUMBER();"/>

</body>
</html>
0

Kto Cię uczył inputy zamykać przez </input>?

Kodź dobrze, a zyskasz szacunek ...

Anyway, wystarczyło zrobić alert(cbType); żeby zobaczyć, że wybiera Ci Object Text - co wg tego co piszą w Internetach jest obiektem od inputa z type="text". I za cholerę nie wiem skąd to, ale po usunięciu jakiejkolwiek przerwy między <td>, a <select> Twój kod działałby dobrze.

Ja natomiast zmieniłem var cbType = tbl[0].rows[i].cells[1].firstChild; na var cbType = tbl[0].rows[i].cells[1].getElementsByTagName("select")[0]; i działa dobrze, a i jakoś logiczniej operuje mi się używając "selectora" niż wiersze-komórki-dzieci.

0

co to w ogóle za pomysł żeby tak się dopierać do elementów? w ogóle mogłeś zacząć od elementu "window"...
do inputów zazwyczaj się odwołuje opakowując je w formularz <form> i przez

document.forms['nazwa_formularza'].elements['nazwa_elementu']

a skoro znasz nazwę selecta to czemu nie zrobisz po prostu

document.getElementsByName('nazwaSelecta')

tylko się szwędasz po DOMie? :|

0
dzek69 napisał(a)

żeby zobaczyć, że wybiera Ci Object Text - co wg tego co piszą w Internetach jest obiektem od inputa z type="text". I za cholerę nie wiem skąd to, ale po usunięciu jakiejkolwiek przerwy między , a <select> Twój kod działałby dobrze

Wybiera pierwszy węzeł (.firstChild) w komórce tabeli, czyli w <td>. Szkopuł w tym, że węzły DOM to nie tylko elementy. To również np. węzły tekstowe. A na początku komórki, przed elementem input, jest jeszcze tekst -- trochę białych znaków (przeglądarki normalizują ciągi białych znaków -- spacji, tabulacji, znaków nowej linii -- do pojedynczej spacji). Więc pierwszym węzłem w komórce tabeli jest węzeł tekstowy z białymi znakami. Stąd ten "[Object Text]". NIE jest to element input typu text, tylko węzeł tekstowy.

Dlatego, gdy przeglądamy DOM, choćby za pomocą childNodes, musimy zawsze odfiltrowywać węzły, które nas nie interesują. Zwykle obchodzą nas tylko elementy, więc powinniśmy sprawdzać, czy dany węzeł ma .nodeType równe 1, co oznacza ELEMENT_NODE (oczywiście, najlepiej zdefiniować sobie pseudo-stałą var ELEMENT_NODE = 1).

Od razu powiem, że taka np. pseudoklasa CSS :first-child się na tym nie wykrzacza, bo ona wybiera pierwszy ELEMENT, a nie pierwszy węzeł. No ale w końcu prawie zawsze stylujemy tak naprawdę elementy. Ze skryptami jest inaczej -- skrypty operują również na tekście i muszą być w stanie pobrać tekst. Dlatego widzą wszystkie węzły, łącznie z tekstowymi. Na co dzień to ździebko niewygodne.

unikalna_nazwa napisał(a)

co to w ogóle za pomysł żeby tak się dopierać do elementów? w ogóle mogłeś zacząć od elementu "window"...
do inputów zazwyczaj się odwołuje opakowując je w formularz <form> i przez

document.forms['nazwa_formularza'].elements['nazwa_elementu']

Eee, czasami szwędanie się po drzewie DOM na różne sposoby nie jest takie złe. Nieraz chcemy wybierać elementy kontekstowo. Przecież korzystając z jQuery, piszemy czasem $this.find("> .foo > input:first-child").

Gdy pracuje się z tabelami, często używa się .rows i .cells. Nie ma w tym generalnie nic złego. Ja w ogóle uważam, że w wielu miejscach użycie kontekstu jest znacznie lepsze niż spamowanie ID-kami na siłę tylko po to, by móc użyć document.getElementById, co jest charakterystyczne dla script-kiddies.

Zauważ, że document.getElementsByName('nazwaSelecta') po pierwsze zwraca nie jeden element, a kolekcję, więc trzeba by coś z tym zrobić (choćby dodając [0] :P), a po drugie... Mogłoby wprowadzić swoje własne zależności. Może tabela czasem ma 3 wiersze, a czasem 50? Jak sprawdzać, czy się skończyła? Strzelać w inputy o name równym lstBasic, lstBasic2, lstBasic3 i tak dalej, aż zwróci nam pustą listę? Ale wtedy w tabeli nie będzie mogło być luk. A może iterować index po rows.length i na podstawie index zbudować nazwę elementu? Ale wtedy gdy dojdzie nam jakiś wiersz wprowadzający/nagłówkowy, to skrypt trzeba będzie zmodyfikować.

Nie to że tworzę problemy na siłę -- mówię tylko, że różne sposoby mają swoje plusy i minusy. Pisząc skomplikowaną aplikację musimy dokonać analizy kompromisów. Czasami wychodzi, że wybór elementów w oparciu o strukturę DOM da największe korzyści. Prawie nigdy nie jest tak, że trzeba wybrać element wyłącznie w oparciu o jego położenie, bo to dopiero bywa fatalne. Ale w niektórych przypadkach np. wybór "nagłówka poprzedzającego element X", gdzie element X wybieramy przez klasę, to dobre rozwiązanie.

Masz rację, autor się w tym wszystkim trochę nie połapał (jak widać), ale mi się podoba to, że próbuje i uczy się również nieskopoziomowych metod. Dobrze wiedzieć, co się dzieje na niższym poziomie niż wywołania jQuery.

0

Doszukujecie się spisków :P
To jest tylko testowo zmontowany HTML na potrzebę żeby wam to zobrazować a potrzebne mi to do zupełnie innego kontekstu. A że nie jestem do końca obeznany w tym temacie to mogłem popełnić kardynalne błędy.
Dzięki za wyczerpującą analizę :)

0
bswierczynski napisał(a):

Zauważ, że document.getElementsByName('nazwaSelecta') po pierwsze zwraca nie jeden element, a kolekcję, więc trzeba by coś z tym zrobić (choćby dodając [0] :P), a po drugie... Mogłoby wprowadzić swoje własne zależności. Może tabela czasem ma 3 wiersze, a czasem 50? Jak sprawdzać, czy się skończyła? Strzelać w inputy o name równym lstBasic, lstBasic2, lstBasic3 i tak dalej, aż zwróci nam pustą listę? Ale wtedy w tabeli nie będzie mogło być luk. A może iterować index po rows.length i na podstawie index zbudować nazwę elementu? Ale wtedy gdy dojdzie nam jakiś wiersz wprowadzający/nagłówkowy, to skrypt trzeba będzie zmodyfikować.

no wiadomo że zwraca kolekcję, ale z table już tak robi więc by sobie poradził
faktycznie jakoś nie przyjrzałem się dobrze kodowi i nie zauważyłem że on leci po wszystkich wierszach - wydawało mi się że statycznie opisał pozycję elementu względem table
ale i tak podtrzymuję, że nie należy tutaj używać firstChild i szukać po jego sąsiadach patrząc na .nodeType tylko jeżeli chcemy wybrać input no to robimy .getElementsByTagName('input')

1 użytkowników online, w tym zalogowanych: 0, gości: 1