Avatar billede marrix Juniormester
09. juni 2004 - 12:29 Der er 22 kommentarer og
1 løsning

Hvordan "knækker" man en lang linje og fjerner linjeskift?

Hej eksperter (igen igen)

Jeg har et textarea, hvor man kan indtaste en sms-besked. Ved siden af tekstarea'et, bliver meddelelsen opsummeret, så man nogenlunde kan se, hvordan den færdige sms vil se ud. (Der tilføjes nemlig per automatik forskellige tekststumper, som brugeren ikke har mulighed for at fjerne, men som han skal have mulighed for at se.)

Men jeg vil gerne have fjernet de linjeskift, brugeren eventuelt vælger at "pynte" sin sms med (da linjeskiftene alligevel ikke kan indgå i den færdige sms-besked). Desuden skal beskeden/teksten "knækkes" efter et antal karakterer - igen for at simulere den måde, hvorpå en sms vises på en mobiltelefon.

Hvordan griber jeg det an?

Venligst
marianne
Avatar billede skovenborg Nybegynder
09. juni 2004 - 12:43 #1
det ville være lettere hvis du kunne vise det script du umiddelbart sidder med (evt. et link).
Avatar billede marrix Juniormester
09. juni 2004 - 13:02 #2
jf. mit netop afklarede spørgsmål http://www.eksperten.dk/spm/507798 (tak til el barto og mm12010 :)) har jeg benyttet mig af følgende:

document.getElementById('feltSumMsg').innerHTML= sumMsg

...jeg har en <p id="feltSumMsg"></p> et sted i body på htmldokumentet.
...en javascript-funktion i toppen af dokumentet sørger for at samle/opsummere den indtastede tekst (fra et textarea) i variablen sumMsg.
...den samme funktion udfører den ovennævnte getElementById.
...funktionen gennemløbes hver gang brugeren tilføjer en ny karakter til textarea.

Venligst
marianne
Avatar billede mm12010 Nybegynder
09. juni 2004 - 13:22 #3
function makeSMS(str){
    tegn=5;
    temp=""
    str=str.replace(/\s/gi,"\40");
    for(i=0;i<str.length;i++)temp+=(i%tegn==tegn-1&&str.charAt(i)!="\40")?str.charAt(i)+"<br>":str.charAt(i);
    return temp;
    }
Avatar billede marrix Juniormester
09. juni 2004 - 13:35 #4
*grlmpff* *host*
>>mm12010 ... din løsning er noget over det ydmyge begynderstadie jeg jonglerer på. Jeg er sikker på at det virker (tester lige), men kunne man ikke udbede sig bare en lillebitte kort forklaring til visse af detaljerne i: 

str=str.replace(/\s/gi,"\40");
for(i=0;i<str.length;i++)temp+=(i%tegn==tegn-1&&str.charAt(i)!="\40")?str.charAt(i)+"<br>":str.charAt(i);

Hvad gør hvad? Please?

venligst, marianne
Avatar billede mm12010 Nybegynder
09. juni 2004 - 13:42 #5
det kan oz skrives sådan :o)

str=str.replace(/\s/gi,"\40");//erstatter alle forekomster mellemrumstegn incl linieskift med alm mellemrum
for(i=0;i<str.length;i++){//løber teksten igennem
    if(i%tegn==tegn-1&&str.charAt(i)!="\40"){
        temp+=str.charAt(i)+"<br>";//hvis den ønskede linielængde er nået tilføjes et linieskift
        }
    else{
        temp+=str.charAt(i);//ellers forstætter vi
        }
Avatar billede mm12010 Nybegynder
09. juni 2004 - 13:53 #6
denne stump skal muligvis fjernes:

&&str.charAt(i)!="\40"
Avatar billede marrix Juniormester
09. juni 2004 - 14:42 #7
øvbøv...det virker ikke. Jeg har forsøgt at flette din (>>mm12010) funktion ind i mit eksisterende rod. Din funktion ser nu nogenlunde således ud:

function makeSMS(sumMsg) {
tegn=5;
temp="";
sumMsg = sumMsg.replace(/\s/gi,"\40");
for(i=0;i<sumMsg.length;i++){
if(i%tegn==tegn-1&&sumMsg.charAt(i)!="\40") {
temp+=sumMsg.charAt(i)+"<br>";
}
else {
temp+=sumMsg.charAt(i);
}
return temp;
}
document.getElementById('feltSumMsg').innerHTML = temp
}

...det du kaldte str har jeg erstattet med sumMsg, som er den variabel, der i en anden funktion samler den tekst som indtastes af brugeren (+ lidt andet). Desuden har jeg tilføjet den der getElementById-sætning - den lå i en anden funktion før.

...har forsøgt mig uden &&str.charAt(i)!="\40", men det gør ingen forskel. Der er intet af det jeg indtaster, som kommer med over i <p id="feltSumMsg">

Så hvor er det jeg klokker i det?

Venligst, marianne
Avatar billede marrix Juniormester
09. juni 2004 - 14:52 #8
...og hvad betyder:(i%tegn==tegn-1&&sumMsg.charAt(i)!="\40")

...sådan mere nøjagtigt? Hvad betyder f.eks. et % i denne sammenhæng - noget med modulus???

Venligst, marianne
Avatar billede mm12010 Nybegynder
09. juni 2004 - 14:53 #9
når men kommer til et 'return' afsluttes funktionen derfor skal det fjernes:

function makeSMS(sumMsg){
    tegn=5;
    temp="";
    sumMsg=sumMsg.replace(/\s/gi,"\40");
    for(i=0;i<sumMsg.length;i++){
        if(i%tegn==tegn-1&&sumMsg.charAt(i)!="\40"){
            temp+=sumMsg.charAt(i)+"<br>";
            }
        else{
            temp+=sumMsg.charAt(i);
            }
        }
    document.getElementById('feltSumMsg').innerHTML=temp;
    }
Avatar billede mm12010 Nybegynder
09. juni 2004 - 15:00 #10
det bliver lidt kringlet at forklare men jeg prøver :o)

