logi sisse meist KKK

Niisiis... eneseharimise mõttel tegin sellise asja aga funktsioon eraldapunktist() või hajuvaks() ei taha töödata... loogiliselt nagu peaks :) paks võtma sisendi "Tere minu nimi on Juku. Käin koolis ja õpin IT'd. Aga n2ed m6ni asi ei saa ikka selgeks."

Nüüd peaks iga lause lõpp hajuma mustaks... aga ainult esimesel töötab see... enda mõistus on otsas kust viga otsida... kas i muutub suureks ja ei reseti või mai tea :) keegi ehk kiirelt abistab?

<script language="javascript">
function hajuvaks(muutuja)
{
    var pikkus = muutuja.length - 6;    // pikkus = 6 !
    var str = muutuja.substring(0,pikkus);  // str = viimased 6 tähte... !
    var lopp = muutuja.substring(pikkus);   // lopp = "uluugi" !
    document.write(str);    
    var loppt2ht = "";
    var varvid = new Array();
    varvid[0] = '#FFFFFF';
    varvid[1] = '#DDDDDD';
    varvid[2] = '#BBBBBB';
    varvid[3] = '#999999';
    varvid[4] = '#666666';
    varvid[5] = '#333333';
    document.write(lopp);
    for ( var i in lopp )
    {
        var varv=varvid[i];
        var loppt2ht = lopp[i].fontcolor(varv);
        document.write(loppt2ht);
    }
}
function eraldapunktist(tekst)
{
    var string = tekst.split(".");
    for ( var i in string ) 
    {
        var otsitav = string[i];
        hajuvaks(otsitav);
        document.write(" || ");

}
}
</script>

<script>eraldapunktist("Esimene lause. Teine lause täiendus. Kolmas on üldse liitlause, mida kuvatakse");</script>

küsitud Jun 26 '10 at 12:19

Meelis's gravatar image

Meelis
5223

edited Jun 28 '10 at 07:48

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121


Hetkel on probleem selles, et for..in käivitub vaid esimesel korral. Kui asendaksid rea

for ( var i in lopp )

reaga

for( var i=lopp.length-1;i>=0;i--)

siis peaks asi tööle hakkama.

for..in konstruktsioon on siinkohal niikuinii täiesti vale, kuna see on mõeldud objektide meetodite/omaduste loendamiseks, mitte näiteks massiivi elementide või veel vähem stringi üksikute sümbolite lugemiseks. Seda on küll mõningal määral võimalik teha, kuna JavaScript üritab sisendväärtuse teisendada alati konteksti sobivaks, kuid tulemus võib olla (nagu siingi juhul) üsna ootamatu.

Kui mul on objekt kujul

var objekt = {
    meetod: function(){},
    omadus: "väärtus"
}

siis teada saamaks, milliseid omadusi/meetodeid objekt sisaldab, for..in täiesti omal kohal

for(var i in objekt) alert(i); // "meetod", "omadus"

Kõikidel muudel juhtudel, isegi kui for..in kasutamine on reaalselt võimalik, tasub kasutada siiski muid konstruktsioone (for, while jne). Seda juba kasvõi seetõttu, et tõenäoliselt soovitakse saada tulemusi ikkagi "järjest" (ehk siis 0,1,2,...N), kuid for..in puhul ei ole selline järjestus kunagi garanteeritud! Antud tsükkel ei järjesta automaatselt väärtusi võtme järgi, vaid loeb neid ükshaaval võtmeid arvuti mälust, kus need ei pruugi olla sugugi soovitud järjekorras (kuigi 99% juhtudest need seda siiski on).

Samuti on probleemiks eriti just massiivide juures, et for..in loeb sisse mitte ainult massiivi numbrilise võtmega elemendid, vaid ka massiivi kui objekti meetodid ja omadused. Sellisel viisil on nähtavad ainult kasutajate lisatud omadused/meetodid ning reeglina neid polegi seatud, kuid kolmanda osapoole teegid võivad vabalt olla midagi näiteks massiivi prototüüpobjekti lisanud ja need lisandused kanduvad edasi igasse massiivi, mida üritatakse for..in lausega loendada.

Näiteks kui mõni teek on lisanud massiividele juurde omaduse massiiviPikkus, mis tagastab massiivi elementide arvu:

Array.prototype.massiiviPikkus = function(){return this.length}

Mida saab kasutada nii:

var massiiv = ["a","b","c"];
alert(massiiv.massiiviPikkus()); // 3

Siis massiivi elementide loendamise for..in abil tuleb ka see meetod teiste massiivi elementidega võrdselt esile:

var massiiv = ["esimene element", "teine element", "kolmas element"];

for(var i in massiiv){
    alert(i); // 0, 1, 2, "massiiviPikkus"
}

Kui aga skript tahab midagi selliselt loendatud massiivi elementidega teha, näiteks väljastada ekraanile, on tulemus kõike muud, kui soovitud:

alert(massiiv[0]); // "esimene element"
...
alert(massiiv["masiiviPikkus"]); // "function(){return this.length}"

Näite puhul väljastataks seega ekraanile kõik massivi elemendid ja lõpuks veel meetodi massiiviPikkus source.

