[JS] Tablica i pętla i nagle kod się wysypuje.. dlaczego?

0

Mam sobie taki kod, który generalnie służy do ukrywania kolumn w tabeli.
Ten alert w kodzie jest w celu debugowania.
Kod ten wysypuje się wyświetlając '33 55'.
Czyli length tabeli ma 55, a na 34 iteracji się wysypuje.

function blah(id){
	var lt = document.getElementById(id);
	var tds =new Array("d_prognoza","s_prognoza","p_prognoza","z_prognoza","f_prognoza", "d_marza2","s_marza2","p_marza2","z_marza2","f_marza2", 
"d_koszyk","s_koszyk","p_koszyk","z_koszyk","f_koszyk", "d_trans","s_trans","p_trans","z_trans","f_trans", "d_mag","s_mag","p_mag","z_mag","f_mag", 
"d_zadluzenie","s_zadluzenie","p_zadluzenie","z_zadluzenie","f_zadluzenie","d_mpk","s_mpk","p_mpk","z_mpk","f_mpk","d_rot","s_rot","p_rot","z_rot","f_rot","d_wm2",
"s_wm2","p_wm2","z_wm2","f_wm2","d_wkg","s_wkg","p_wkg","z_wkg","f_wkg","d_wos","s_wos","p_wos","z_wos","f_wos");
	for (i=0; i<tds.length; i++)
	{	
		cols = document.getElementsByName(tds[i]);
		for(c=0; c<cols.length; c++)
		{		
			var elem = cols[i].parentNode.parentNode.parentNode.parentNode;				
			if (elem == lt)
			{						
			if (cols[c].style.display === \'\')
				cols[c].style.display = \'none\';
			else if (cols[c].style.display === \'none\')
				cols[c].style.display = \'\';
			}			
		}
	alert(i + \' \' + tds.length);		
	}
}

Pytanie teraz dlaczego?

Wywaliłem zatem trochę danych z tablicy tds, tak, ze length wynosi 28, a tablica wygląda tak:

var tds =new Array("p_zadluzenie","z_zadluzenie","f_zadluzenie","d_mpk","s_mpk","p_mpk","z_mpk","f_mpk","d_rot","s_rot","p_rot","z_rot","f_rot","d_wm2","s_wm2","p_wm2",
"z_wm2","f_wm2","d_wkg","s_wkg","p_wkg","z_wkg","f_wkg","d_wos","s_wos","p_wos","z_wos","f_wos");

Teraz kod przechodzi przez te 28 rekordów bezproblemowo.
Totalnie tego nie rozumiem.

Aha i dodam, ze tych parentNodów mam dlatego aż tyle, bo moja tabela wygląda tak:
<div id = 'id_tabeli'><table><tbody><tr><td name = 'f_mpk'>....</div>

Natomiast sam kod

	var elem = cols[i].parentNode.parentNode.parentNode.parentNode;				
			if (elem == lt)

ma za zadanie rozróżnienie czy dany element o danym name należy do tabeli o danym id.
Bo mam wiele takich tabel o różnym id, lecz z elementami o takim samym name.

0

Przygotuj gotowy dokument, który zawiera ten błąd. Ot, minimalny HTML wraz z tym skryptem, żebym mógł se zapisać, odpalić i zobaczyć jak się wysypuje. Postaram się wtedy zerknąć czemu tak się dzieje. (Możesz tak w ogóle robić ma przyszłość, bo jest większa szansa że ktoś znajdzie czas by zerknąć w Twój kod)

0

Dzięki za radę na przyszłość, faktycznie, przecież nie zawsze gołym okiem widać, a żmudna analiza linijka po linijce to czasochłonna praca.
Właśnie rozkładając ten kod na linijki, wstawiając alerty znalazłem jeb*** błąd, przez który straciłem ponad godzine.
Błąd
var elem = cols[i].parentNode.parentNode.parentNode.parentNode;

Powinno być
var elem = cols[c].parentNode.parentNode.parentNode.parentNode;

Przecież kur*** to c jest iteratorem dla colsów !!!, a nie i...
Dzięki i tak za odpowiedź i pomoc.

0

Ha, no widzisz. Z tym "szanowaniem czasu pomocników" to chodzi o to, że ja tutaj nieraz pomogę i kilku osobom w ciągu dnia, a sam też mam (wbrew pozorom :P) swoje projekty. Dlatego o ile ja mogę ślęczeć -- tak samo jak Ty -- nad błędem w swoim kodzie i pół godziny, o tyle nie mam tyle wolnego czasu dla innych.

Btw. taki mały hint...

Poniższe formy są równoważne:

var tab1 = new Array('raz', 'dwa', 'trzy');
var tab2 = ['raz', 'dwa', 'trzy'];

Ta druga forma to tzw. literał tablicowy (ta pierwsza to po prostu konstruktor Array). Druga forma jest zwięźlejsza, a nawet czytelniejsza, więc polecam używać właśnie jej.

0

Natomiast sam kod
var elem = cols[i].parentNode.parentNode.parentNode.parentNode;
if (elem == lt)

ma za zadanie rozróżnienie czy dany element o danym name należy do tabeli o danym id.
Bo mam wiele takich tabel o różnym id, lecz z elementami o takim samym name.

..a wyżej napisałeś:

var lt = document.getElementById(id);

Więc chyba to parentNode.parentNode.parentNode... niepotrzebne..

0

Bez tego parentNode to było by porównanie obiektu DOM-u diva i td-ka, tak?

EDIT:
Dzięki bswierczynski za hinta ;P

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