Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Oprava třídy/funkce v JS

Ahoj, jak můžu napsat tuto třídu lépe a funkčně ? Ono to nějak funguje ale jen pokud to zavolám jednou, když to zavolám vícekrát tak se ten text celý kříži. Hotové řešení jsem nenašel a tohle jsem skládal 3 hodiny :-( Díky za pomoc.

function classM(text)
{
    this.elem = document.getElementById('div');	
    this.len = text.length;
    this.character = 0;
    this.text = text;
        
    function Writer() { 
        this.character++;
        var type = this.text.substring(0, character);
        this.elem.innerHTML = type;
        if (this.character !== len) {
            setTimeout(Writer, 20);
        }
    };
    
    Writer();
}

classM('cokoliv cokoliv cokoliv cokoliv');
classM('neco jineho neco jineho neco jineho neco jineho');
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Tak ještě aby se to nekřížilo, když obojí zapisuješ do stejného elementu.
Wikan 03.12.2015 07:50
Wikan
Já ale potřebuji zapisovat do stejného elementu. Jenže nevím jak to ošetřit když přijde víc požadavk…
Honza Marek 03.12.2015 10:09
Honza Marek
Vypsat všechny jakým způsobem?
Wikan 03.12.2015 10:11
Wikan
Jak to myslíš, jakým způsobem ? Potřebuji vypsat všechny texty, budou jich stovky..
Honza Marek 03.12.2015 10:24
Honza Marek
A musí být v tom samém divu? Nestačilo by kdyby každý byl ve vlastním, který by byl uvnitř toho hlav…
Wikan 03.12.2015 10:31
Wikan
To by asi určitě stačilo..
Honza Marek 03.12.2015 10:36
Honza Marek
function classM(text) { var elem = document.createElement('div'); document.getElementById('div').app…
Wikan 03.12.2015 10:42
Wikan
Tohle funguje, ale vypisuje se to zároveň (pokud jde současně > 1 požadavek), což je velmi nepřehled…
Honza Marek 03.12.2015 11:04
Honza Marek
No proto jsem se ptal, jakým způsobem to chceš vypisovat. Pokud se nebudeš vyjadřovat přesně, tak ne…
Wikan 03.12.2015 11:08
Wikan
jj, moje chyba, omlouvám se...
Honza Marek 03.12.2015 11:11
Honza Marek
var queue = []; function classM(text) { queue.push(text); if (queue.length > 1) return; function sta…
Wikan 03.12.2015 12:17
Wikan
Chtěl bych se ještě vrátit k tvému kódu, snažím se někam umístnit callback s parametrem, že bych to…
Honza Marek 20.12.2015 20:45
Honza Marek
Prostě jenom classM(text).
Wikan 20.12.2015 20:48
Wikan
A tan callback mám vložit kam ?
Honza Marek 20.12.2015 21:02
Honza Marek
No pokud ho nepotřebuješ, tak nikam.
Wikan 20.12.2015 21:03
Wikan
Právě že někdy ho potřebuji, někdy se hodí i callback + parametr.. (nebo je to atribut ?)
Honza Marek 20.12.2015 21:09
Honza Marek
Když ho potřebuješ, tak ho tam dáš, když ho nepotřebuješ, tak ho tam nedáš. JS je v tomhle velmi ben… nový
Wikan 20.12.2015 21:10
Wikan
Ale nevím na jaké místo ho vložit v tom kódu, odkud ho mám volat.. aby se zavolal po dokončení jedno… nový
Honza Marek 20.12.2015 21:19
Honza Marek
Tak teď ti nerozumím. nový
Wikan 20.12.2015 21:20
Wikan
No spustím příkaz classM('Nějaký text', nazevFunkceKterouChciSpustitPoVypsaniTextu, 'Nějaký paramer'… nový
Honza Marek 20.12.2015 21:34
Honza Marek
No logicky tam, kde tu funkci chceš spustit. nový
Wikan 20.12.2015 21:42
Wikan
No jen kdybych věděl kde končí jeden cyklus :-( nový
Honza Marek 20.12.2015 22:11
Honza Marek
V tom mém kódu ale žádný cyklus není. nový
Wikan 20.12.2015 22:12
Wikan
No cyklus v pravém slova smyslu ne, ale návaznost, že volá sám sebe tam je... nový
Honza Marek 20.12.2015 22:29
Honza Marek
Tomu se říká rekurze. Jestli má pokračovat či ne, se zjišťuje následující podmínkou: if (index >= t… nový
Wikan 20.12.2015 22:34
Wikan
Aha, tak že by to mělo být takto ? if (index >= text.length) { queue.splice(0, 1); start(); callbac… nový
Honza Marek 20.12.2015 23:34
Honza Marek
Spíš před ten start, protože tím už se začíná vypisovat další řádek. nový
Wikan 21.12.2015 08:46
Wikan
OK, díky moc. a můžem mi obasnit tohle ? // tady vlozis do fronty dalsi polozku queue.push(text); /… nový
Honza Marek 21.12.2015 12:38
Honza Marek
Pokud je počet položek ve frontě větší než 1, tak se vykreslení další položky odstartuje po vykresle… nový
Wikan 21.12.2015 14:02
Wikan
Tak vložit jen položku do fronty nestačí, ne ? :-) nový
Honza Marek 21.12.2015 16:59
Honza Marek
Stačí, protože z fronty se to zase vybere po dokončení předchozí položky. nový
Wikan 22.12.2015 00:36
Wikan
Tak že mám volat classM() jen jednou ? a pak jen plnit tu frontu ? nový
Honza Marek 22.12.2015 09:23
Honza Marek
Voláš ji tolikrát, kolik chceš přidat řádků. poslední
Wikan 22.12.2015 11:56
Wikan
var queue = [];

function classM(text)
{
    queue.push(text);
    if (queue.length > 1) return;
    
    function start() {
        if (!queue.length) return;
      
        var elem = document.createElement('div');
        document.getElementById('div').appendChild(elem);
        
        var text = queue[0];
                    
        function writer(index) { 
            if (index >= text.length) {
                queue.splice(0, 1);
                start();
            } else {
                elem.innerHTML += text[index];
                setTimeout(function() { writer(index + 1); }, 20);
            }
        };
        writer(0);
    }
    start();
}

Chtěl bych se ještě vrátit k tvému kódu, snažím se někam umístnit callback s parametrem, že bych to pak volal classM(text, callback, paramer); Problém je v tom, že ne každé volání classM() callback nepotřebuje, mám to pak volat classM(text, null, null); nebo classM(text, false, false); nebo úplně jinak ? Děkuji

No spustím příkaz classM('Nějaký text', nazevFunkceKterouChciSpustitPoVypsaniTextu, 'Nějaký paramer'); Text se vypíše ale funkce se nespustí, jelikož v tom kódu od tebe se s tím nepočítalo. A chtěl bych to tam vložit ale nevím přesně kam.

OK, díky moc. a můžem mi obasnit tohle ?

// tady vlozis do fronty dalsi polozku
queue.push(text);
// tady kontrolujes, zda je pocet polozek ve fronte vice nez 1 a pokud ano, tak to ukoncis. Tomu nerozumím, dávalo by to smysl kdyby to bylo opacne..
if (queue.length > 1) return;

Zpět do poradny Odpovědět na původní otázku Nahoru