IE heeft moeite met INPUT via getElementByName

Pagina: 1
Acties:

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24
Ik heb dit stukje code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
    var antwoorden = document.getElementsByName('antwoord['+vraag_id+']');
    var hasValue = false;
    for (var g in antwoorden)
    {
        alert(antwoorden[g].tagName);
        if ((antwoorden[g].tagName == 'TEXTAREA' && antwoorden[g].value != '') || (antwoorden[g].checked))
        {
            hasValue = true;
            break;
        }
    }


Dat werkt in FireFox, in IE krijg ik 'undefined' terug als ik de tagName alert, en [OBJECT] terug als ik object zelf alert. En dat terwijl de functie getElementsByTagName alleen maar INPUTs als resultaat kan hebben (een arraytje aan checkboxes meestal).

iOS developer


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Wordt tagName uberhaupt wel ondersteund door IE :?

Daarnaast snap ik het volgende even niet:
En dat terwijl de functie getElementsByTagName alleen maar INPUTs als resultaat kan hebben (een arraytje aan checkboxes meestal).
Wil je textarea's opvragen? Zo ja, dan kan je ook getElementsByTagName gebruiken hoor :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

JavaScript:
1
for (var g in antwoorden)

Dat is geen correcte manier om door een collection te wandelen

Intentionally left blank


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24
BtM909 schreef op maandag 21 mei 2007 @ 10:12:
Wordt tagName uberhaupt wel ondersteund door IE :?

Daarnaast snap ik het volgende even niet:

[...]

Wil je textarea's opvragen? Zo ja, dan kan je ook getElementsByTagName gebruiken hoor :)
Ja OK in een ander geval heb ik inderdaad ook TEXTAREAs.

Ik heb ergens anders een calendarpickertje gezien, die werkt ook op die manier ongeveer:
http://www.nsftools.com/tips/DatePickerTest.htm

Het enige verschil is dat die de array met FORM elementen benadert via
JavaScript:
1
var targetDateField = document.getElementsByName (dateFieldName).item(0);


Dat ga ik anders even proberen.


Maar het werkt in principe dus wel in IE. Buiten het bovenstaande nog een idee?

iOS developer


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24
OK, het volgende werkt nu:

JavaScript:
1
2
3
4
5
6
7
8
9
    for (var g = 0; g < antwoorden.length; g++)
    {
        alert(antwoorden.item(g).tagName);
        if ((antwoorden[g].tagName == 'TEXTAREA' && antwoorden[g].value != '') || (antwoorden[g].checked))
        {
            hasValue = true;
            break;
        }
    }


Dus ik mag van IE zowel met item(g) als direct in de array er door heen lopen.

Is dit 'de nette manier' of bestaat er nog een variant? Ik vind deze variant van een for-loop fijner omdat je je dan nooit druk hoeft te maken om de keys van een array, die bij mij nogal vaak niet simpelweg genummerd zijn. Maar in dit geval is dat inderdaad overbodig.

-------

Oh nou snap ik de verwarring van bt909 ook wat beter....ik gooide wat functies met 'name' er in door elkaar...sorry! :X

[ Voor 9% gewijzigd door BikkelZ op 21-05-2007 10:49 ]

iOS developer


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

BikkelZ schreef op maandag 21 mei 2007 @ 10:30:
Dus ik mag van IE zowel met item(g) als direct in de array er door heen lopen.
Dat mag in alle browsers; item(x) is echter een extra method-call en dus trager.
Is dit 'de nette manier' of bestaat er nog een variant?
Ik gebruik vaak dergelijke constructies:
JavaScript:
1
2
3
4
5
6
var collection = document.getElementsByTagName('div');
var i = 0, element;
while ((element = collection[i++]))
{
  // ...
}

of
JavaScript:
1
2
3
4
5
6
7
var collection = document.getElementsByTagName('div');
var i = collection.length, element;
while (i--)
{
  element = collection[i];
  // ...
}
Ik vind deze variant van een for-loop fijner omdat je je dan nooit druk hoeft te maken om de keys van een array, die bij mij nogal vaak niet simpelweg genummerd zijn. Maar in dit geval is dat inderdaad overbodig.
Als je associatieve keys gebruikt moet je geen Array gebruiken maar een Object. Pas ook op voor prototyped methods by for-in constructs.

Verwar DOM-collections overigens niet met arrays, dat is niet hetzelfde.

Intentionally left blank


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24
Wat is er tegen een associatieve Array dan?

iOS developer


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07 22:34
BikkelZ schreef op maandag 21 mei 2007 @ 14:02:
Wat is er tegen een associatieve Array dan?
Het is in feite een object. Je kunt properties van een object ook benaderen via object[propertyName]. Logisch hè? :X

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24
Fuzzillogic schreef op maandag 21 mei 2007 @ 14:10:
[...]

Het is in feite een object. Je kunt properties van een object ook benaderen via object[propertyName]. Logisch hè? :X
JavaScript is de Barbapappa der programmeertalen.

iOS developer


Verwijderd

BikkelZ schreef op maandag 21 mei 2007 @ 14:02:
Wat is er tegen een associatieve Array dan?
Niets, behalve dat je door er een array van te maken je alleen wat extra properties en attributen erbij krijgt die er niet bij horen.

Vergelijk:
JavaScript:
1
2
3
var a = new Array();
a['haha'] = 123;
a['hoho'] = 345;


De variabele a heeft nu methods als join(), concat() en splice() die geen betekenis hebben in deze context. Wat dat betreft verschilt de benadering niet veel van:

JavaScript:
1
2
3
var s = new String();
s['haha'] = 123;
s['hoho'] = 345;


JavaScript vindt dit prima. Het belangrijkste verschil is dat je met een for-in loop over een (associative) array de extra native properties en methods niet meekrijgt. Double-checked, het maakt geen verschil of je new String() of new Array() gebruikt. Maar goed, aangezien je die toch niet nodig hebt kun je net zogoed een plain vanilla Object gebruiken:
JavaScript:
1
2
3
var o = new Object();
o['haha'] = 123;
o['hoho'] = 345;

[ Voor 12% gewijzigd door Verwijderd op 21-05-2007 20:39 ]

Pagina: 1