[Javascript] Verwijderen van spaces aan linkerkant string

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik ben bezig met een admin pagina waar gebruikers nodes aan een boom toe kunnen voegen. Als iemand in de 'select multiple' waarin de boom wordt weergegeven, een node aanklikt, moet de naam van deze node in een input type worden weergegeven. Dat is uiteindelijk gelukt:

Afbeeldingslocatie: http://www.danandan.luna.nl/tree.gif

Ik zit nu alleen met het volgende probleem: om de boom goed te kunnen weergeven, indent ik elke node met no brake spaces:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
<select name="cat_list" size="20" onchange="get_parent();" multiple>
  <option value=26>Food</option>
  <option value=27>&nbsp;&nbsp;&nbsp;Fruit</option>
  <option value=39>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snuffeldierpartje</option>
  <option value=40>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rond</option>
  <option value=41>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vierkant</option>
  <option value=42>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rechthoekig</option>
  <option value=28>&nbsp;&nbsp;&nbsp;Meat</option>

...etc...

</select>

Met de functie get_parent breng ik naam van de geselecteerde node over naar de input box recht (met rode cirkel).
HTML:
1
2
3
4
5
6
function get_parent(){
    var selectedItem  = document.frm_cat_add.cat_list.selectedIndex;
    var selectedText  = document.frm_cat_add.cat_list.options[selectedItem].text;

    document.frm_cat_add.cat_parent_name.value = selectedText;
}

Ga even uit van het plaatje hierboven. Hierin is Vierkant geselecteerd. Het probleem is dat 'Vierkant' nu ergens halverwege die input box staat. Logisch, want met het overbrengen zijn ook de spaces waarmee ik de indent regel, meegekomen.

Ik heb met verschillende scriptjes geprobeerd die spaces (IndexOf(" ") ...) te verwijderen, maar ik heb twee problemen:

1. spaces verwijderen lukt niet. Moet ik wellicht zoeken op nbsp's in de string?
2. hoe verwijder ik alleen de spaces links van de string?

Ik besef dat deze vraag neigt naar een scriptrequest. Ik plaats hem toch, omdat ik nu al 3 uur bezig ben met dit probleem, en het nu niet leuk meer is. Ik heb verschillende scripts op javascriptsource en planetsourcecode bekeken, maar deze hielpen mij niet verder. Wie stuurt mij op weg?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Deze code werkt perfect...

code:
1
2
3
4
5
6
7
8
9
10
11
function ltrim(str)
{
  // 160 schijnt het teken te zijn wat IE6.0 maakt van &nbsp;
  // IE is weird :?
  var aWhiteSpace = {9:1, 10:1, 13:1, 32: 1, 160:1}
  while(aWhiteSpace[str.charCodeAt(0)] == 1)
  {
    str=str.substring(1,str.length);
  }
  return str;
}

[ Voor 80% gewijzigd door Verwijderd op 20-03-2004 16:08 ]


  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 26-05 16:31
Ik denk dat je beter naar een oplossing kan zoeken, zodat je die &nbsp's niet hoeft te gebruiken, dat ziet er ook niet uit namelijk.

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Jorgen Horstink: een soortgelijk script heb ik al geprobeerd, maar het doet niets met de string...
@ Dr_Frickin_Evil: zonder nbsp's kan ik de boomstructuur niet goed weergeven. Hoe ident jij dan in een input of select box?!

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Ik heb net mijn post aangepast...

Het blijkt dat IE van de &nbsp; een 160 maakt...
De vernieuwde functie werkt (heb hem getest)

  • disjfa
  • Registratie: April 2001
  • Laatst online: 12-05 15:11

disjfa

be

Zat laatst ook de regex voor de trim functie uit te zoeken :)

code:
1
2
3
function trim(str){
     return str.replace(/^\s+|\s+$/g,'');
}

disjfa - disj·fa (meneer)
disjfa.nl


Verwijderd

Ik gebruik dit :

function fnTrim(fieldValue)
{
var cnt;
var len;
fVal = fieldValue.toString();
len = fVal.length;
str = fVal;
begin = -1;
for(cnt=0;cnt < len;cnt++)
{
if (str.charAt(cnt) == " ")
begin = cnt;
else
break;
}
str = str.substring(begin+1,len);
len = str.length;
end = len;
for(cnt=len-1;cnt>=0;cnt--)
{
if (str.charAt(cnt) == " ")
end = cnt;
else
break;
}
str = str.substring(0,end);
return str;
}

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 26-05 16:31
Denk dat het sowieso handiger is om met (associatieve) arrays te gaan werken, en dan hoef je dus ook niet steeds de &nbsp's uit de strings te halen.

