cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012
-
22 févr. 2007 à 10:50
cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012
-
23 févr. 2007 à 00:56
Je cherche à faire disparaître et à faire ré-apparaître dynamiquement des éléments d'une optgroup d'une liste en fonction d'une autre liste.
Exemple : Lorsqu'on clique sur une ou plusieurs fonction(s) la liste des Contacts se raffraichit pour ne laisser que les contacts ayant cette ou ces fonction(s) !
1) liste des contacts organisées par différents groupes :
ListeContacts :
Membre du bureau
Client
Visiteur
...
Liste des fonctions organisées par différents groupes :
Poste de Direction
Marketing
...
Il y a un début de code mais je ne sais pas si je suis sur la bonne piste !
voir le script : OptGroup1 de PetoleTeam en bas de page
Questions :
Peut-on griser l'élément séléctionné plutôt que de l'effacer ?
Sinon j'ai essayé de le faire disparaître totalement, mais je m'embrouille (voir le script : Optgroup5) !
function hide(_id, _type,_ids){
var ctrl = document.getElementById(_id);
if ( ctrl.listChilds == null){
ctrl.listChilds = new Array();
var ctrlsChilds = ctrl.getElementsByTagName("OPTGROUP");
for ( var i = 0; i < ctrlsChilds.length; i++){
var clone = ctrlsChilds[i].cloneNode(true);
clone._id = clone.id;
clone.id =null;
var childs = clone.getElementsByTagName ("OPTION");
for ( var j = 0; j< childs.length; j++){
childs[j]._id = childs[j].id;
childs[j].id = null;
}
ctrl.listChilds.push (clone );
}
}
var typeObj = ctrl.getElementsByTagName (_type);
for ( var i =0 ; i < _ids.length; i++){
for ( var j = 0; j < typeObj.length; j++){
if ( typeObj[j]. label == _ids[i] ){
typeObj[j].parentNode.removeChild ( typeObj[j] );
}
}
}
}
function showAll (_id ){
var ctrl = document.getElementById(_id);
// réinitialise le composant.
ctrl.innerHTML = "";
// ajoute tous ces fils
for ( var i = 0; i < ctrl.listChilds.length; i++){
var ret = ctrl.appendChild ( ctrl.listChilds[i]) ;
// réattribut l'id
ret.id = ret._id;
// fais de même pour ces fils
for ( var j = 0; j < ret.childNodes.length; j++){
if ( ret.childNodes[j]._id != null )
ret.childNodes[j].id = ret.childNodes[j]._id;
}
}
ctrl.listChilds = null;
}
function Trier(){
var selectione="";
for (i=0; i<document.getElementById('sel').options.length; i++) {
if (!document.getElementById('sel').options[i].selected ) {
selectione += "'" + document.getElementById('sel').options[i].label + "',";
}
}
var sSelection = selectione.substr(0,selectione.length - 1)
var ctrl = document.getElementById('sel0');
if ( ctrl.listChilds != null){
showAll('sel0')
}
hide('sel0','OPTION',eval("[" + sSelection + "]"))
}
</script>
</HEAD>
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 22 févr. 2007 à 11:15
Bonjour,
pour cacher/montrer
avec FireFox ( et consors ) "il suffit" de faire document.getElementById("id de optgroup").style.display= "none" ou "inline"
ça semble ne pas fonctionner pas avec IE ?
cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012 22 févr. 2007 à 11:21
Mais comment le faire ré-apparaître a ça place ?
Vois l'exemple (OptGroup1) qui supprime et fait ré-apparaître le texte mais ne supprime pas la ligne comme tu le fait dans ton exemple. Peut-on mixer les deux script ?
D'avance merci.
Fabiano13
function OptGroup1(id_){
var q=document.getElementById(id_);
if(!q.Sauve) q.Sauve = q.text; // sauve le texte initial
if(q){
if( q.text == ''){ // si text effacé
q.text=q.Sauve; // on le restaure
q.disabled = false;
}
else{
q.text=''; // sinon on l'efface
q.disabled = true;
}
}
}
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 22 févr. 2007 à 11:38
ah, c'est vrai, j'ai oublié qu'il fallait remettre...
à mon humble avis, passer par ce qui est ...Child
( appendChild, removeChild, insertBefore... )
<hr />
Zobibol
Messages postés469Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention20 février 20176 22 févr. 2007 à 12:31
Bien le bonjour, je suis donc repartis de ce qu'a fait Bultez... et de l'idée des removeChilds, insertBefore....
et du coup je suis arrivé sur une nouvelle piste ( qui semble donner de bon résultat...)
ci-joint le code:
function enlever(quoi, ou)
{
// si toute fois il éxiste un option groupe de caché ( display none ) stocké dans la variable removeSel du body
// alors on le remontre ( au cas ou )
if ( document.body.removeSel != null )
remettre (ou);
// récupère tous les optgroup du sel
var optGroups = document.getElementById("sel").getElementsByTagName ("OPTGROUP");
for ( var i =0; i < optGroups.length; i++){
if ( optGroups[i].id == quoi ){
// le stock dans le body
document.body.removeSel = document.getElementById(quoi);
// stock l'index dans une variable du body.
document.body.removeSel.indexPos = i;
// l'enlève
document.getElementById(ou).removeChild ( document.body.removeSel );
return;
}
}
}
/**
* Réaffiche le contrôle caché
* @param ou
* id du sel auquel remettre le block caché
*/
function remettre (ou){
// parcours les fils ( optGroup du select ) jusqu'à l'index du dernier enlevé.
var optGroups = document.getElementById("sel").getElementsByTagName ("OPTGROUP");
var i= 0;
while ( i <document.body.removeSel.indexPos)
i++;
Zobibol
Messages postés469Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention20 février 20176 22 févr. 2007 à 12:50
En fait, y a encore une petite chose ( que j'ai oublié mais en même temps, je vais pas tout faire ;o))
il faut réinitialisé document.body.removeSel à null dans la méthode remettre, ça ne pose pas de problème, mais c'est plus propre...
Maintenant, savoir si ça réponds aux attentes, la est la question.
Zobibol
Messages postés469Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention20 février 20176 22 févr. 2007 à 13:39
Oui on peux, il faut adapter les traitements sur enlever qui devra accepter une liste d'id à caché
du coup ( après optimisation des traitements on aurait )
<HTML>
<HEAD>
<TITLE></TITLE>
<script type="text/javascript">
/**
* Enlève
*
* @param quois
* array contenant les id à enlever.
* @param ou
* dans quel select.
*/
function enlever(quois, ou)
{
// quel select ?
var sel = document.getElementById(ou);
// si toute fois il éxiste un option groupe de caché ( display none ) stocké dans la variable removeSel du body
// alors on le remontre ( au cas ou )
if ( sel.removeSel != null )
remettre (ou);
// récupère tous les optgroup du sel
var optGroups = sel.getElementsByTagName ("OPTGROUP");
for ( var j =0; j < quois.length; j++){
var quoi = quois[j];
for ( var i =0; i < optGroups.length; i++){
if ( optGroups[i].id == quoi ){
// si pas de contrôle sélectionné alors on créé un nouvel enregistrement.
if ( sel.removeSel == null )
sel.removeSel = new Array();
// stock l'index sur le contrôle à supprimer.
document.getElementById(quoi).indexPos = i;
// le stock dans le body sous forme d'array
sel.removeSel.push( document.getElementById(quoi) );
}
}
}
//et enfin, les supprimes
for ( var i = 0; i < sel.removeSel.length; i++)
document.getElementById(ou).removeChild ( sel.removeSel[i]);
}
/**
* Réaffiche le contrôle caché
* @param ou
* id du sel auquel remettre le block caché
*/
function remettre (ou){
// le select en cours.
var sel = document.getElementById(ou);
// si il y a des infos caché...
if ( sel.removeSel != null){
// listes les contrôles supprimer
var quois = sel.removeSel;
// parcours les fils ( optGroup du select ).
var optGroups = document.getElementById(ou).getElementsByTagName ("OPTGROUP");
for ( var j = 0; j < quois.length; j++){
// insère le contrôle
document.getElementById(ou).insertBefore( quois[j], optGroups[quois[j].indexPos]);
}
// supprime l'enregistrement.
sel.removeSel = null;
}
}
<select size=16
id="sel0">
<optgroup id="g10" label="un" style="background-color:#FFFFAA">
<option>a</option>
<option>b</option>
</optgroup>
<optgroup id="g20" label="deux" style="background-color:#AAFFFF">
<option>c</option>
<option>d</option>
<option>e</option>
<option>f </option>
</optgroup>
<optgroup id="g30" label="trois" style="background-color:#FFAAFF">
<option>g</option>
<option>h</option>
<option>i</option>
</optgroup>
</select>
enlever "deux" enlever "un" enlever "un et deux" enlever "un et trois de sel0" remettre remettre sel 0
</HTML>
Du coup, maintenant il est possible d'avoir plusieur select différent.
De plus j'ai un peu optimiser le code ( y a des jours ou je me demande bien à quoi je pense ).
Le petit inconvénient, c'est le passage des paramètres à la méthode enlever ( [..., ..., ...], "") voilà voilà
Zobibol
Messages postés469Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention20 février 20176 22 févr. 2007 à 16:02
Alors la, je me dis bravo à moi même personnellement
après moults tests dans tous les sens possibles, je te propose cette solution
<HTML>
<HEAD>
<TITLE></TITLE>
<script type="text/javascript">
/**
* Cache les contrôle de type _type dans le contrôle _id
*
* @param _id
* identifiant du select
* @param _type
* type de contrôle à cacher
* soit OPTGROUP
* soit OPTION
* @param _ids
* identifiants ( sous forme d'array à cacher )
*/
function hide ( _id, _type,_ids){
// verifie si _id à bien une valeur dans la liste de ces fils
var ctrl = document.getElementById(_id);
// si listChilds est null on le renseigne avec tous ses fils.
if ( ctrl.listChilds == null){
// création d'un nouvel enregistrement
ctrl.listChilds = new Array();
// récupère tous les optgroup
var ctrlsChilds = ctrl.getElementsByTagName("OPTGROUP");
// et les stocks dans le tableau.
for ( var i = 0; i < ctrlsChilds.length; i++){
// stock l'id pour une sauvegarde et le détruit
var clone = ctrlsChilds[i].cloneNode(true);
clone._id = clone.id;
clone.id =null;
// fait de même avec tous les fils de celui ci
var childs = clone.getElementsByTagName ("OPTION");
for ( var j = 0; j< childs.length; j++){
childs[j]._id = childs[j].id;
childs[j].id = null;
}
ctrl.listChilds.push (clone );
}
}
// récupère la liste des composants de type _type
var typeObj = ctrl.getElementsByTagName (_type);
// parcours l'ensemble des ids passer en paramètre et les supprimes
for ( var i =0 ; i < _ids.length; i++){
// parcours l'ensemble des contrôles trouvés
for ( var j = 0; j < typeObj.length; j++){
// si les id sont identiques alors on le supprime
if ( typeObj[j].id == _ids[i] ){
typeObj[j].parentNode.removeChild ( typeObj[j] );
}
}
}
}
/**
* Tout afficher
*
* @param _id
* identifiant du select ou il faut tout afficher
*/
function showAll (_id ){
var ctrl = document.getElementById(_id);
// réinitialise le composant.
ctrl.innerHTML = "";
// ajoute tous ces fils
for ( var i = 0; i < ctrl.listChilds.length; i++){
var ret = ctrl.appendChild ( ctrl.listChilds[i]) ;
// réattribut l'id
ret.id = ret._id;
// fais de même pour ces fils
for ( var j = 0; j < ret.childNodes.length; j++){
ret.childNodes[j].id = ret.childNodes[j]._id;
}
}
ctrl.listChilds = null;
}
<select size=16
id="sel0">
<optgroup id="g10" label="un" style="background-color:#FFFFAA">
<option id="a1" >a</option>
<option id="b1" >b</option>
</optgroup>
<optgroup id="g20" label="deux" style="background-color:#AAFFFF">
<option id="c1" >c</option>
<option id="d1" >d</option>
<option id="e1" >e</option>
<option id="f1" >f </option>
</optgroup>
<optgroup id="g30" label="trois" style="background-color:#FFAAFF">
<option id="g1" >g</option>
<option id="h1" >h</option>
<option id="i1" >i</option>
</optgroup>
</select>
cacher le block 1 et 3 de sel0 cache les options a1, g1 et f1 cacher le block 2 de sel montrer sel montrer sel0
</HTML>
cette fois ci, j'ai décidé de refondre les méthodes correctements:
la méthode hide accepte trois paramètre :
- l'id du select auquel il faut cacher des contrôles
- le type de contrôle à cacher ( "OPTGROUP" ou "OPTION" )
- les ids ( sous forme d'array ) des contrôles à cacher.
la méthode showAll accepte un paramètre l'id du contrôle qu'il faut remontrer.
voilà ceci te convient-il ?
si toute fois tu as besoin de précision, je suis à ta disposition
cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012 22 févr. 2007 à 16:21
C'est pour mon mémoire de fin d'année. Master II en informatique (Sciences de l'Information et des Systèmes).
Pour revenir au code, quand tu supprimes avec le bouton "cache les options a1, g1 et f1" ça marche très bien. Cependant quand tu veux réitialiser avec le bouton (montrer sel) ou avec l'autre ça ne marche pas !
Zobibol
Messages postés469Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention20 février 20176 22 févr. 2007 à 16:33
En effet, j'ai oublié un petit quelque chose du nom d'internet explorer.....
parce que ça fonctionne bien avec FF
du coup je suis en train de regarder quoi qui va pas j'y suis presque y a juste un petit soucis....
remplace la méthode showAll par celle-ci
/**
* Tout afficher
*
* @param _id
* identifiant du select ou il faut tout afficher
*/
function showAll (_id ){
var ctrl = document.getElementById(_id);
// réinitialise le composant.
ctrl.innerHTML = "";
// ajoute tous ces fils
for ( var i = 0; i < ctrl.listChilds.length; i++){
var ret = ctrl.appendChild ( ctrl.listChilds[i]) ;
// réattribut l'id
ret.id = ret._id;
// fais de même pour ces fils
for ( var j = 0; j < ret.childNodes.length; j++){
if ( ret.childNodes[j]._id != null )
ret.childNodes[j].id = ret.childNodes[j]._id;
}
}
ctrl.listChilds = null;
}
il y a un petit soucis, le style appliqué à l'entête ( "un", "deux" et "trois") ne s'applique pas au bloc lors de la reconstruction.
function hide(_id, _type,_ids){
var ctrl = document.getElementById(_id);
if ( ctrl.listChilds == null){
ctrl.listChilds = new Array();
var ctrlsChilds = ctrl.getElementsByTagName("OPTGROUP");
for ( var i = 0; i < ctrlsChilds.length; i++){
var clone = ctrlsChilds[i].cloneNode(true);
clone._id = clone.id;
clone.id =null;
var childs = clone.getElementsByTagName ("OPTION");
for ( var j = 0; j< childs.length; j++){
childs[j]._id = childs[j].id;
childs[j].id = null;
}
ctrl.listChilds.push (clone );
}
}
var typeObj = ctrl.getElementsByTagName (_type);
for ( var i =0 ; i < _ids.length; i++){
for ( var j = 0; j < typeObj.length; j++){
if ( typeObj[j].id == _ids[i] ){
typeObj[j].parentNode.removeChild ( typeObj[j] );
}
}
}
}
function showAll (_id ){
var ctrl = document.getElementById(_id);
// réinitialise le composant.
ctrl.innerHTML = "";
// ajoute tous ces fils
for ( var i = 0; i < ctrl.listChilds.length; i++){
var ret = ctrl.appendChild ( ctrl.listChilds[i]) ;
// réattribut l'id
ret.id = ret._id;
// fais de même pour ces fils
for ( var j = 0; j < ret.childNodes.length; j++){
if ( ret.childNodes[j]._id != null )
ret.childNodes[j].id = ret.childNodes[j]._id;
}
}
ctrl.listChilds = null;
}
function Trier(){
var selectione="";
for (i=0; i<document.getElementById('sel').options.length; i++) {
if (!document.getElementById('sel').options[i].selected ) {
selectione += "'" + document.getElementById('sel').options[i].label + "',";
}
}
var sSelection = selectione.substr(0,selectione.length - 1)
var ctrl = document.getElementById('sel0');
if ( ctrl.listChilds != null){
showAll('sel0')
}
hide('sel0','OPTION',eval("[" + sSelection + "]"))
}
</script>
</HEAD>
cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012 23 févr. 2007 à 00:56
Haïïïiiii
Je me suis trop précipité !!!
Peux tu faire le test dans cette ordre :
Selection dans la colonne de gauche :
A
B
C
D
Tu notera que lorsque tu fais une sélection simple le c (B) pose problème ! Surement par ça position !
En choix multiple ça ne pose aucun problème si ce n'est que lorsqu'il en reste qu'un le c (B) reste !
function hide(_id, _type,_ids){
var ctrl = document.getElementById(_id);
if ( ctrl.listChilds == null){
ctrl.listChilds = new Array();
var ctrlsChilds = ctrl.getElementsByTagName("OPTGROUP");
for ( var i = 0; i < ctrlsChilds.length; i++){
var clone = ctrlsChilds[i].cloneNode(true);
clone._id = clone.id;
clone.id =null;
var childs = clone.getElementsByTagName ("OPTION");
for ( var j = 0; j< childs.length; j++){
childs[j]._id = childs[j].id;
childs[j].id = null;
}
ctrl.listChilds.push (clone );
}
}
var typeObj = ctrl.getElementsByTagName (_type);
for ( var i =0 ; i < _ids.length; i++){
for ( var j = 0; j < typeObj.length; j++){
if ( typeObj[j].label == _ids[i] ){
typeObj[j].parentNode.removeChild ( typeObj[j] );
}
}
}
}
function showAll (_id){
var ctrl = document.getElementById(_id);
// réinitialise le composant.
ctrl.innerHTML = "";
// ajoute tous ces fils
for ( var i = 0; i < ctrl.listChilds.length; i++){
var ret = ctrl.appendChild ( ctrl.listChilds[i]) ;
// réattribut l'id
ret.id = ret._id;
// fais de même pour ces fils
for ( var j = 0; j < ret.childNodes.length; j++){
if ( ret.childNodes[j]._id != null )
ret.childNodes[j].id = ret.childNodes[j]._id;
}
}
ctrl.listChilds = null;
}
function Trier(){
var selectione="";
for (i=0; i<document.getElementById('sel').options.length; i++) {
if (!document.getElementById('sel').options[i].selected ) {
selectione += "'" + document.getElementById('sel').options[i].label + "',";
}
}
var sSelection = selectione.substr(0,selectione.length - 1)
var ctrl = document.getElementById('sel0');
if ( ctrl.listChilds != null){
showAll('sel0')
}
hide('sel0','OPTION',eval("[" + sSelection + "]"))
}
</script>
</HEAD>