i%tegn==tegn-1 //<< hvis tegn nummer 'i' modulus antallet af tegn pr linie, er lige med antallet af tegn pr linie minus 1(da man man starte med nul), så har vi nået den ønkede linielængde, og derfor skal vi ha et linieskift

sumMsg.charAt(i)!="\40" //<< hvis tegnet på den pågældende placering så er et mellemrum behøver vi ikke linieskiftet, da linien automatisk brydes hvis det er defineret width på det p-tag vi indsætter teksten i
Avatar billede marrix Juniormester
09. juni 2004 - 15:08 #11
...ja det burde jeg vel vide nu efterhånden (har lige haft et andet problem, hvor det var "return" der spøgte). Men nu er return blevet sparket ud - og jeg kan stadig ikke få det til at virke. Har forsøgt med:

document.getElementById('feltSumMsg').innerHTML = (temp + "HEJ");

...for at se om problemet ligger i variablen sumMsg. Men der kommer stadig nul&niks med over i <p id="feltSumMsg">.

Hvad kan jeg have overset?
Avatar billede mm12010 Nybegynder
09. juni 2004 - 15:13 #12
hvordan kalder du funktionen?
Avatar billede marrix Juniormester
09. juni 2004 - 15:15 #13
Hæhæ - nu virker det alligevel. Havde kaldt funktionen makeSMS efter "return true;" - så altså igen en return der spøgte. Tak for hjælpen igen igen. Vil du >>mm12010 være så elskværdig at sende mig en smule svar, så jeg taknemmeligt kan tildele dig nogle velfortjente points? :))

venligst, Marianne
Avatar billede mm12010 Nybegynder
09. juni 2004 - 15:21 #14
selv tak :o)
Avatar billede marrix Juniormester
09. juni 2004 - 15:41 #15
Sku' det være en anden gang ;)

...bare et lille sidste spørgsmål (såfremt du har tid): Du har sat funktionen til 5 tegn (inden den knækker linjerne) - jeg har lige forsøgsvis ændret det til 20, men så opfører linjeknækkene sig lidt besynderligt - hvorfor? Skal der ændres på det der tal "\40" også?

Venligst, marianne
Avatar billede mm12010 Nybegynder
09. juni 2004 - 15:54 #16
hvordan besynderligt?-)

prøv at fjerne dette:
&&str.charAt(i)!="\40"
Avatar billede marrix Juniormester
10. juni 2004 - 08:20 #17
Hmmmm. Nu har jeg forsøgt igen - med og uden ovenstående. Det ser ud som om, at det er når jeg laver et linjeskift, at der foregår noget mystisk. Linjeskiftet bliver udskiftet med et mellemrum (som det også skal), men de to efterfølgende linjer "knækker" inden de (eksempelvis) 20 tegn er nået (der indsættes per automatik et <br> inden 20-1 er nået). Herefter knækker linjerne igen som de skal. Linjeskiftet giver kludder i regnskabet (modulus?) - og jeg kan simpelthen ikke greje hvorfor...?!?

Venligst, marianne
Avatar billede mm12010 Nybegynder
10. juni 2004 - 08:36 #18
prøv sådan:

function makeSMS(sumMsg){
    tegn=20;
    temp="";
    sumMsg=sumMsg.replace(/\s/gi,"\40");
    for(i=0;i<sumMsg.length;i++){
        if(i%tegn==tegn-1){
            temp+=sumMsg.charAt(i)+i+"<br>";
            }
        else{
            temp+=sumMsg.charAt(i);
            }
        }
    document.getElementById('feltSumMsg').innerHTML=temp;
    }

så kan du se antallet af tegn pr linie - med tegn=20 skulle du ger få en rækkefølge der ser således ud: 19,39,59,79,99,119 osv
Avatar billede marrix Juniormester
10. juni 2004 - 11:24 #19
Nu har jeg testet frem og tilbage, med din gode ide med tallene.

...og dumme mig...jeg kan nu se, at det er mig, der ikke har været opmærksom på, at feltet, hvor teksten (temp) skrives, ikke er helt bred nok til de 20 tegn, som jeg har testet med. Så i de sætninger hvor der er mange "brede" bogstaver, bliver linjerne "knækket" i det nærmeste mellemrumstegn. Linjer med mange "smalle" bogstaver er der rigelig plads til. Det gav altså en noget forvirrende linjedeling.

Så alt er ok - og tusind tak for hjælpen igen igen :))
Kan man tilbyde dig lidt ekstra points for den yderligere service, jeg har fået udover spørgsmålets afslutning?

Venligst, Marianne
Avatar billede marrix Juniormester
10. juni 2004 - 11:33 #20
...løsningen var blandt også at tilføje et style til "feltSumMsg"-feltet, således at dette felt skrive med en monotype-skrifttype. Nu skulle der ikke være problemer uanset om der er tale om "brede" eller "smalle" bogstaver... ;)

Marianne
Avatar billede mm12010 Nybegynder
10. juni 2004 - 11:43 #21
velbekomme - behøves ikke flere point :o)
Avatar billede marrix Juniormester
10. juni 2004 - 11:45 #22
oki doki...men du får nu noget velfortjent karma ;)
Avatar billede mm12010 Nybegynder
10. juni 2004 - 12:04 #23
takker - i lige måde :o)
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