[js] script variabel probleem

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
javascript geladen in de header
code:
1
2
3
4
5
6
7
8
9
10
function gone(selectedtype, standaardprijs, prijsplek)
{
   standaardprijs = parseFloat(standaardprijs);
   var mySelectBoxes = document.forms[selectedtype].getElementsByTagName('select');
   for (var i = 0; i < mySelectBoxes.length; i++)
   { 
      standaardprijs += parseFloat(mySelectBoxes[i].value);
   } 
   prijsplek.innerText = standaardprijs;
}


aanroep uit van select box uit het formulier genaamd server0
code:
1
onChange="gone('server0','78','prijs0')"


in de body van html ergens op de pagina
code:
1
<a id="prijs0">78</a>


de bedoeling is dat de 78 veranderd naar gelang de value van de select box veranderd. helaas geeft dit script geen foutmelding maar werk ook niet...

[ Voor 8% gewijzigd door Daniel304 op 25-08-2003 11:13 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

prijsplek geeft natuurlijk geen referentie naar je element in je document; probeer dit eens:
JavaScript:
1
document.getElementById(prijsplek).innerText = standaardprijs;

mooier is echter:
JavaScript:
1
document.getElementById(prijsplek).childNodes.item(0).nodeValue = standaardprijs;


edit: typvoudt; item(0) ipv items(0) ;)

[ Voor 8% gewijzigd door crisp op 25-08-2003 11:55 ]

Intentionally left blank


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
ik begrijp niet waarom mijn manier in een hoop scripts wel werken en nu niet ?!?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Daniel304 schreef op 25 augustus 2003 @ 11:20:
ik begrijp niet waarom mijn manier in een hoop scripts wel werken en nu niet ?!?
Geef eens een voorbeeld, want dat geloof ik niet; een string kan nooit een referentie naar een element zijn. Het enige dat ik me kan voorstellen is dat je in andere situaties dit gebruikt:

HTML:
1
<input name="prijsplek" type="text" />

JavaScript:
1
prijsplek.value = 'blaat';


elementen met een name attribuut zijn globale properties van het window object; neemt niet weg dat dit een ranzige manier is om je elementen aan te spreken (plus dat het name attribuut in XHTML voor de meeste elementen niet meer toegestaan is)

Intentionally left blank


Verwijderd

daar mag je ook firstChild van maken

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
edit:

editje

[ Voor 86% gewijzigd door Daniel304 op 06-10-2003 13:14 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Verwijderd schreef op 25 August 2003 @ 11:31:
[...]
daar mag je ook firstChild van maken
klopt :)

Intentionally left blank


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

mmmz, IE maakt dus child-elementen met een id ook property van het window object; dat is tegen alle standaarden in! Mozilla doet het trouwens ook niet.

Nog 2 opmerkingen:
1) in een event handler hoef je niet expliciet javascript: op te geven
2) dit voorbeeld is niet hetzelfde als dit:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
   <head>
      <title>test maar</title>
      <script type="text/javascript">

      function doChange(el,text) {
        el.innerText = text;
      }

      </script>
   </head>
   <body>
   <div id="testing">hallo</div><br>
   <input type="button" onClick="doChange('testing', 'wereld');" value="test dit maar"><br>
   <input type="button" onClick="doChange('testing', 'hallo');" value="nogmaals">
   </body>
</html>


hier geef je een string door naar je functie ipv een object verwijzing.

Intentionally left blank


Verwijderd

hier gebruik je geen string, je expressie staat wel in een string, maar die wordt gevealueerd. als je doorgaat op wat jij wil kan je doen:
JavaScript:
1
eval(prijsplek+'.innerText = standaardprijs');


maar da's echt niet aan te raden. Crisp's manier is toch echt het netste

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Verwijderd schreef op 25 August 2003 @ 11:44:
[...]

hier gebruik je geen string, je expressie staat wel in een string, maar die wordt gevealueerd. als je doorgaat op wat jij wil kan je doen:
JavaScript:
1
eval(prijsplek+'.innerText = standaardprijs');

[...]
eval is sowieso niet aan te raden, maar daarbij ga je voorbij aan het feit dat elementen met een id geen propertie van het window object mogen zijn; dat IE dat wel doet is irrelevant; je elementen zo aanspreken is ranzig, en eval is zo mogelijk nog ranziger ;)

innerText is trouwens geen onderdeel van de DOM standaard, maar een IE-extention die toevallig door Mozilla is overgenomen vanwege compatibiliteit ook niet door Mozilla ondersteund wordt (innerHTML is wel overgenomen vanwege compatibiliteit).

[ Voor 19% gewijzigd door crisp op 25-08-2003 11:51 ]

