2009-04-24 9 views
2

Ce .show et .hide fonctionne très bien dans Firefox 3, mais pas dans IE 7. Lorsque je clique sur < dans la liste dans IE le cache se cache mais ne montre encore quand je sélectionne entre encore.JQuery .show ne fonctionne pas dans IE7

Ai-je fait quelque chose de mal?

<select id="lst" onchange="onselectchange();"> 
     <option>Between</option> 
     <option>&lt;</option> 
    </select> 
    &nbsp;&nbsp; 
    <span id="spanAnd">And</span> 

    <script type="text/javascript"> 
     function onselectchange() { 
      var lst = document.getElementById('lst'); 
      var sp = document.getElementById('spanAnd'); 
      if (lst.value == 'Between') { 
       $('#spanAnd').show(); 
      } 
      else { 
       $('#spanAnd').hide(); 
      } 
     } 
    </script> 

EDIT: J'ai essayé onclick et onchange.

+1

En outre, quelle est votre variable sp faire là-dedans? Vous ne l'utilisez jamais. –

+5

Ne blâmez pas jQuery pour ce qui pourrait être vos propres erreurs –

+1

Lorsque vous utilisez jQuery, il n'est plus nécessaire d'utiliser getElementById. utilisez un sélecteur $ ('# myId') – bendewey

Répondre

2

Essayez ceci (mettre ensemble des choses que j'ai laissé dans les commentaires à deux autres réponses):

<script type="text/javascript"> 
$(function() { 
    $("#lst").change(function() { 
    if ($("#lst").val() == 'Between') { 
     $('#spanAnd').show(); 
    } 
    else { 
     $('#spanAnd').hide(); 
    } 
    }) 
}); 
</script> 
0

Mise à jour: Pardonnez-moi si cette réponse est loin; Je ne suis pas un utilisateur jQuery. Ce sont mes pensées si:

lst.value n'est pas une manière valide d'accéder aux éléments dans un élément de sélection dans IE; (? Ou est-ce un truc jQuery) au moins, je ne l'ai jamais vu faire de cette façon

Pour ce faire, à la place:

if (lst.options[lst.selectedIndex].text == 'Between') { ... 

Notez également que je la propriété « texte », comme cela est la valeur entre les balises <option>. La propriété value est l'attribut supposé exister sur l'élément <option>, par exemple: <option value="0">Between</option>

+0

Je pense que $ ("# lst"). Val() devrait fonctionner dans tous les navigateurs. Si vous utilisez jquery, utilisez jquery *. :) – Kip

1

Essayez également d'utiliser jQuery pour rechercher et lire les éléments. Quelque chose comme ceci:

function onselectchange() { 
     var lst = $('#lst'); 
     var sp = $('#spanAnd'); 
     if ($(lst).val() == 'Between') { 
      $(sp).show(); 
     } 
     else { 
      $(sp).hide(); 
     } 
    } 
+0

Testé brièvement dans IE7 et semble fonctionner. – wows

+3

Il n'y a aucune raison (et en fait, je suis surpris que ça marche) de faire '$ (sp) .show()', par exemple, quand il s'agit déjà d'un objet jQuery. Vous transformez effectivement un objet jQuery en objet jQuery. Vous pouvez simplement utiliser 'sp.show()' – KyleFarris

+0

@KyleFarris, Bien que votre droite il n'y a aucune différence fonctionnelle dans le re-emballage d'un ensemble d'objets jquery. $ ($ ($ ($ (sp)))) fonctionne toujours correctement. – bendewey

0

Cela fonctionne dans IE et Firefox

<select id="lst" onchange="onselectchange();"> 
     <option>Between</option> 
     <option>&lt;</option> 
    </select> 

    <span id="spanAnd">And</span> 

    <script type="text/javascript"> 
     function onselectchange() { 
      if ($('#lst :selected').text() == "Between") { 
       $('#spanAnd').show(); 
      } 
      else { 
       $('#spanAnd').hide(); 
      } 
     } 
    </script> 
6

Utilisez la méthode bind jQuery sur chargement de la page ... il vous aidera abstrait votre logique d'interaction de votre logique de présentation.

<script type="text/javascript"> 
    $(function() { 
     $('#lst').bind('change',function() { 
      var sp = $('#spanAnd'); 
      if($(this).val() == 'Between') { 
       sp.show(); 
      } else { 
       sp.hide(); 
      } 
     }); 
    }); 
</script> 

C'est à peu près aussi simple que cela ...

REMARQUE: Je viens de remarquer que vous vérifiez le texte de l'option et non la valeur de la zone de sélection. Franchement, je pense que c'est idiot, mais si vous avez besoin de le faire pour une raison quelconque, vous pouvez le faire:

<script type="text/javascript"> 
    $(function() { 
     $('#lst').bind('change',function() { 
      var sp = $('#spanAnd'); 
      var selected_text = $(this).find('option:selected').html(); 
      // Possibly faster ways (thanks to bayard and bendewey): 
      /* 
      var selected_text = $("#lst option[value=" + $('#lst').val() + "]").text(); 
      // ... or ... 
      var selected_text = $("option[value="+$('#lst').val()+"]",this).text(); 
      // ... or even... 
      var selected_text = $(this).children('option[value="+$('#lst').val()+"]").text(); 
      */ 
      if(selected_text == 'Between') { 
       sp.show(); 
      } else { 
       sp.hide(); 
      } 
     }); 
    }); 
</script> 

Pour faire mon travail de suggestion originale, vous devez changer votre code HTML à:

<select id="lst" onchange="onselectchange();"> 
    <option value="Between">Between</option> 
    <option value="&lt;">&lt;</option> 
</select> 

... qui, comme je l'ai dit, semble un peu comme ce que vous voulez faire de toute façon.

+0

c'est génial, pas besoin du tout de gérer les événements dans le balisage! –

+0

btw, je pense que votre méthode est la mieux publiée, mais les docs jquery suggèrent d'utiliser ($ ('# id: selected'). Text() pour obtenir le texte de l'option par opposition à la valeur avec .val(). il n'y a pas de valeur d'option spécifiée, la valeur est considérée comme équivalente au texte d'option –

+2

+1 c'est comme ça que je le ferais en jQuery, je n'aime pas mélanger l'ancien avec le nouveau – bendewey

1

Il y a beaucoup de problèmes que vous avez là.

ne pas envelopper dans $ (document) .ready(); L'élément peut ne pas être chargé lorsque le script est exécuté.

Utilisation d'un nom de variable commençant par un nombre. (mauvais style et pas sûr que c'est même autorisé)

En utilisant le nom de variable qui correspond à l'ID d'un élément.

(Les anciennes versions de IE vous a permis d'utiliser ID.whatever sans appeler document.getElementById())

mélange jQuery/Standard DOM.

appel val() vous donne l'attribut de valeur d'option, pas le texte de l'option

<select id="first"> 
     <option value="between">Between</option> 
     <option>&lt;</option> 
    </select> 

    <span id="spanAnd">And</span> 

    <script type="text/javascript"> 
     $(document).ready(function(){ 

     $("#first").change(function(){ 

      if ($("#first").val() == 'between') { 
       $("#spanAnd").show(); 
      } 
      else { 
       $("#spanAnd").hide(); 
      } 

     }); 
     }); 
    </script> 
+0

$ (document) .ready (function() {...}); est la même que $ (function() {...}); – Jazzerus

Questions connexes