IE : impossible de changer le name d'un input
dodoletesteur
-
incaout Messages postés 347 Date d'inscription Statut Membre Dernière intervention -
incaout Messages postés 347 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'utilise le code suivant pour ajouter des blocs de formulaire à la demande :
Le problème, comme d'habitude, c'est que ça marche du tonnerre sous FF et Chrome, mais pas sous IE... Apparemment, IE ne permet pas de changer l'attribut "name" d'un objet :-(
J'ai pourtant besoin de modifier les noms des champs, puisqu'il s'agit de les ajouter à un formulaire et de les traiter !
Ce manque d'IE vous a-t-il aussi gêné ? Auriez-vous une solution de remplacement pour le même effet ?
Merci bien !
J'utilise le code suivant pour ajouter des blocs de formulaire à la demande :
var counter = 0;
function moreFields() {
counter++;
var newFields = document.getElementById('bloc_matiere').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField1 = newFields.childNodes;
for (var i=0;i<newField1.length;i++) {
var theName1 = newField1[i].name;
newField1[i].name = theName1 + counter;
}
}
Le problème, comme d'habitude, c'est que ça marche du tonnerre sous FF et Chrome, mais pas sous IE... Apparemment, IE ne permet pas de changer l'attribut "name" d'un objet :-(
J'ai pourtant besoin de modifier les noms des champs, puisqu'il s'agit de les ajouter à un formulaire et de les traiter !
Ce manque d'IE vous a-t-il aussi gêné ? Auriez-vous une solution de remplacement pour le même effet ?
Merci bien !
5 réponses
Salut.
Essayes avec ceci dans ta boucle.
newField1[i].setAttribute("name", theName1 + counter);
J'ai fait des tests sur un autre exemple et la méthode en elle même fonctionne sous IE 6.1 . Mais peut être que ton problème se situe ailleurs.
Cdlt
IC
Essayes avec ceci dans ta boucle.
newField1[i].setAttribute("name", theName1 + counter);
J'ai fait des tests sur un autre exemple et la méthode en elle même fonctionne sous IE 6.1 . Mais peut être que ton problème se situe ailleurs.
Cdlt
IC
J'ai essayé ton astuce, mais ça ne fonctionne toujours pas. Pis, IE y trouve une erreur et FF ne veut plus l'interpréter...
Je peux confirmer que c'est bien de là que vient l'erreur, car si je supprime la ligne
j'ai bien l'ajout de mon bloc comme voulu (sous IE et FF), mais les clones ne sont pas renommés...
Une autre idée ?
Je peux confirmer que c'est bien de là que vient l'erreur, car si je supprime la ligne
newField1[i].name = theName1 + counter;
j'ai bien l'ajout de mon bloc comme voulu (sous IE et FF), mais les clones ne sont pas renommés...
Une autre idée ?
Toujours pas !
L'erreur vient du LHS (newField[i].name), en particulier de la propriété "name" qui semble non reconnue par IE.
N'existe-t-il pas une alternative à ce code ? C'est quand même fou que ce ne soit pas possible de changer le nom d'un champ !..
L'erreur vient du LHS (newField[i].name), en particulier de la propriété "name" qui semble non reconnue par IE.
N'existe-t-il pas une alternative à ce code ? C'est quand même fou que ce ne soit pas possible de changer le nom d'un champ !..
Salut,
J'ai peut être un début de réponse à ton problème.
J'ai recopié ton code pour le tester dans une page. J'ai créé un DIV qui contient 2 champs "input" avec comme nom champ1 et champ2. Je ne sais pas ce que contient ton DIV.
En fait dans mon cas, la propriété name est bien reconnu pour les input et le changement de nom fonctionne. Mais il y a deux autres éléments dans le tableau newField.
En fait tu as :
newField[0] => input
newField[1] => #text
newField[2] => input
newField[3] => #text
Les éléments #text ne supporte pas la propriété name et provoque l'erreur. Je pense qu'ils doivent correspondre à la valeur que le champ peut prendre, mais je ne suis pas sur de cela.
Peut être as tu aussi dans ton tableau des éléments que tu ne soupçonnes pas et qui ne sont pas compatibles avec la propriété name.
Peut être peux tu dans ta boucle afficher le type de chaque noeud rencontré au sein du tableau
for (var i=0;i<newField1.length;i++)
{
alert(newField1[i].nodeName);
var theName1 = newField1[i].name;
alert(theName1);
}
En ajoutant une condition sur le type de node au sein de la boucle, le code suivant fonctionne chez moi alors que sans la condition, il plantait :
var counter = 0;
function moreFields()
{
counter++;
var newFields = document.getElementById('bloc_matiere').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField1 = newFields.childNodes;
for (var i=0;i<newField1.length;i++)
{
if(newField1[i].nodeType == 1)
{
var theName1 = newField1[i].name;
alert(theName1);
newField1[i].name = theName1 + counter;
alert(newField1[i].name);
}
}
}
J'espère que cela pourra t'aider à résoudre ton pb.
Cordialement
IC
J'ai peut être un début de réponse à ton problème.
J'ai recopié ton code pour le tester dans une page. J'ai créé un DIV qui contient 2 champs "input" avec comme nom champ1 et champ2. Je ne sais pas ce que contient ton DIV.
En fait dans mon cas, la propriété name est bien reconnu pour les input et le changement de nom fonctionne. Mais il y a deux autres éléments dans le tableau newField.
En fait tu as :
newField[0] => input
newField[1] => #text
newField[2] => input
newField[3] => #text
Les éléments #text ne supporte pas la propriété name et provoque l'erreur. Je pense qu'ils doivent correspondre à la valeur que le champ peut prendre, mais je ne suis pas sur de cela.
Peut être as tu aussi dans ton tableau des éléments que tu ne soupçonnes pas et qui ne sont pas compatibles avec la propriété name.
Peut être peux tu dans ta boucle afficher le type de chaque noeud rencontré au sein du tableau
for (var i=0;i<newField1.length;i++)
{
alert(newField1[i].nodeName);
var theName1 = newField1[i].name;
alert(theName1);
}
En ajoutant une condition sur le type de node au sein de la boucle, le code suivant fonctionne chez moi alors que sans la condition, il plantait :
var counter = 0;
function moreFields()
{
counter++;
var newFields = document.getElementById('bloc_matiere').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField1 = newFields.childNodes;
for (var i=0;i<newField1.length;i++)
{
if(newField1[i].nodeType == 1)
{
var theName1 = newField1[i].name;
alert(theName1);
newField1[i].name = theName1 + counter;
alert(newField1[i].name);
}
}
}
J'espère que cela pourra t'aider à résoudre ton pb.
Cordialement
IC
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
vas voir cette autre methode la:
https://forums.commentcamarche.net/forum/affich-6431096-javascript-ajouter-des-champs-de-saisie
https://forums.commentcamarche.net/forum/affich-6431096-javascript-ajouter-des-champs-de-saisie