2010-07-28 5 views
0

J'ai une liste de sélection avec des nombres dedans. Ces chiffres vont de 0 à 30. Je veux cacher les nombres en fonction du nombre de jours en dehors de la date actuelle et de la date définie par l'utilisateur.Comment faire pour que cela fonctionne dans tous les navigateurs autres que Firefox

Donc, si aujourd'hui est le 28 juillet 2010 et qu'ils se fixent le 29 juillet 2010, il ne devrait afficher que "0".

Si c'était Juillet 28 2010 et ils ont mis en 20ème Septembre 2010, il devrait montrer 0 à 30.

J'ai donc ce

var selectedDate = new Date($('#TextBox').val().replace(/\/(\d\d)$/, "/20$1")); 
    var currentDate = new Date(); 

    var month = currentDate.getMonth() + 1 
    var day = currentDate.getDate() 
    var year = currentDate.getFullYear() 

    currentDate = new Date(month + "/" + day + "/" + year); 


    if (isNaN(selectedDate) == false) 
    { 
     $('#selectList').find('select').attr('disabled', ''); 

     var diffDays = parseInt((selectedDate - currentDate)/(1000 * 60 * 60 * 24)); 

     var Options = $('#selectList').find('option'); 

     jQuery.each(Options, function (i, value) 
     { 
      var currentValue = $(this).val(); 
      if (currentValue == -1) 
      { 
       // equal to continue; 
       return true; 
      } 
      else if (currentValue >= diffDays) 
      { 
       $(this).hide(); 
      } 
      else 
      { 
       $(this).show(); 
      } 
     }); 
    } 

Ce code se produit sur le changement de la zone de texte où l'utilisateur sélectionnerait une date.

Cela fonctionne très bien dans FireFox mais ne fonctionne pas dans les autres navigateurs. Je ne sais pas pourquoi. Aucune erreur n'est affichée dans l'un des navigateurs.

+0

avez-vous essayé 'currentDate = nouvelle date (année, mois-1, jour);' ?? – Pointy

+0

Je ne suis pas sûr que 'isNaN()' fonctionne sur les dates construites en utilisant 'new Date()'. Il devrait certainement fonctionner sur les horodateurs construits en utilisant 'Date.parse()'. Après avoir vérifié 'isNaN()' sur cela, vous pouvez ensuite créer la date en utilisant 'new Date (timestamp)'. –

Répondre

3

Vous ne pouvez pas cacher/montrer <option> éléments comme cette croix-navigateur, vous devez soit avoir une sauvegarde/cachés <select> et copier uniquement les <option> éléments que vous voulez à chaque fois, ou simplement désactiver les <option> éléments que vous n » Je veux être sélectionnable, cela les laissera cependant visibles.

Le bit de clonage ressemblerait à quelque chose comme ceci:

var hiddenSelect = $("#selectList").find('select').clone(); 
var selectedDate = new Date($('#TextBox').val().replace(/\/(\d\d)$/, "/20$1")); 
var currentDate = new Date(); 

var month = currentDate.getMonth() + 1 
var day = currentDate.getDate() 
var year = currentDate.getFullYear() 

currentDate = new Date(month + "/" + day + "/" + year); 


if (isNaN(selectedDate) == false) { 
    $('#selectList').find('select').attr('disabled', ''); 
    var diffDays = parseInt((selectedDate - currentDate)/(1000 * 60 * 60 * 24)); 

    var select = $('#selectList').find('select').empty(); 
    hiddenSelect.children().each(function(i, value) { 
     if (value == -1) { 
      return true; 
     } 
     else if (currentValue < diffDays) { 
      $(this).clone().appendTo(select); 
     }  
    }); 
} 

Nous sommes juste garder une copie clonée de l'original dans une variable appelée hiddenSelect, vidant (via .empty()) les options sur le visible dans l'interface utilisateur, et en boucle à travers/clonage les options que vous veulent pour voir de nouveau dans cette sélection visible.

+0

Hmm intéressant. Comment puis-je cloner si j'avais 5 selectLists (tous les 0 à 30), comment pourrais-je faire celui-là? Dois-je faire une boucle autour de la hiddenSelect.children() – chobo2

+0

@ chobo2 - Si ce sont les mêmes options (texte/valeur) dans chaque sélection, oui, vous pouvez stocker un clone de l'un d'entre eux une seule fois et en boucle par le même cloné '