Autor Zpráva
michql
Profil *
Dobrý den,

Potřebuji přečíst XML soubor (kde je něco jako menu) pomocí JS, stím že je tam neurčitý počet úrovní, nemuselo by pomoci XML mohlo by to jít klidně pomocí seznamu v HTML
Vygooglil document.querySelectorAll() tahle funkce nefunguje všude.
Str4wberry
Profil
Nedalo by se to udělat obyčejným nahrazením?
michql
Profil *
co myslíte tím obyčejným nahrazením ?

no to nemusí být XML jak jsem říkal tak struktura bude v seznamu v HTML (<ul><li></li></ul>)
nešlo by to třeba nějak pomocí childNodes.

Zatím jsem zkoušel vypsat všechny potomky
 <div id ="hlavni">
       <li>Tea</li>
       <li>Milk</li>
       <li>Coffee</li>
       <li>Tea</li>
       <li>Milk</li>
       <li>Milk</li>
      <ul>
       <li>Coffee</li>
       <li>Tea</li>
       <li>Milk</li>
       <li>Coffee</li>
       <li>Tea</li>
       <li>Milk</li>
       <li>Milk</li>
        </ul>
    <li>Milk</li>
    </div>
  
   <script type="text/javascript">
       var mylist = document.getElementById("hlavni");
   
      for (i=0; i<mylist.childNodes.length; i++)
        {
      alert(mylist.childNodes[i].nodeName);
    }
  </script> 
Stím že to funguje všude krom IE který mi nechce vypsat UL - ten jak má ještě další potomky
michql
Profil *
sorry v tom kódu je chyba
<ul id ="hlavni"> 
<li>Tea</li> 
<li>Milk</li> 
<li>Coffee</li> 
<li>Tea</li> 
<li>Milk</li> 
<li>Milk</li> 
<ul> 
<li>Coffee</li> 
<li>Tea</li> 
<li>Milk</li> 
<li>Coffee</li> 
<li>Tea</li> 
<li>Milk</li> 
<li>Milk</li> 
</ul> 
<li>Milk</li> 
</ul> 
Chamurappi
Profil
Reaguji na michqla:
to funguje všude krom IE který mi nechce vypsat UL
Protože Explorer si přerovnává kód tak, aby struktura seznamu byla správně, respektive přesadí ukončovací značku </li> za ten vnořený seznam.
michql
Profil *
Jak to lze řešit ?
Chamurappi
Profil
Reaguji na michqla:
Napiš ten HTML kód tak, aby jej braly všechny prohlížeče stejně, tzn. nestrkej <ul> přímo do <ul> a uprav patřičným způsobem svůj skript.
michql
Profil *
Asi jsem blbý, nepochopil jsem to jak jste to myslel, mám upravit HTML aby UL nebylo přímo pod UL, to tam mám dát nějaký jiný tag nebo co ?
Chamurappi
Profil
Reaguji na michqla:
to tam mám dát nějaký jiný tag nebo co ?
Do seznamu patří pouze položky seznamu. Viz <ul> na JPW.
sysel
Profil
Nechci poskytovat návod, jen si to chci přeložit pro sebe nahlas: potože tag <ul> nepřipouští rekurzi (vnořování), mám se mu radši vyhnout a použít třeba vhodně nastylovanou kombinaci <div> a <p>, protože <div>y se vnořování nepříčí, anebo si vystačit s <ul>, ale bez vnořování.

Velmi si cením každé informace o chování MSIE, protože na svých strojích ho nemám a již jsem v nedávné minulosti narazil na nebezpečnou toleranci FF i k vysloveným chybám v zápisu.
Chamurappi
Profil
Reaguji na sysla:
potože tag <ul> nepřipouští rekurzi (vnořování), mám se mu radši vyhnout
Ne, stačí ho používat tak, jak by se používat měl. Vnořené seznamy jsou možné a běžně se používají, ale měly by být uvnitř položek.

Explorer si svévolně přesouvá </li> na místo, kde by se zavřelo, kdyby nebylo uvedené vůbec, proto — pokud člověk netuší, kde to bude — je lepší </li> neuvádět.
sysel
Profil
Děkji Chamurappimu
za dolňující informaci. Někdy se mi nepodaří pochopit z manuálů podstatu popisu a pokusy a omyly pak vypadají velmi komicky. Kdysi jsem se marně pokoušel zkonstruovat sub<select>. Jo to by se moderátoři nasmáli.
michql
Profil *
Promiňte že zas otravuji ale mám další problém

