Contexte :
J'ai deux fenêtres distinctes :
- l'une parent qui contient une liste de personnes affectées à un événement (sous la forme d'une listbox),
- l'autre, enfant, qui contient une liste de personnes disponibles (sous la forme de cases à cocher),
Je souhaite que, lorsque l'utilisateur a sélectionné un certain nombre de personnes dans la fenêtre enfant, et qu'il clique sur le
bouton 'affecter', le traitement suivant s'exécute :
- pour chaque ligne de la fenêtre enfant, je vérifie si l'utilisateur à coché le nom de la personne considérée,
- si OUI,
1 - je lis ses références,
2 - je compare ses références avec la liste des personnes déjà affectées dans ma fenêtre parent (dans la listbox).
si cette personne n'a pas encore été affectée, je l'ajoute à ma liste des personnes affectées (dans ma fenêtre parent),
si cette personne a déjà été affectée, j'affiche un message indiquant que l'utilisateur X est déjà affecté.
- si NON, je passe à la ligne suivante.
Voici le script que j'ai produit :
function updatePeople() {
// Déclaration d'une variable pointant sur le tableau de valeurs de ma liste déroulante de ma fenêtre mère.
var listPeople = opener.document.EventForm.elements['people_pa[]'];
// Nombre de cases à cocher à parcourir dans ma fenêtre fille.
var nbrecord_i = parseInt(document.PeopleListForm.nbCheckBox.value);
// Dimension du tableau de valeurs de ma liste déroulante de ma fenêtre mère.
var nbpeople_i = listPeople.options.length - 1;
// Variable utilisée pour stocker le nom de la personne, dans le cas où elle aurait déjà fait l'objet d'une affectation
var people_s ='';
// Compteurs i_i et z_i
var i_i=0;
var z_i=0;
// Première boucle, parcours de l'ensemble des cases à cocher
for(i_i=0;i_i<nbrecord_i; i_i++){
// Si la case à cocher est cochée
if(eval('document.PeopleListForm.cb'+i_i).checked==true) {
// Lecture de la valeur contenue par la case à cocher (sous la forme NOM_PERSONNE#identifiant)
var a=eval('document.PeopleListForm.cb'+i_i).value;
// Décomposition de la valeur a (NOM_PERSONNE#Identifiant)
var value_a = a.split('#');
// Positionnement à faux (non encore affectée)
var found_b = false;
// Seconde boucle, vérification si le nom de la personne n'existerait pas déjà dans la listbox de la fenêtre mère.
for(z_i=0;z_i<nbpeople_i; z_i++){
// Lecture du nom de la personne dans la liste déroulante de la fenêtre mère.
var c = listPeople.options[z_i].text;
// Test comparatif si le nom n'est pas déjà connu.
if(c==value_a[0]) { found_b=true; people_s=c;}
}
// Si ne nom est inconnu, alors ajout
if(found_b==false){
// Déclaration d'un objet de liste.
var opt = new Option(value_a[0], value_a[1], true, true);
// Ajout de l'élément dans la listbox ---- C'est là que CA PLANTE SOUS IE !!!
listPeople.options[listPeople.options.length] = opt;
nbpeople_i = listPeople.options.length - 1;
} else { alert('Utilisateur ' + people_s + ' déjà affecté à cet événement !'); }
}
}
}
Il fonctionne très bien sous Netscape, mais pas sous IE5.5. Si quelqu'un à une idée.
Ce qui ne semble pas fonctionner c'est le fait d'ajouter un élément d'une liste déroulante d'une fenêtre parent à partir
d'un javascript contenu dans une fenêtre fille. Ca provoque une erreur de protection !