Seega kokkuvõttes - for..in on reeglina mõistlik kasutada AINULT objekti meetodite/omaduste loendamiseks ja ei millekski muuks. Kõikidel teistel juhtudel tasub kasutada "vana head" tavalist for lauset või siis mõnd sarnast alternatiivi.

Edit: Lühike variant funktsiooni kirjeldamiseks

function hajuta(tekst){
    var varvid = ["#000", "#333", "#666", "#999", "#CCC", "#DDD"],
      i = tekst.length;
    document.write(tekst.replace(/(.)/g,function(a,b){
        return --i>=6?b:'<span style="color:'+varvid[5-i]+'">'+b+'</span>';
    }));
}
hajuta("See on mingi lause");
link

vastatud Jun 27 '10 at 21:10

Andris's gravatar image

Andris
2553310

edited Jun 28 '10 at 11:43

for( var i=lopp.length-1;i>=0;i--) oli siis tehtud selleks, et värve tagurpidi loetaks, kui aga värvid pididki just sellises järjekorras olema nagu näiteskriptis kirjas, siis tuleb kasutada ikka for(var i=0; i<lopp.length; i++)

(Jun 27 '10 at 21:38) Andris

Paar asja:

  • Kontrolli kordused üle ehk vaata kus peaksid kasutama for..in-i ja kus for-i.
  • Värvide järjekord on vale.
  • Kas punkt peabki ära kaduma?
  • Miks lõppu kaks korda väljastad?
  • Kasuta paremaid muutujate nimetusi. (muutuja, string ja str ei ütle eriti midagi)
  • Tekst on korralikult tagide vahele panemata ehk <p> ja </p> on puudu.
  • Massiiv värvide hoidmiseks võiks olla väljaspool korduvalt kutsutavat funktsiooni.
  • Antud näide toimib ainult valgel taustal.
  • Kui võimalik, siis CSS3 lahendus näeks parem välja.
link

vastatud Jun 26 '10 at 18:56

egon's gravatar image

egon ♦♦
771239

edited Jun 26 '10 at 19:03

Nagu Andris ütles pole for..in tsükkel mõeldud massiivide jaoks - veel vähem on see mõeldud stringide jaoks. Katsetasin seda kolmes brauseris ja sain kolm erinevat tulemust.

Samuti võib probleeme tekitada see rida:

var loppt2ht = lopp[i].fontcolor(varv);

lopp[i] asemel tuleks kasutada lopp.charAt(i), sest esimest IE ei toeta (vähemasti vanemad versioonid mitte).

Ka fontcolor() meetodi kasutamine pole just hea stiil.

Lisaks piirab document.write() su loodud skripti kasutusväärtust. Tühjale lehele teksti kirjutamiseks toimib see kenasti, aga kui sa tahaksid nüüd sedasama koodi kasutada mõnele reaalsele veebilehele dünaamiliselt sisu lisamiseks, siis see enam ei töötaks, sest document.write() toimib normaalselt vaid lehekülje laadimise ajal - hiljem kasutades asendab see aga ära kogu lehekülje sisu, mis pole tõenäoliselt see, mida sa tahaksid. Parem oleks kirjutada koheselt kogu kood DOM-i meetodeid kasutades. See on küll natukene keerukam, aga tasub ennast ära.

Näiteks nõnda:

// Lisab lehe lõppu teksti nõnda, et lõpus olevad tähed järjest helenevad
function lisaHajutatult(tekst) {
    var varvid = ["#000", "#333", "#666", "#999", "#CCC", "#DDD"];
    var lopuPikkus = tekst.length - varvid.length;
    var algus = tekst.substring(0, lopuPikkus);
    var lopp = tekst.substring(lopuPikkus);
    var hajuvLopp = "";
    for (var i=0; i<lopp.length; i++) {
        hajuvLopp += "<span style='color:" + varvid[i] + "'>" + lopp.charAt(i) + "</span>";
    }
    var p = document.createElement("p");
    p.innerHTML = algus + hajuvLopp;
    document.body.appendChild(p);
}

Juhin tähelepanu siin koodis sellele, et värvitavate lõputähtede arv on nüüd kenasti sõltuv varvid massiivi pikkusest. Kui sinna massiivi värve lisada, siis automaatselt värvitakse suurem arv tähti.

link

vastatud Jun 28 '10 at 09:29

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

edited Jun 28 '10 at 09:36

veel lühemalt (kuigi siiski document.write abil) saab funktsiooni panna kirja järgnevalt (loodertavasti vormistus säilib) function hajuta(tekst){ var varvid = ["#000", "#333", "#666", "#999", "#CCC", "#DDD"], i = tekst.length; document.write(tekst.replace(/(.)/g,function(a,b){ return --i>=6?b:''+b+''; })); } hajuta("See on mingi lause");

(Jun 28 '10 at 11:42) Andris

hmmm, ei vormistus ei säilinud, lisan selle oma vastuse lõppu

(Jun 28 '10 at 11:42) Andris
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×18
×2

küsitud: Jun 26 '10 at 12:19

nähtud: 3,118 korda

viimati uuendatud: Jun 28 '10 at 11:43

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee