Autor Zpráva
SuGi
Profil *
Zdravim,

potřeboval jsem mít javascript, který zjistí, kolik řádků je v textarea...potřeboval jsem to ale na znak přesně, takže na internetu jsem k tomu nic nenašel (všude to brali cca odhadem že by to mohl být správný počet, když spoučtou \n nebo vydělí počet znaků počtem cols). Tak jsem si udělal něco jako takovej parser, kterej chodí znak po znaku v celém řetězci a zjišťuje, jestli se znak nerovná \n nebo jestli se počet znaků nerovná cols, tímpádem najdu nejbližší mezeru před koncem řádku a přičtu počet řádek. Když jsem to dodělal, slavnostně jsem toto zkusil v opeře a vše krásně fungovalo, bál jsem se, že by to tolik cyklů již mohlo trochu zpomalit (přece jen projede ten cyklus několikatisíckrát), ale nic znatelného se neukázalo. Problem se objevil až když jsem stránku spustil v IE 8, ten zamrzl a přestal se se mnou bavit. Proto sem píšu, jestli někdo neví, jestli je opravdu IE tak neschopnej nebo jestli jsem ten neschopnej já a mam tam někde nějakou chybku, kterou Opera ignoruje...

var textarea = document.getElementsByTagName("textarea");
      
    for ( var i = 0; i < textarea.length; i++ )
    {
        radku=1;
        cols=0;
        
        for(var i2=0; textarea[i].value.length > i2; )
        {
          	if(textarea[i].cols>=cols)
          	{
                cols++;
            		if(textarea[i].value[i2]=='\n')
            		{
              			radku++;
              			cols=0;
            		}
              	i2++;
          	}
          	else
          	{
          	    i3=i2;
                while(textarea[i].value[i3]!=' ')
                {
                    i3--;
                }
                i2-=(i2-i3);
                cols=0;
                radku++;
            }
        }
        textarea[i].rows = radku;
    }


jedná se cca o 5 odstavců dlouhých 4-7 řádek, takže to neni nijak extra velké
Chamurappi
Profil
Reaguji na SuGiho:
nebo jestli jsem ten neschopnej já a mam tam někde nějakou chybku
Máš, snažíš se přistupovat ke znakům řetězce jako k poli. Použij řetězec.charAt(číslo).

potřeboval jsem to ale na znak přesně
To bys musel ve svém výtvoru započítat i odlišná pravidla prohlížečů pro zalamování řádků. Mezera není jediný zalamovací znak.

Mimochodem, pomocí metod split a indexOf by šel tvůj skript přepsat do rychlejší a srozumitelnější podoby. Co to bude, až to bude?
SuGi
Profil
Vřelé díky! Ušetřils mi díky tomu char.At několik hodin života, jelikož v JS hodně pokulhávám :-)

Co se týče způsobů zalamování... netušíš o nějakém webu, kde by to bylo vypsané? Netušil jsem že je to rozdélné i v prohlížečích, chtěl jsem k tomu přidat ještě , . - a myslel jsem, že bude hotovo.

A sloužit to bude v mojí maturitní práci :-) mam jistou poměrně velkou administraci, umí toho hodně, ale je to samý PHP a pro uživatele je to jedna velká prasárna, tak tomu chci dát pěknej kabátek :-)

o tom přepsání ještě zauvažuju, jelikož se mi líbí krátké funkční kódy :))
_es
Profil
SuGi:
JavaScript nie je vybavený na to, aby efektívne postupoval v nejakom texte po jednotlivých znakoch ako napríklad v C.
Jeden znak je v JS vlastne reťazec s dĺžkou jeden znak.
Naštuduj si nejaké metódy s typmi String a RegExp.
Chamurappi
Profil
Reaguji na SuGiho:
chtěl jsem k tomu přidat ještě , . - a myslel jsem, že bude hotovo
Vážně je to složitější. Pomlčky (všechny druhy) nezalamují v Mozille, trojtečka zalamuje v Opeře, otevírací závorka zalamuje v Exploreru (za) a Opeře (před)… v Exploreru také může rozhodovat delší sekvence znaků, např. „text$ ?“ se zalamuje jako jeden kus, přestože je v něm mezera. Prohlížeče se neshodují ani v přístupu k dlouhým slovům, která se sama o sobě nevejdou na řádek.

tak tomu chci dát pěknej kabátek :-)
Ptal jsem se, co to bude, protože mě zajímálo konkrétní využití této informace. Možná by se našla jiná cesta vedoucí k témuž výsledku.
SuGi
Profil
No se zmiňovaným charAt to funguje všude, aspoň na oko, to zalamování udělám jen nějak jednodušejc tedy. Dal bych konkrétní příklad kde to bude, ale jak řikam, mam to v administraci pod heslem, a nemůžu zveřejnit jen tak přístup, tak to popíši.

Mam vždy okno uprostřed webu, kde jsou vypsané různé novinky, články nebo tak (je to hned vypsané v textarea, která si spočte počet řádků, aby se neobjevoval scrollbar + nastaven parametr readonly). V textarea je to z důvodu, že dole je tlačítko "EDITOVAT", na které když uživatel klikne, tak se zruší readonly a může text libovolně upravovat. V tu chvíli se mi na atribut onclick u textarey navolí funkce, kterou jsem již spustil na začátku při načtení stránky na špočítání řádků. To znamená, že ve výsledku uživatel upravuje text, a textarea si sama volí dynamickou výšku během psaní. To co jsem sem kopíroval je tedy funkce, kterou volám při načtení webu a pak (mírně upravenou, aby to rovnou pracovalo jen s jedním textarea) při stisknutí tlačítka v textarea....
Chamurappi
Profil
Reaguji na SuGiho:
Tušil jsem, kam směřujeme. Viz Automatická velikost textarey podle délky textu.
SuGi
Profil
Díky, zajímavý řešení, zkusim to nějak nakombinovat během večera a pak to sem hodim, jak jsem uspěl/neuspěl :-)
SuGi
Profil
Tak jsem se k tomu dostal už teď. Projel jsem to a jako nejlepší řešení mi přijde to, které prezentuješ tady. Bohužel je tam zmiňovaný problem se scroll-barem a tak mě napadá, nedá se pomocí JS zjistit, kde se scrollbar nachází? jako že mam nalistováno třeba v půlce webu, tak že by to vrátilo hodnotu 50%. Že by to pracovalo podovně jako <a name ... jako taková záložka, s tím rozdílem, že bych načetl aktuální pozici scrollu, provedl script na rozšíření textarey a zase pozici scrollu vrátil. Pak tam je již problem, když editovaná řádka je poslední a měl by přidat další řádku, aby se to také šouplo o tu řádku, aby uživatel viděl, kam píše.

// asi by to šlo :-) http://www.daniweb.com/forums/thread60189.html#
// a na ten druhý problem by stačilo s každou řádkou přičíst třeba 12px - nebo podle fontu
// ale asi je to příliš zbytečné, díky vašim radám si teď s tim poradim jak nic :-) tak díky a pardon za zbytečný thread, když už to tu tak pěkně je

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