Proč mi nefunguje rekurze ? resp ona funguje jenom jakoby tam byla ta samá proměnná.

  <ul id ="hlavni">
	<li>Tea</li>
	<li>Milk</li>
	<li>Coffee</li>
	<li>Tea</li>
	<li>Milk</li>
	<li>Milk</li>
        <li>
	 <ul>
	  <li>sfs</li>
	  <li>Tsdfsfea</li>
	  <li>Misdfslk</li>
	  <li>Cosdfsffee</li>
	  <li>Teasdfsd</li>
	  <li>Midfsflk</li>
	  <li>Misdfsdlk</li>
	  <li>
	    <ul>
	    <li>Cofsdfsffee</li>
	    <li>Tessa</li>
	    <li>Milk</li>
	    <li>Cossffee</li>
	    <li>Tea</li>
	    <li>Misslk</li>
	    <li>Misslek</li>
	  </ul>
          </li>
	</ul>
      </li>
	<li>
	<ul>
	<li>Coffffee</li>
	<li>Tesdfa</li>
	<li>Milk</li>
	<li>Cofsdffee</li>
	<li>Tea</li>
	<li>Misfsflk</li>
	<li>Milk</li>
	</ul>
    </li>
  <li>Milk</li>
  </ul>
  
   <script type="text/javascript">
   
    var mylist = document.getElementById("hlavni").getElementsByTagName('li');
  
    draw(mylist);
    
    function draw(node)
    {
		document.write("<div style='border: 1px solid black;'>");
		
		for (x=0; x<node.length; x++)
		{
			if(node[x].nodeName.toLowerCase() == "li")
			{
				if(node[x].getElementsByTagName('ul').length > 0)
				{
					draw(node[x]);
				}else{
					document.write("<h3>" + node[x].innerHTML + "</h3>"); 
				}
			}
		}
		document.write("</div>");
        }
     </script>

Chamurappi
Profil
Při psaní tohoto příspěvku jsem si dvakrát po sobě zavřel tento tab, protože je tu tma a Ctrl+E je hned vedle Ctrl+W. Dost mě to rozčílilo, takže… to asi napíšu celé potřetí.

Reaguji na michqla:
Uvedený skript nepoběží, protože:
1) Metoda getElementsByTagName hledá mezi všemi potomky, nikoliv jen mezi přímými, takže vrátí i všechna <li> uvnitř <ul> uvnitř <li>.
2) Všechna volání funkce draw pracují s jednou globální proměnnou x. Myslíš, že se slůvko var píše pro srandu králíkům?
3) Metodou document.write vypisuješ nekompletní kód, některé prohlížeče ho automaticky doplní, tj. neuzavřený <div> hned zavřou.
4) Tvá funkce draw zjevně očekává, že dostane na vstupu kolekci HTML elementů, přesto se jí snažíš předat na řádku 61 jako argument jeden element <li>.
michql
Profil *
Chamurappi:
1) Metoda getElementsByTagName hledá mezi všemi potomky, nikoliv jen mezi přímými, takže vrátí i všechna <li> uvnitř <ul> uvnitř <li>.
Mohl bych se zeptat jak to tedy provést? Stači mi jen mě nějak nakopnout jak získám všechny elementy a posloupně je vypíší .
Chamurappi
Profil
Reaguji na michqla:
Procházej childNodes (tj. přímé potomky). Koukám, že tam stejně testuješ nodeName — což by bylo při getElementsByTagName("li") zbytečné, ale při průjezdu všech přímých potomků to už má smysl.
michql
Profil *
Myslel jste tohle, no pořád mi to nefunguje vypíše to všechny úrovně ale nevypíše prvky podřazených úrovních.


 var mylist = document.getElementById("hlavni");
 var print = "";	
  
 draw(mylist);

function draw(nodes)
 {
		print += "<div style='border: 1px solid black;'>";

		for (var i=0; i < nodes.childNodes.length; i++)
		{
			if(nodes.childNodes[i].nodeName.toLowerCase() == "li")
			{
				if(nodes.childNodes[i].getElementsByTagName('ul').length > 0)
				{
					draw(nodes.childNodes[i]);
				}else{
					print += "<h3>" + nodes.childNodes[i].innerHTML + "</h3>"; 
				}
			}
		}
		print += "</div>";
  }
  
 document.write(print); 
Chamurappi
Profil
Reaguji na michqla:
Teď tvá funkce draw očekává, že dostane na vstupu seznam (tedy cokoliv, co má přímé potomky <li>), ale na řádku 17 jí jako argument předáváš aktuální <li>.

Pokud už rozumíš pojmům jako je „rekurze“ či „parsování“, mohl by sis nastudovat ještě „ladění“, protože tahle pohodlná metoda „nefunguje mi to, najdi mi chybu“ nebude fungovat věčně :-)
michql
Profil *
Dobrý den, tak úspěšně jsem to odladil, moc vám děkuji za to, že jste mi pomohl. Omlouvám se že jsem byl tak pasivní, ja moc JS nemusím především k kvůli ladění ale tedka jsem zjistil že chrome ma jakousi konzoli tak to bude lepší, není nad vývojové prostředí c/c++ kde si dáte breakpointy, máte krokování atd. Ještě jednou moc vám děkuji za vaší trpělivost.

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