Verwijderd

Verwijderd schreef op 20 maart 2004 @ 16:13:
Ik gebruik dit :

function fnTrim(fieldValue)
{
var cnt;
var len;
fVal = fieldValue.toString();
len = fVal.length;
str = fVal;
begin = -1;
for(cnt=0;cnt < len;cnt++)
{
if (str.charAt(cnt) == " ")
begin = cnt;
else
break;
}
str = str.substring(begin+1,len);
len = str.length;
end = len;
for(cnt=len-1;cnt>=0;cnt--)
{
if (str.charAt(cnt) == " ")
end = cnt;
else
break;
}
str = str.substring(0,end);
return str;
}
Dit noem ik nog eens efficient programmeren ;)
Zijn jullie allemaal blind of lezen jullie niet? Heb net gepost dat die functie van mij (zo'n 4x korter en waarschijnlijk ook sneller) perfect werkt...

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ja regexp is toch wel het simpelst. die van disjfa doet het bij mij niet in dit voorbeeldje, daarom hebbik een iets andere:
code:
1
2
3
4
5
6
7
8
<pre>
<script>
    str = "&nbsp;&nbsp;&nbsp;&nbsp;blaat&nbsp;blaat&nbsp;&nbsp;\n";
    document.write("origineel: "+str);
    str = str.replace(/^(&nbsp;)*/, "");
    document.write("ltrimmed : " +str);
</script>
</pre>

Verwijderd

Jah, simpel en traag...
En hij matched niet eens alle whitespace... maar alleen &nbsp;

  • disjfa
  • Registratie: April 2001
  • Laatst online: 12-05 15:11

disjfa

be

traag? En wel alle. Verdiep je gerustig eens in wat regex doet jorgen. Dat is erg interesant en handig namenlijk en de loop codes die jij gebruikt erg overbodig maakt :)

en zet er een code in die alles spaties en non breaking spaces goed zet en dan ben je klaar :)

[ Voor 23% gewijzigd door disjfa op 20-03-2004 16:18 ]

disjfa - disj·fa (meneer)
disjfa.nl


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Verwijderd schreef op 20 maart 2004 @ 16:16:
Jah, simpel en traag...
En hij matched niet eens alle whitespace... maar alleen &nbsp;
ja da's een kwestie van die regexp uitbreiden op alle mogelijke vormen van spaties. ik wist niet dat regexps zo traag waren...

Verwijderd

RegEx is gewoon traag, dat is nou eenmaal zo... En ik snap echt wel hoe RegEx in elkaar zit, heb ooit een HTML to XML parser geschreven met RegEx, conclusie: trager dan een teken-voor-teken parser. Trouwens, die RegEx van jou zou moeten stoppen zodra een ander teken gevonden is... Hij wil immers alleen spaties aan het begin strippen...

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Jorgen Horstink - je functie werkt nu idd perfect. Dank je! Dit scheelt mij een paar handen vol haar ;)
@iedereen - bedankt voor jullie reakties :) Enne...regexp rules ook hoor! 8)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • disjfa
  • Registratie: April 2001
  • Laatst online: 12-05 15:11

disjfa

be

Okee, jij VIND regex niets, dat mag jij weten. Maar ga dan niet loze code posten en laten zien hoe het moeilijker ook kan terwijl het ook makkelijk snel en efficient kan.

Als je verder nieteens kan zeggen waarom regex traag is, waarom zeg je het dan uberhaupt

disjfa - disj·fa (meneer)
disjfa.nl


Verwijderd

Behalve je spelfout heb ik nog één opmerking ;)
Ik vind Regular Expressions best handig, maar dan alleen voor taken die RegEx vereisen. Dingen als een ltrim is gewoon veel makkelijker te maken met een simpele loop. Om een Flame te voorkomen zal ik niet meer posten in dit topic...

/Edit
Jou RegEx matched niet eens. IE maakt van &nbsp; geen whitespace maar een Ascii 160. \n matched die Ascii 160 niet... Dus wie moet zich nou verdiepen in RegEx :?

[ Voor 25% gewijzigd door Verwijderd op 20-03-2004 16:30 ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20:58
Meer inhoudelijk over je systeempje: moet je niet de value hebben van de option? Dus om als parent te gebruiken? Of doe je dat op de achtergrond, want een naam in je tree hoeft niet altijd uniek te zijn.
Pagina: 1