Bonjour,
Je souhaite réaliser une page dans laquelle la sélection d'un premier select permet de géréner l'affichage du second.
J'utilise pour cela l'Ajax mais mon problème est le suivant : lorsquel la taille de la liste générée est petite (par exemple 2 éléments), ça fonctionne très bien mais si la taille de la liste est importante (dans mon cas plus de 4000 éléments à afficher), le second select reste tout simplement vide.
Voici des fragments de mon code (je développe une application web en java) :
page jsp : code Ajax : fonction appelée lors du choix dans le 1er select :
Fonction appelée pour remplir le second select :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 var xhr1; function getContributorValues(rightcalculationmanagementid){ if (window.XMLHttpRequest) { xhr1 = new XMLHttpRequest(); } else if (window.ActiveXObject) { xhr1 = new ActiveXObject("Microsoft.XMLHTTP"); } xhr1.open("GET", 'statement.do?actionType=SETCONTRIBUTOR&rightcalculationmanagementid='+rightcalculationmanagementid); xhr1.onreadystatechange = function() { setContributorValues(xhr1); }; xhr1.send(null); }
code java dans ma classe Action pour alimenter la liste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function setContributorValues(xhr){ if(xhr.readyState == 4 && xhr.status == 200){ var sel = document.getElementById('contributoraccessidF').childNodes[0]; sel.options.length=0; var groups = xhr.responseXML.getElementsByTagName('contributor'); sel.options[0] = new Option('',0); for (var i=0;i<groups.length;i++){ name = groups[i].getElementsByTagName('name')[0].firstChild.nodeValue; value = groups[i].getElementsByTagName('value')[0].firstChild.nodeValue; sel.options[i+1] = new Option(name,value); } } }
Encore une fois, ceci fonctionne parfaitement si la taille de la liste est raisonnable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 StringBuffer sb = new StringBuffer(); sb.append("<?xml version='1.0' encoding='ISO-8859-1'?>"); sb.append("<contributors>"); //La liste contributors peut contenir plus de 4000 éléments for (Contributor contributor : contributors){ sb.append("<contributor>"); sb.append("<name>").append(contributor.getName()).append("</name>"); sb.append("<value>").append(contributor.getContributorid()).append("</value>"); sb.append("</contributor>"); } sb.append("</contributors>"); response.addHeader("Content-Type", "text/xml"); response.getWriter().write(sb.toString());
Mais alors, comment faut-il faire ?
Merci par avance pour votre aide et/ou suggestions.
Partager