Seskupení nadpisu a k němu patřícího obsahu do JSON – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Seskupení nadpisu a k němu patřícího obsahu do JSON – JavaScript, AJAX, jQuery – Fórum – Programujte.comSeskupení nadpisu a k němu patřícího obsahu do JSON – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Froggy0
Newbie
27. 10. 2011   #1
-
0
-

Vcelku zapeklitý problém. Představte si následující strukturu dokumentu: 

<h2>Hlavní nadpis</h2>
<p>Text patřící k hlavnímu nadpisu</p>

<h3>Podnadpis1</h3>
<p>Text patřící k podnadpisu</p>

<h4>Menší podnadpis</h4>
<p>Text patřící k menšímu nadpisu</p>

Potřebuji z této struktury získat následující objekt:

{
  "jmeno":"hlavni nadpis",
  "text":"Text patřící k hlavnímu nadpisu",
  "data": [{
            "jmeno":"podnadpis",
            "text":"Text patřící k podnadpisu",
            "data": [{
                       "jmeno":"menší podnadpis",
                       "text":"Text patřící k podnadpisu"
                    }]
          }]
}

Jde o to, že struktura nebude vždycky vypadat takhle jednoduše. Bude tam hodně H3, hodně H4 a obsah bude tvořit více paragrafů. Nemůžu přijít na selektor, kterým docílit následujícího "roztřídění". Data potřebuji ve formátu JSON a přesně v této podobě. O automatickou serializaci se mi stará jQuery na straně serveru. Velmi bych uvítal jakoukoliv pomoc

Nahlásit jako SPAM
IP: 85.70.239.–
Froggy0
Newbie
27. 10. 2011   #2
-
0
-

Začnu si pomalu odpovídat sám. Klíčem bude pravděpodobně metoda .nextUntil(), která vybere všechny elementy dokud nenarazí na specifikovaný element. S tán by se nějak dalo pracovat. Ještě upřesňuju, že mi nedělá problém vytvořit objekt, ale nějakým způsobem seskupit nadpisy a texty k sobě. Každý H2 bude samostatný objekt, který bude obsahovat vše co je uvnitř.

Nahlásit jako SPAM
IP: 85.70.239.–
Tchibo0
Návštěvník
29. 10. 2011   #3
-
+1
-
Zajímavé

#2 Froggy

Docela by me zajimalo vyuziti.

Netestoval sem to dukladne mouchy si vychytej.

$(document).ready(function() {
	var level=base=2; // od H2
	var opens = new Array(0,false,false,false,false,false);
	var JSONstring ="[{";
	$(":header, p").each(function(index) {
		 if($(this)[0].tagName.toLowerCase()=='p')
			JSONstring += '"text":"'+$(this).text()+'"';
		else{
			lvl=$(this)[0].tagName.toLowerCase().substring(1,2);
			if(level==lvl){
				if(opens[lvl])
					JSONstring += "},{";
			}			
			else if(level>lvl){
				for(close=lvl;close<level;close++){
					JSONstring += "}]";opens[close] = false;
				}
				JSONstring += "},{";
			}
			else if(level<lvl){
				JSONstring += ',';
				for(open=level;open<lvl;open++)
					JSONstring += '"data" : [{';
			}
			opens[lvl] = true;
			level=lvl;
			JSONstring += '"nazev":"'+$(this).text()+'",';
		}
	});
	for(close=level;close>=base;close--)
						JSONstring += "}]";
		document.write(JSONstring);		
});
Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
Froggy0
Newbie
29. 10. 2011   #4
-
0
-

#3 Tchibo

Za tohle bych Ti postavil sochu, nemůžu slovy vyjádřit jak moc mi to pomohlo.

Hlavním (ale ne jediným) využitím je vyhledávání v reálném čase, jak můžeš vidět tady -  http://docs.nodejs.cz/doc

V podstatě jde o filtrování pole.

