11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'essaie d'accéder un un élément radio, le code marche sous FF mais pas sous IE6.
Je créé l'élément dans une fonction javascript :
var contenu = document.createElement("input");
    contenu.setAttribute("type","radio");
    contenu.setAttribute("name","optMahj0" );
            
    document.getElementsByTagName("Body")[0].appendChild(contenu);


Le code qui y accède dans une autre fonction :

function test() {
    if (document.getElementsByName("optMahj0")[0])
        alert(document.getElementsByName("optMahj0")[0].checked);
    else 
        alert("absent");
}


cette fonction affiche donc "true" ou "false" sous FF et "absent sous IE6.

Quelqu'un aurait'il une méthode pour accéder à cette élément radio ?
Merci pour vos réponses.
Garde en variable globale l'élément créé que tu vas réutiliser par la suite.
Je m'explique :


var monradio;
function fonction1 () {
// ...
monradio = document.createElement('input');
monradio.setATtribute('type', 'radio');
// .....
}

function fonction2 () {
alert(monradio.checked);
}
Merci pour ta réponse aussi rapide.

Justement c'était pour éviter ça que j'utilise la fonction getElementsByTagName(). Ma page comporte plusieurs tableaux avec une trentaine d'éléments radio (par groupe de cinq). Tout ça est généré dynamiquement par plusieurs appels à une fonction (les noeuds sont ajoutés par cloneNode). Ca me parait vraiment compliqué de restructurer mon code pour conserver tous les noeuds de type 'input' en mémoire.
Ma question était plutôt dans le genre pourquoi ça marche sous FF, y a t-il une différence de structure DOM à ce niveau, ou est-ce par ce n'est pas codé 'en dur' mais de façon dynamique que l'accès ne peut se faire, ou y aurait-il une fonction magique à ajouter ou une autre façon d'y accéder par cette fonction.

Je sais je demande beaucoup, mais le but de ce développement était pour moi de maitriser DOM pour ces deux explorateurs.
A tout hasard, qu'est-ce que ça donne avec getElementById ?
et avec le tableau document.forms Smiley xxx .elements Smiley xxx ?
Alors ça vient peut-être de là. Les champs input sont logiquement censés se trouver dans un formulaire, pas ailleurs.
J'ai finalement contourné le problème en utilisant getElementById.

Toujours dans la création dynamique du formulaire :

    var formTest = document.createElement("form");
    formTest.setAttribute("name","formTest" );
    var contenu = document.createElement("input");
    contenu.setAttribute("type","radio");
    contenu.setAttribute("name","optMahj0" );
    //contenu.setAttribute("checked",true);
    formTest.appendChild(contenu);
    //formTest.appendChild(contenu.cloneNode(true));
    //formTest.appendChild(contenu.cloneNode(true));
             
    document.getElementsByTagName("Body")[0].appendChild(formTest);

Sous IE on ne peut pas cocher l'élément radio (qu'il y en ait un ou plusieurs) ??? Y a un truc que j'ai pas fait ou est-ce que mon navigateur IE a un problème ?
Pour qu'un groupe de radio soit reconnu comme tel, tous les éléments input de ce groupe doivent avoir le même name.
Si dans le code précédent on enlève les deux dernières lignes en commentaire, le clonenode recopie aussi le name.
J'ai testé ce code sous FF, et en parcourant avec l'inspecteur DOM, le formulaire a l'air correct.
As-tu testé ce code sous IE ?
Il semblerait que IE ne réponde pas au DOM pour ça, car Microsoft dit de faire :
var contenu = document.createElement("<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='First Choice'>");

plutôt que :
var contenu = document.createElement("input");
contenu.setAttribute("type","radio");
contenu.setAttribute("name","optMahj0" );

Donc bien sûr ce qui ne marche pas sous FF.

La question suivante (et oui je pose beaucoups de questions !) est alors est-ce qu'on doit détecter le nom du navigateur (on conseille dans plusieurs sites ne pas le faire) ou y a t-il un autre moyen de savoir que FF n'a pas supporté cette fonction et n'a pas continué l'exécution du script ?
C'est dommage pour les standards, mais je crois qu'il faut effectivement se résigner à adopter un comportement différent entre IE et les autres. Je dis autres parce qu'il n'y a pas que firefox à part IE et je suis sûr qu'opera a le même comportement que lui (ce qui est normal).

Un morceau de code HTML dans document.createElement, quelle horreur et quelle non-sens ! Mais enfin bon on a l'habitude, c'est IE...