Avatar billede testwatest Nybegynder
26. februar 2007 - 23:07 Der er 8 kommentarer og
1 løsning

'Generere' bogstaver

Hvordan kan jeg lave en funktion som opdateres udfra et givent antal sekunder(muligvis milisekunder), og så skal den genere en given streng.

Med det mener jeg, at hvis jeg har en streng der hedder "test", så skal den først rulle fra a til t(altså a,b,c ..., s, t), for herefter at begynde på det næste bogstav, nemlig e - og det skal den fortsætte med til den har skrevet hele strengen ud.
Avatar billede roenving Novice
26. februar 2007 - 23:19 #1
Hvaddan mener du ?-)

-- skal den først ende med t..., så med te.. osv.
Avatar billede crazysnap Seniormester
27. februar 2007 - 02:24 #2
Hej testwatest,


Jeg synes nu dit spørgsmål er forholdsvist godt defineret. :)

Jeg har lavet et script som burde udføre den handling du ønsker:


<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/JavaScript">
        var speed = 70;
       
        var arrLetters = new Array(' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'æ', 'ø', 'å');
       
        function generateString(outputId, strText)
        {
            generate(outputId, strText, 0, 0);
        }
       
        function generate(elmId, strText, index, aIndex)
        {
            if(index >= arrLetters.length)
                return;
               
            var elmOut = document.getElementById(elmId);
           
            if(strText.charAt(index) == arrLetters[aIndex] || strText.charAt(index) == arrLetters[aIndex].toUpperCase())
            {
                if(index > 0)
                    elmOut.value = elmOut.value.substring(0, index) + strText.charAt(index);
                else
                    elmOut.value = strText.charAt(index);

                if(index + 1 >= strText.length)
                    return;
                   
                aIndex = 0;
                index++;                 
            }
            else
            {
                if(index > 0)
                    elmOut.value = elmOut.value.substring(0, index) + arrLetters[aIndex];
                else
                    elmOut.value = arrLetters[aIndex];
               
                aIndex++;
            }

            setTimeout("generate('" + elmId + "', '" + strText + "', " + index + ", " + aIndex + ")", speed);
        }
       
        </script>
    </head>
    <body>
        <table>
            <tr>
                <td style="width: 100px;">Letters:</td>
                <td><input id="output" type="text" style="border: 0; width: 200px; background-color: ButtonFace;" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="button" value="Click to start dynamic letters" onclick="generateString('output', 'Hej med dig');" /></td>
            </tr>
        </table>
    </body>
</html>


Håber det var det du søgte! :)


Mvh.

- Snap
Avatar billede crazysnap Seniormester
27. februar 2007 - 02:28 #3
Jeg skal måske lige tilføje at det er generateString der skal kaldes med to parametre. Den første parameter er id'et på den textbox strengen skal skrives ud i og den anden parameter specificerer den streng som skal skrives ud.

Der er desuden en 'speed' variabel i scriptet som bestemmer hvor hurtigt den skal løbe alfabetet igennem (i millisekunder). :)


Mvh.

- Snap
Avatar billede testwatest Nybegynder
01. marts 2007 - 22:18 #4
Det ser rigtigt godt ud crazysnap!

Hvordan skal det så se ud hvis jeg vil have at det hele fungerer i en <div> og ikke <input>?

smid lige et svar
Avatar billede crazysnap Seniormester
01. marts 2007 - 22:41 #5
Jeg ville nok foreslå at du proppede en <input>-textbox ind i en div så. :/

Hvis du SKAL skrive det direkte ud i en div, kan du bruge innerHTML, dog med det forbehold at det ikke er valid XHTML som er blevet diskuteret så mange gange her på eksperten. Faktum er at den kan bruges og er browser uafhænging, den betragtes bare som noget rod (bla. fordi den overskriver javascript referencer til elementer).

Så hvis du erstatter alle elmOut.value med elmOut.innerHTML og kalder 'generateString' med et id på en div skriver den "hej med dig" strengen direkte ud i <div>-tag'en. Jeg har for god ordens skyld eksemplificeret det nendenfor:


<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/JavaScript">
        var speed = 70;
       
        var arrLetters = new Array(' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'æ', 'ø', 'å');
       
        function generateString(outputId, strText)
        {
            generate(outputId, strText, 0, 0);
        }
       
        function generate(elmId, strText, index, aIndex)
        {
            if(index >= arrLetters.length)
                return;
               
            var elmOut = document.getElementById(elmId);
           
            if(strText.charAt(index) == arrLetters[aIndex] || strText.charAt(index) == arrLetters[aIndex].toUpperCase())
            {
                if(index > 0)
                    elmOut.innerHTML = elmOut.innerHTML.substring(0, index) + strText.charAt(index);
                else
                    elmOut.innerHTML = strText.charAt(index);

                if(index + 1 >= strText.length)
                    return;
                   
                aIndex = 0;
                index++;                 
            }
            else
            {
                if(index > 0)
                    elmOut.innerHTML = elmOut.innerHTML.substring(0, index) + arrLetters[aIndex];
                else
                    elmOut.innerHTML = arrLetters[aIndex];
               
                aIndex++;
            }

            setTimeout("generate('" + elmId + "', '" + strText + "', " + index + ", " + aIndex + ")", speed);
        }
       
        </script>
    </head>
    <body>
        <table>
            <tr>
                <td style="width: 100px;">Letters:</td>
                <td></td>
            </tr>
            <tr>
                <td colspan="2"><input type="button" value="Click to start dynamic letters" onclick="generateString('output', 'Hej med dig');" /></td>
            </tr>
            <tr>
                <td>
                    <div id="output"></div>
                </td>
            </tr>
        </table>
    </body>
</html>


:) Håber du var det du mente!


Mvh.

- Snap
Avatar billede roenving Novice
02. marts 2007 - 10:33 #6
-- hvorfor ikke bruge den korrekte DOM-ting:

.firstChild.nodeValue !-)

-- det eneste ekstra, det kræver er at sørge for at det børneelement findes, f.eks. ved at sætte et no-break-space ind: &nbsp;
Avatar billede testwatest Nybegynder
04. marts 2007 - 14:49 #7
roenving: hvordan skal det da se ud med firstChild.nodeValue?

crazysnap: smid et svar :D

--
har nogle nogle idéer til hvordan jeg kan dele hvert bogstav op i et felt hver, så width ikke ændrer sig fordi der er forskellige størrelser på bogstaverne?:)
Avatar billede roenving Novice
04. marts 2007 - 14:56 #8
if(index > 0)
                    elmOut.firstChild.nodeValue = elmOut.firstChild.nodeValue.substring(0, index) + strText.charAt(index);
                else
                    elmOut.firstChild.nodeValue = strText.charAt(index);

--
og

                    <div id="output">&nbsp;</div>
Avatar billede crazysnap Seniormester
04. marts 2007 - 16:01 #9
Hej testwatest,


Jeg har fået point for spørgsmålet og tak for dem! :)

Hvilke problmer skaber det for dig at hvert bogstav ikke har samme bredde? Jeg synes ikke det er noget man direkte kan se idet det altid er det sidste bogstav der skifter konstant. :)


Mvh.

- Snap
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester