2011-01-24 8 views
0

Je fais une simple comparaison de nombres sur l'événement keyUp d'un champ de saisie. Pour une raison quelconque, je n'obtiens pas le résultat escompté, et je n'arrive pas à comprendre pourquoi. Ce qui devrait arriver est que si le nombre entré par l'utilisateur est plus grand que celui stocké dans l'attribut html, l'arrière-plan devrait virer au rouge, sinon il reste blanc. En entrant simplement '9', l'arrière-plan deviendra rouge. ??javascript renvoie le résultat inattendu

var admin = $('input[name="diskStorage"]').attr('data-adminstorage'); // 2097152000 

$('#new-user input[name="diskStorage"]').keyup(function(){ 

    if(admin < $(this).val()) 
     $(this).css('background','red'); 
    else 
     $(this).css('background','white'); 
}); 

Quand je déboguer ces valeurs, if(2097152000 < 549) est vrai retournaient. Voici le html, en cas qui fait toute la différence:

<form action="administrate.php" method="post" id="new-user"> 
<table><tbody><tr> 
... 
    </tr><tr> 
    <td>Disk Storage Limit:</td> 
    <td> 
    <input type="text" data-adminStorage="2097152000" name="diskStorage" value="" /> megaBytes<br /> 
    <span id="info"></span></td> 
... 
    </tr></tbody></table> 

Ici, il est en direct: http://jsfiddle.net/JMC_Creative/dqAJj/2/

Répondre

2

.attr et .val() retour String objets - utiliser l'opérateur + unaire pour le convertir en une valeur numérique.

var admin = $('input[name="diskStorage"]').attr('data-adminstorage'); 
admin = +admin; 

if(admin < +$(this).val()) { 
    //... 
} 
+0

Unary '+' est un meilleur moyen que 'parseInt (str, 10)' à mon avis. Exemple: '+ str' au lieu de' parseInt (str, 10) '. – Reid

+0

@Reid En quoi est-ce "meilleur"? –

+0

Ce n'est pas vrai. ''2097152000' <'549'' est parfaitement valide et donne' true'. –

0

Essayez d'ajouter un /1 après avoir récupéré la valeur d'administration, pour en faire un numéro pas une chaîne .

var admin = $('input[name="diskStorage"]').attr('data-adminstorage')/1; 

Edit: aussi sur le this.val:

$(this).val()/1; 
+0

Il y a 'parseInt (str, 10)' pour cela .. pas besoin d'utiliser hacks comme ça (ils sont très susceptibles de causer des mauvaises choses en JavaScript) – ThiefMaster

+0

oui je sais , mais je ne vois pas comment cela pourrait causer une mauvaise chose, dans un scénario d'erreur, les deux vont retourner 'NaN' – JCOC611

+0

' parseInt' est plus clair que '/ 1', donc je le préfère. –

0

Ils sont probablement les deux chaînes. Vous devez les convertir en nombres premiers:

var admin = Number($('input[name="diskStorage"]').attr('data-adminstorage')); // 2097152000 

$('#new-user input[name="diskStorage"]').keyup(function(){ 

    if(admin < Number($(this).val())) 
     $(this).css('background','red'); 
    else 
     $(this).css('background','white'); 
});