Problém je, že... tenhle script je omezený jenom na jeden element 'p'. Těch elementů pod jedním nadpisem je hodně a ne vždycky jsou to 'p', ale i 'pre', 'code' atd. Jednoduše potřebuju vybrat úplně všechno. Pokud se tam vyskytují další tagy tak jsou JSON data neplatná, protože "text" se tam objevuje vícekrát.

Pokud bys byl schopný pomoct s dokončením, byl bych ti hluboce zavázán a nabídl bych ti i určitou odměnu. 

Nahlásit jako SPAM
IP: 85.70.239.–
Tchibo0
Návštěvník
29. 10. 2011   #5
-
0
-

#4 Froggy


$(document).ready(function() {
$(":header").each(function(index) {
   $(this).insertBefore($(this).closest("section"));
});
var level=base=2; // od H2
var opens = new Array(0,false,false,false,false,false);
var JSONstring ="[{";
$(":header, section").each(function(index) {
 
   if($(this)[0].tagName.toLowerCase()=='section')
   JSONstring += '"text":"'+$(this).text()+'"';
  else{
   lvl=$(this)[0].tagName.toLowerCase().substring(1,2);
   if(level==lvl){
    if(opens[lvl])
     JSONstring += "},{";
   }  
   else if(level>lvl){
    for(close=lvl;close<level;close++){
     JSONstring += "}]";opens[close] = false;
    }
    JSONstring += "},{";
   }
   else if(level<lvl){
    JSONstring += ',';
    for(open=level;open<lvl;open++)
     JSONstring += '"data" : [{';
   }
   opens[lvl] = true;
   level=lvl;
   JSONstring += '"nazev":"'+$(this).text()+'",';
  }
});
for(close=level;close>=base;close--)
      JSONstring += "}]";
  document.write(JSONstring); 
});
Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
Froggy0
Newbie
29. 10. 2011   #6
-
0
-

#5 Tchibo
Tohle byla totálně moje chyba - pro onu dokumentaci, kde jsou elementy patřící pod nadpis uvnitř elementu <section> to funguje perfektně. Pokud tam ale chybí jakýkoliv další markup, už ne. Reálný příklad stránky, která to bude využívat (i přesto, že jsem to nechtěl zveřejňovat) můžete vidět na http://nodejs.cz/…l-in-one.ejs

Vím, že už to začíná být nudné, proto bych se s Vámi dále rád domluvil na odměně za vyřešení problému. Děkuji mnohokrát.

Nahlásit jako SPAM
IP: 85.70.239.–
Řešení
Tchibo0
Návštěvník
29. 10. 2011   #7
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#6 Froggy
Tak teda snad do tretice 

$(document).ready(function() {
	
	var level=base=2; // od H2
	var opens = new Array(0,false,false,false,false,false);
	var JSONstring ="[{";
	var JSONtemp="";
	$(":header, p,pre,ol").each(function(index) { 
		
		 if($(this)[0].tagName.toLowerCase().substring(0,1)!='h')
			JSONtemp += $(this).text();
		else{
			if(JSONtemp!="")
			JSONstring += '"text":"'+ JSONtemp+'"';
			JSONtemp="";
			lvl=$(this)[0].tagName.toLowerCase().substring(1,2);
			if(level==lvl){
				if(opens[lvl])
					JSONstring += "},{";
			}			
			else if(level>lvl){
				for(close=lvl;close<level;close++){
					JSONstring += "}]";opens[close] = false;
				}
				JSONstring += "},{";
			}
			else if(level<lvl){
				JSONstring += ',';
				for(open=level;open<lvl;open++)
					JSONstring += '"data" : [{';
			}
			opens[lvl] = true;
			level=lvl;
			JSONstring += '"nazev":"'+$(this).text()+'",';
		}
	});
	for(close=level;close>=base;close--)
						JSONstring += "}]";
		document.write(JSONstring);		
});
Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý