Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/04/2011, 14h53   #1
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Par défaut insérer un champ formulaire entre balises en conservant les valeurs

Bonjour,

Je génère une page dynamique où peuvent s'enchasser plusieurs formulaires.

Comme c'est pas bien, et afin d'éviter les impairs, je me contente de positionner des balises span au moment du chargement de la page, là où un formulaire pourrait prendre place.

L'utilisateur rentre ses données. Le bouton d'envoi appelle alors une fonction js submit(id, target, method) censée générer le formulaire et le soumettre.

Problème : comment faire ?

J'ai commencé par innerHTML, mais il m'efface les données entrées par l'utilisateur.
Code :
1
2
3
4
5
submit(id, target, method) {
newspan = document.getElementById(id);
newspan.innerHTML = "<form id='"+id+"' action='"+target+"'
method='"+method+"'>"+newspan.innerHTML+"</form>";
}
Il paraît que les fonctions DOM marchent mieux. Mais je ne vois pas comment je pourrais m'en tirer.

Pour clarifier les idées, voici ce que j'ai initialement dans ma page :
Code :
1
2
3
4
5
6
7
<span id="idelement">
<div id='section1'>...
<div id='soussection'>
<input type='text' name='nom' >
<input type='button' action="submit('idelement', 'record.php', 'POST')">
</div></div>
</span>
Et ce que je veux, c'est ça (que le form soit avant ou après le span m'est évidemment égal) :
Code :
1
2
3
4
5
6
7
8
<span id="idelement">
<form id='idelement_form'>
<div id='section1'>...
<div id='soussection'>
<input type='text' name='nom' >
<input type='button' action="submit('idelement', 'record.php', 'POST')">
</div></div>
</form></span>
J'ai beau essayer avec appendChild, replaceChild, ça veut pas.
Et j'imagine que c'est pas si compliqué. Seulement, j'écris rarement du javascript.

Auriez-vous une idée ?

Merci d'avance et bonne journée,
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h18   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
les formulaires imbriqués sont à proscrire ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h32   #3
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Essaye ça :
Code :
1
2
3
4
5
6
7
8
var div = document.getElementById("section1");
var span = div.parentNode;
var formulaire = document.createElement("FORM");
formulaire.setAttribute("target", target);
formulaire.setAttribute("method", post);
// Surtout NE PAS mettre un id déjà existant.
forumlaire.appendChild(div);
span.replaceChild(formulaire, div);
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h33   #4
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Citation:
Envoyé par SpaceFrog Voir le message
les formulaires imbriqués sont à proscrire ...
... et c'est précisément pour ça qu'il me faut une fonction qui générera UN formulaire dans la page, un seul en lieu et place des multiples formulaires possibles...
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h34   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
http://www.developpez.net/forums/d53...mique+form+pas
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h59   #6
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
@Loceka

Merci pour la réponse. C'est peu ou prou ce que j'ai essayé de faire, à un détail près : j'ignore quel div viendra après le span. Par conséquent, je vise l'id et récupère ensuite le parent.

Voici le code de mon essai avec ta suggestion.
Code :
1
2
3
4
5
6
7
8
9
var oldspan = document.getElementById(id);
    oldspan.id = id+"_old"; // C'est bien cet id là qu'il fallait modifier ?
    var parent = oldspan.parentNode;
    var formulaire = document.createElement("FORM");
    formulaire.setAttribute("id", id+"_form");
    formulaire.setAttribute("target", target);
    formulaire.setAttribute("method", "POST");
    formulaire.appendChild(oldspan);
    parent.replaceChild(formulaire, oldspan);
Si je ne mets pas formulaire.appendChild(olspan), ça fonctionne sauf qu'évidemment, le formulaire est entièrement vide.

Avec appendChild(oldspan), la section entière disparaît, et aucun formulaire dans la page.

Edit : J'oubliais -> si je remplace par formulaire.appendChild(parent), ça ne va pas mieux...
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h28   #7
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Mmh... ça a l'air expert, un peu trop pour moi. Je crois que je me jetterai dedans si aucune solution plus simple ne se fait jour.

De mon côté, les champs existent déjà : il me faut juste insérer la balise form quelque part tout en conservant les valeurs entrées par l'utilisateur. C'est tout...

J'ai une solution "simplette" qui consisterait à mettre un <span> "début "et un <span> "fin" mais pour le coup, ça manque un peu d'élégance...
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h33   #8
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
ben sinon suffit de créer une balise form ...

puis de recupérer tous les champs et de les appender dans le form ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h42   #9
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Citation:
Envoyé par SpaceFrog Voir le message
ben sinon suffit de créer une balise form ...

puis de recupérer tous les champs et de les appender dans le form ...
C'est effectivement l'idée du code fourni par Loceka, mais testé sans succès. Peut-être la manière n'est-elle pas la bonne... mais d'accord avec toi : ça devrait être simple !
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h55   #10
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
Citation:
puis de recupérer tous les champs et de les appender dans le form ..
=> boucler sur et les appender tous sauf le type submit dans le nouveau form
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 17h21   #11
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : février 2010
Messages : 360
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Développeur
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2010
Messages : 360
Points : 545
Points : 545
Citation:
Envoyé par Chello Voir le message
@Loceka

Merci pour la réponse. C'est peu ou prou ce que j'ai essayé de faire, à un détail près : j'ignore quel div viendra après le span. Par conséquent, je vise l'id et récupère ensuite le parent.

Voici le code de mon essai avec ta suggestion.
Code :
1
2
3
4
5
6
7
8
9
var oldspan = document.getElementById(id);
    oldspan.id = id+"_old"; // C'est bien cet id là qu'il fallait modifier ?
    var parent = oldspan.parentNode;
    var formulaire = document.createElement("FORM");
    formulaire.setAttribute("id", id+"_form");
    formulaire.setAttribute("target", target);
    formulaire.setAttribute("method", "POST");
    formulaire.appendChild(oldspan);
    parent.replaceChild(formulaire, oldspan);
Si je ne mets pas formulaire.appendChild(olspan), ça fonctionne sauf qu'évidemment, le formulaire est entièrement vide.

Avec appendChild(oldspan), la section entière disparaît, et aucun formulaire dans la page.

Edit : J'oubliais -> si je remplace par formulaire.appendChild(parent), ça ne va pas mieux...
formulaire.appendChild attribue le span comme enfant du formulaire(et l'enlève donc de son parent original). La ligne suivante essaie de remplacer le span par le formulaire alors que le parent ne contient plus le span.
Donc un
Code javascript :
parent.appendChild(formulaire);
devrait suffire à la place du replaceChild
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 09h16   #12
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Ok, je crois que je vois l'erreur que j'ai commise, ainsi que la solution.
Merci à tous !
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 09h45   #13
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Je sens que je vais passer pour un gros lourdeau...

La création du formulaire, ça marche.
Le repositionnement au bon endroit dans la page, ça marche (j'ai dû générer un child spécial "id_content" pour résoudre la question).

Par contre, la fonction devrait immédiatement soumettre le formulaire. Or la fonction submit() n'a aucun effet, alors qu'elle fonctionnait auparavant.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
function submitform(id, target, method) {
   var idform = id+"_form";
    var child = document.getElementById(id+"_content"); // récupère le span contenu
    var parent = document.getElementById(id);
    var newform = document.createElement("FORM"); // Génère le formulaire
    newform.setAttribute("id", idform);
    newform.setAttribute("target", target);
    newform.setAttribute("method", method);
    newform.appendChild(child); // Ajoute le contenu au formulaire.
    parent.appendChild(newform); // Ajoute le formulaire au parent.
    document.forms[idform].submit(); // Soumet le formulaire
    //newform.submit(); // Autre fonction testée, sans succès.
}


Update : il semble le soumettre, mais pas à la bonne page et revient automatiquement sur la page de départ... Je creuse.
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 09h57   #14
Membre à l'essai
 
Inscription : novembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 91
Points : 20
Points : 20
Ce coup-ci, c'est bon.

Pour les curieux :
Code :
newform.setAttribute("target", target);
->
Code :
newform.setAttribute("action", target);
Chello est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h54.


 
 
 
 
Partenaires

Hébergement Web