Intentionally left blank


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
hehe leuk he IE.... maar heb weer wat geleerd bedankt en hij werkt nu... Childnodes vind hij nog niet zo leuk echter..
code:
1
2
3
4
5
6
7
8
9
10
      function gone(selectedtype, standaardprijs, prijsplek)
      {
         standaardprijs = parseFloat(standaardprijs);
         var mySelectBoxes = document.forms[selectedtype].getElementsByTagName('select');
         for (var i = 0; i < mySelectBoxes.length; i++)
         { 
            standaardprijs += parseFloat(mySelectBoxes[i].value);
         } 
         document.getElementById(prijsplek).innerText = standaardprijs;
      }


edit:
spellings controlle ;)

[ Voor 13% gewijzigd door Daniel304 op 25-08-2003 11:54 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Daniel304 schreef op 25 August 2003 @ 11:50:
hehe leuk he IE.... maar heb weer wat geleerd bedankt en hij werkt nu... Chilnodes vind hij nog niet zo leuk echter..
code:
1
2
3
4
5
6
7
8
9
10
      function gone(selectedtype, standaardprijs, prijsplek)
      {
         standaardprijs = parseFloat(standaardprijs);
         var mySelectBoxes = document.forms[selectedtype].getElementsByTagName('select');
         for (var i = 0; i < mySelectBoxes.length; i++)
         { 
            standaardprijs += parseFloat(mySelectBoxes[i].value);
         } 
         document.getElementById(prijsplek).innerText = standaardprijs;
      }
zie mijn edit hierboven; Mozilla ondersteund ook geen innerText, dus je zult het toch anders moeten doen; dit zou mi moeten werken:
JavaScript:
1
document.getElementById(prijsplek).firstChild.nodeValue = standaardprijs;

Intentionally left blank


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
okay foutje van mij ;) lettertje vergeten... Crisp's manier werkt !!!! thanks !!!!

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
hehe.. er zijn nog wat problemen in het script helaas...
JavaScript:
1
var mySelectBoxes = document.forms[selectedtype].getElementsByTagName('select');

werkt wel maar ik wil niet alle select boxes hebben alleen die met id="dboxes"
helaas werkt dit niet ?!?
JavaScript:
1
var mySelectBoxes = document.forms[selectedtype].getElementById('dboxes');

Verwijderd

document.getElementById('dboxes');

beetje zoeken mag wel hoor

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
jah die kende ik al alleen nu ga je ervan uit dat ik maar 1 formulier heb.... ik heb er meerdere met select boxes waarin id="dboxes" invoor komt

Ik ben echt niet lui ofzo hoor :p

Verwijderd

id's horen uniek te zijn, dus je doet iets fout.

getElementById is alleen een method van document
getElementsByTagName is een method van elk element, als je weet welke het is kan je bijvoorbeeld doen getElementsByTagName('input')[0] of loopen door de hele collectie en kijken welke id de jouwe is.

Feit blijft dat id's uniek horen te zijn, dus daar ligt je probleem

[ Voor 9% gewijzigd door Verwijderd op 28-08-2003 13:19 . Reden: oepsje ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Daniel304 schreef op 28 augustus 2003 @ 13:14:
jah die kende ik al alleen nu ga je ervan uit dat ik maar 1 formulier heb.... ik heb er meerdere met select boxes waarin id="dboxes" invoor komt

Ik ben echt niet lui ofzo hoor :p
een id moet uniek zijn binnen een document...

Intentionally left blank


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
ow owkay dat is kl*t* sorry.... ik heb 3 "dboxes" en 2 "aboxes" in elk van de 8 formulieren
de "dboxes" moeten bij elkaar opgeteld worden en gedeelte worden door de som van de "aboxes" maar het zijn niet allemaal select boxes ook gewoon input

[ Voor 60% gewijzigd door Daniel304 op 28-08-2003 13:33 ]


Verwijderd

even aanpassen dus
nu kom je er vast wel uit ;)

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
idee gebruiken van
getElementsByName ?!?

var mySelectBoxes = document.forms[selectedtype].getElementsByName('dboxes');

mag blijkbaar ook niet

Verwijderd

getElementsByName is ook alleen een method van document
voor een goede referentie: zie www.w3schools.com

names hoeven idd niet uniek te zijn, de method returnt ook een collection, wat weer niet is wat je wil.

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
inderdaad tenzij je er .value achterzet en forms[selectedtype] ertussenuit sloopt... nu nog
iets vinden waardoor ik de lengte ervan kan uitlezen zodat ik hem kan laten loopen om alles eruit te halen !!!

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
voor de mensen eventueel
JavaScript:
1
2
3
4
5
     sizesof = document.getElementsByName("dboxes" + counter).length
      for (var i = 0; i < sizesof; i++)
      { 
         standaardprijs += parseFloat(document.getElementsByName("dboxes"+ counter)[i].value);
      }


de counter is meegegeven en staat voor een formulier nummer
Pagina: 1