28 votes

Le menu HTML Select ne répond plus au hasard

Je suis en train de vivre tout à fait une drôle de problème avec <select> menus. Quand je vais retourner à une page contenant un <select> après que j'ai cliqué en dehors (ou réduite) l' <select> parfois s'effondre et ne répond pas. J'ai vérifié l'ensemble de mon code, et il est 100% valide, ensuite j'ai vu cela sur d'autres sites.

J'ai vécu <select> menus de s'effondrer dans la dernière version de Safari (disponible pour OSX 10.6.8) ainsi que les dernières versions de Chrome et Firefox (testé à la fois sur Windows Vista et mac OSX 10.6.8). Curieusement je n'ai pas été en mesure de reproduire l' <select> effondrement de Chrome fonctionnant sur Windows 8... Une dernière curiosité: il semble que la longueur de l' <select> élément affecte la probabilité du menu s'effondrer (c'est-à-dire, le plus <option> éléments <select>, le plus elle est susceptible de s'effondrer. Parfois, un <select> menu va s'effondrer après sélection et cliqué de fois, parfois, il peut prendre 5 ou 6 tentatives.

Ma question est: Quelles sont les causes de cette <select> effondrement problème, et est-il connu contourner? Voir l'exemple de code ci-dessous, c'est très simple, mais l' <select> menu a néanmoins s'est effondré dans les navigateurs/systèmes d'exploitation je l'ai mentionné plus tôt. Merci à l'avance!

<!doctype html>
<html>
<head>
  <title>Select Test</title>
</head>

<body>
 <select name ="Test">
  <option value = "0">0</option>
  <option value = "1">1</option>
  <option value = "2">2</option>
  <option value = "3">3</option>
  <option value = "4">4</option>
  <option value = "5">5</option>
  <option value = "6">6</option>
  <option value = "7">7</option>
  <option value = "8">8</option>
  <option value = "9">9</option>
  <option value = "10">10</option>
  <option value = "11">11</option>
  <option value = "12">12</option>
  <option value = "13">13</option>
  <option value = "14">14</option>
  <option value = "15">15</option>
  <option value = "16">16</option>
  <option value = "17">17</option>
  <option value = "18">18</option>
  <option value = "19">19</option>
  <option value = "20">20</option>
  <option value = "21">21</option>
  <option value = "22">22</option>
  <option value = "23">23</option>
  <option value = "24">24</option>
  <option value = "25">25</option>
  <option value = "26">26</option>
  <option value = "27">27</option>
  <option value = "28">28</option>
  <option value = "29">29</option>
  <option value = "30">30</option>
  <option value = "31">31</option>
  <option value = "32">32</option>
  <option value = "33">33</option>
  <option value = "34">34</option>
  <option value = "35">35</option>
  <option value = "36">36</option>
  <option value = "37">37</option>
  <option value = "38">38</option>
  <option value = "39">39</option>
  <option value = "40">40</option>
  <option value = "41">41</option>
  <option value = "42">42</option>
  <option value = "43">43</option>
  <option value = "44">44</option>
  <option value = "45">45</option>
  <option value = "46">46</option>
  <option value = "47">47</option>
  <option value = "48">48</option>
  <option value = "49">49</option>
  <option value = "50">50</option>
  <option value = "51">51</option>
  <option value = "52">52</option>
  <option value = "53">53</option>
  <option value = "54">54</option>
  <option value = "55">55</option>
  <option value = "56">56</option>
  <option value = "57">57</option>
  <option value = "58">58</option>
  <option value = "59">59</option>
  <option value = "60">60</option>
  <option value = "61">61</option>
  <option value = "62">62</option>
  <option value = "63">63</option>
  <option value = "64">64</option>
  <option value = "65">65</option>
  <option value = "66">66</option>
  <option value = "67">67</option>
  <option value = "68">68</option>
  <option value = "69">69</option>
  <option value = "70">70</option>
  <option value = "71">71</option>
  <option value = "72">72</option>
  <option value = "73">73</option>
  <option value = "74">74</option>
  <option value = "75">75</option>
 </select>
 </body>
</html>

Mise à jour: Voici une capture d'écran d'un effondrement de l'/ne répond plus <select> menu Safari 5.1.9 fonctionne sur OSX 10.6.8 (c'est un mac autre que celui que j'utilisais avant). Il est devenu insensible au bout de 3 tentatives (sélectionner une option, puis en cliquant sur sortir du navigateur). Il ne révèle pas la liste des options, lorsque vous cliquez dessus, et est complètement insensible jusqu'à ce que la page est rechargée. Je vais être le téléchargement de google chrome sur mac peu de temps.

Screenshot

Mise à jour 2: Selon @webdad3, ce problème est également présent dans IE9

Mise à jour 3:

Voici un lien vers le code source que j'ai posté ci-dessus, mais dans JSbin. Gracieuseté de @starbeamrainbowlabs.

http://jsbin.com/eXOMeRI/1/edit

Mise à jour 4:

Selon @Zarazthuztra, ce problème est également présent dans OS x 10.8.

Mise à jour 5:

Je prends @cloudcoder2000 des conseils et de l'affichage de ce lien dans la question elle-même. Je crois qu'il montre qu'un <select> ne devrait pas s'effondrer (comme beaucoup d'entre nous connaissent) quel que soit le nombre d' <option>s il contient.

Est-il un nombre maximum d'options (les valeurs) en HTML déroulant contrôle?

Je tiens aussi à remercier tout le monde pour leur aide jusqu'à présent.

Jour 6: Je crains que cette question commence à stagner... Si quelqu'un a des théories sur ce qui est à l'origine de ce problème (indépendamment de la façon dont "off-the-wall" il peut sembler) faites le moi savoir et je vais le tester dès que possible.

Jour 7: Juste de confirmer: j'ai connu ce effondrement problème sur plusieurs pages que ne pas utiliser de Javascript. De plus, l'exemple de code que j'ai posté ci-dessus (qui ne contiennent pas de Javascript), s'est effondré, pour moi et quelques autres stackoverflow utilisateurs (à travers différents systèmes d'exploitation et navigateurs).

Jour 8:

@Capile a été en mesure de reproduire l'effondrement question dans Safari 7.0.1 fonctionnant sur Mac OS X 10.9.1.

Jour 9: En utilisant @Capile du code, j'ai été en mesure d'obtenir l' <select> à "développer" dans Safari 5.1.10 (fonctionne sur OSX 10.6.8). Veuillez lire sa réponse pour plus de détails. Je vais tester son code dans Chrome et Firefox plus tard aujourd'hui ou demain. C'est vraiment prometteur, je pense que nous nous approchons de la solution de ce. Je voudrais juste remercier tout le monde pour leur aide jusqu'à présent, les gars, vous êtes super!

Mise à jour 10: J'ai finalement eu la chance de tester @Capile du code de Chrome sur un de mes Snow Leopard (10.6.9) les machines. J'ai eu un peu de mal à obtenir le <select> à l'effondrement de ce temps, mais après quelques minutes d'essai, il l'a finalement fait. Après le collage, son code dans la console de l' <select> "uncollapsed" (c'est comme inélégante que possible). C'est assez curieux, parce que si cet "effondrement" problème est lié à niveau du système de collecte des ordures, alors on pourrait penser que l' <select> serait "l'effondrement" de façon assez constante sur tous les navigateurs, mais ce n'est pas le cas. J'ai testé une multitude de navigateurs (à travers de multiples systèmes d'exploitation) et <select> "effondrement" paraît extrêmement commun dans certains navigateurs (comme Safari)... je suis certes pas un expert programmeur donc je me trompe peut-être, mais en tout cas, je voulais juste mettre à jour cette question, de sorte que plus les esprits pourraient penser les nouvelles informations.

Mise à jour 11: J'ai juste ajouté une prime à cette question dans une tentative de générer plus d'intérêt (j'espère que cela aide). De toute façon, j'ai été en mesure d'obtenir l' <select> à s'effondrer dans la dernière version de Firefox (en cours d'exécution sur OSX 10.6.9) la nuit dernière. Je n'ai malheureusement pas la chance de tester @Capile du code de Firefox, mais je vais essayer de le faire aujourd'hui.

7voto

Capilé Points 631

Depuis l' <select> élément d'INTERFACE utilisateur est gérée par le système d'exploitation dans plusieurs navigateurs (ce qui rend leur style beaucoup plus compliqué, voire impossible), je suppose que c'est un bug au niveau de l'OS, ou un bug au niveau du navigateur qui se rapporte à certains OS de l'INTERFACE utilisateur de la fonctionnalité certainement pas un problème de la source HTML, ce qui est clair, simple et selon les spécifications).

Pour le navigateur, l' <select> élément est tout à fait normal: vous pouvez le voir à DOM, même manipuler (il écoute également à des événements en tant que bien). Si vous détacher et rattacher à la DOM, il fonctionne à nouveau normalement (ouvrir et activer la sélection). Si vous venez d'exécuter le code ci-dessous dans la fenêtre de la console, vous aurez à travailler de nouveau:

var s=document.getElementsByTagName('select'),
    i=s.length,
    a=document.createElement('div'),
    b;
while(i-->0) {
    s[i].parentNode.insertBefore(a, s[i]);
    b=s[i].parentNode.removeChild(s[i]);
    a.parentNode.insertBefore(b,a);
    a.parentNode.removeChild(a);
    b=null;
}

Ma conjecture est que lorsque le navigateur est floue, les éléments de l'INTERFACE utilisateur pourrait se faire attraper par une sorte d'OS garbage collector, et quand vous revenez sur le navigateur, il attend juste l'OS pour l'afficher à nouveau (mais il ne peut pas le trouver). Mais c'est juste une supposition - que j'avais besoin de profil Safari mémoire dans l'ordre à vraiment l'obtenir.

J'ai pu le reproduire sur Safari 7.0.1 fonctionnant sur Mac OS X 10.9.1, mais n'a pas pu le reproduire sur Firefox 28.0a2 (Aurora) ou Chrome 34 (Canaries).

1voto

troglodite Points 935

Comme mentionné dans les commentaires, il semble que ce décalage. Si elle est causée par les spécifications de votre ordinateur, le navigateur, les plugins/extensions, ou d'autre chose sur la page, vous ne pouvez pas mettre 75 options d'un select et attendre Safari et IE à suivre. Je ne suis pas sûr si gal pourrait causer une page de gel et de forcer l'utilisateur à recharger, mais honnêtement, je ne sais pas quoi d'autre pourrait être en cause.

Je ne suis pas vraiment sûr où vous auriez besoin d'un select avec 75 options, mais si vous ne vraiment besoin, je vous recommande une simple saisie de texte où vous limiter à ce que l'utilisateur peut d'entrée de 1 à 75. Oui, ce n'est pas exactement aussi simple et élégant comme un menu déroulant, sélectionnez, mais il va faire le travail, et vous ne devriez pas avoir à vous soucier des problèmes.

1voto

Henry Blyth Points 605

Aaaahhhh, c'est un long shot, mais ...

Essayez de supprimer les espaces dans vos attributs HTML (pas à l'intérieur des guillemets), afin que value = "0" devienne value="0" .

1voto

Lucas Points 658

J'ai vu un comportement similaire avec l'élément select mais ce n'était généralement pas la cause du problème. Si les composants de base du navigateur sont en retard, c'est généralement parce qu'il y a un long script en arrière-plan qui consomme toutes les ressources du navigateur. La page que vous avez collée est-elle au-dessus de la page entière ou y a-t-il également un javascript important en cours d'exécution sur la page?

1voto

Marlo C Points 358

Trouvez le navigateur qui fonctionne pour vous en attendant une mise à jour / patch. Chaque fois que je rencontre un problème de navigateur, je bascule généralement entre Firefox, Google Chrome et IE.

En ce qui concerne votre code, je suggère de regarder en JavaScript, ce qui devrait vous faciliter la vie en transformant tous ces <option> codés en dur en quelque chose de dynamique. Quelque chose comme:

 // Starting from index 0, 
// create an <option> with the value of the current index
// keep creating <option> until you hit index 75.
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X