2013-02-21 1 views
1
function ValidateShippedQuantity() { 
    var shippedQty = jQuery("#txtShippedQuantity").val(); 
    shippedQty = shippedQty.toString(); 
    for (i = 0; i < shippedQty.length; i++) { 
     var c = shippedQty.charAt(i); 
     if (isNaN(c)) //(!(/^\d+$/.test(shippedQty))) 
     { 
      alert("Only Numeric Values Allowed"); 
      //x.focus(); 
      return false; 
     } 
    } 
    return true; 
} 

Я хочу проверить текстовое поле, содержащее только числовое значение. И вышеприведенная функция isNaN или/^ \ d + $ /. Test() не работает, поскольку она всегда возвращает false, что бы я ни вводил, например «1» или «10». Даже странно, isNaN работал некоторое время. И тогда это просто не сработало позже, независимо от того, что я расстроил, что я сделал.Моя проверка правильности номера функции не работает правильно

Кнопка, называемая функцией проверки, находится внутри Gridview.

<EditItemTemplate> 
<asp:LinkButton ID="btnUpdTrk" runat="server" Text="Update" CommandName="Update" 
    OnClientClick="javascript:return ValidateShippedQuantity();" CausesValidation="false" /> 
</EditItemTemplate> 

Текстовое поле из txtShippedQuantity,

<asp:TemplateField HeaderText="Shipped&nbsp;Qty"> 
    <ItemTemplate> 
    <asp:Label ID="lblShippedQuantity" runat="server" Text='<%#Eval("ShippedQuantity")%>'></asp:Label> 
    </ItemTemplate> 
    <EditItemTemplate> 
    <asp:TextBox runat="server" ID="txtShippedQuantity" Width="50px" Text='<%#Eval("ShippedQuantity")%>' /> 
    </EditItemTemplate> 
</asp:TemplateField> 

Для тех, кто имеет те же проблемы, ответ или решение ниже. Это настоящее счастье решить проблему самостоятельно после неутешительной процедуры. @cymen дает мне небольшую помощь. И я меняю одну строчку на свои коды.

 $(document).ready(function() { 
     $('#btnUpdTrk').on('click', ValidateShippedQuantity); 
     }); 
     function ValidateShippedQuantity() { 
     var shippedQty = document.getElementById('ContentPlaceHolder1_gvTrkInfo_txtShippedQuantity_0').value; 
     var shippedQtyNumber = parseInt(shippedQty, 10); 
     if (shippedQtyNumber.toString() !== shippedQty) { 
      alert("Only Numeric Values Allowed for Tracking #."); 
      return false; 
     } 
     return true; 
    } 

Вторая линия от @cymen кодов, является причиной проблемы для моей страницы ASPX, по крайней мере, после редактирования, что я получил то, что хотел. Я думаю, что это часть getTlementById. После нахождения правильного идентификатора для txtbox txtShippedQuantity из инструмента разработчика Google Chrome.

+0

Я считаю, что линия должна be var c = shippedQty.charAt (i); if (isNaN (c)) –

+0

@BradM это опечатка. changed.thanks. – Tiger

+0

Не нужно проверять каждый символ, просто нужно 'return/^ \ d + $ /. Test (jQuery (" # txtShippedQuantity "). Val())' –

ответ

2

Вы можете использовать parseInt для разбора входной строки на номер, а затем сравнить число в исходной строке:

var input = '5'; 
var number = parseInt(input, 10); 
if (number.toString() === input) { 
    // valid 
} else { 
    // invalid 
} 

Так что я бы написать вы работаете как:

function ValidateShippedQuantity() { 
    var shippedQty = jQuery("#txtShippedQuantity").val(); 
    var shippedQtyNumber = parseInt(shippedQty, 10); 
    if (shippedQtyNumber.toString() !== shippedQty) { 
     alert("Only Numeric Values Allowed"); 
     return false; 
    } 
    return true; 
} 

Настоящая демоверсия (с объявлением dicalal alert on valid): http://jsfiddle.net/S4CQT/

Обратите внимание, что это не удастся, если они войдут в 1000, поскольку он проверяет, равен ли 1000 «1000». Так что если вы хотите, чтобы поддержать запятые, у вас есть несколько вариантов, но быстрый способ (который будет рассматривать 10,00 в силе), было бы изменить заявление в случае с этим:

shippedQtyNumber.toString() !== shippedQty.replace(',', '') 

другой потенциальный сбой - если вы разрешаете не целое число (например, 10.5). В этом случае просмотрите parseFloat.

+0

спасибо. это целые числа. и я пробовал ваши коды, которые имеют ту же проблему. не повезло. – Tiger

+1

Существует проблема с тем, как вы его подключаете. Вот jsfiddle, который показывает, что он работает: http://jsfiddle.net/S4CQT/ – Cymen

+0

да. Я добавил более подробно выше. – Tiger

1

Используйте ASP.NET валидаторы

<asp:RegularExpressionValidator ValidationExpression="^\d+$" 
    ControlToValidate="txtShippedQuantity" runat="server" 
    Text="Must be a number" Color="Red" Display="Dynamic" /> 

Это предотвратит сторону постбэк клиента, если он не соответствует заданному регулярному выражению.

В качестве альтернативы, вы можете использовать RangeValidator

<asp:RangeValidator 
    MinimumValue='<%# Int32.MinValue %>' 
    MaximumValue='<%# Int32.MaxValue %>' 
    ControlToValidate="txtShippedQuantity" 
    runat="server" /> 
+0

Это должно быть предложение, так как это обходное решение (прекрасный) –

+0

Как это обходное решение? Это стандартизованный встроенный способ проверки элементов управления в ASP.NET. – Syddraf

+1

Вопрос о JS, вы можете обходиться с необходимостью писать свой собственный JS с помощью валидаторов ASP.NET. –

0

Ум не должен

if (isNaN(shippedQty)) 

быть

if (isNaN(c)) 

А почему вы зацикливание, когда регулярное выражение может проверить номера?

0

http://jsfiddle.net/4nXT3/

function ValidateShippedQuantity() { 
    var shippedQty = jQuery("#txtShippedQuantity").val(); 
    if (isNaN(shippedQty)) { 
     alert('Only Numeric Values Allowed'); 
     return false; 
    } 
    return true; 
} 

Update: читать комментарии, чтобы узнать, почему это плохо.

+0

'isNaN()' вызываемая строка никогда не вернёт true, вы явно означали 'isNan (parseInt (shippedQty), 10)' –

+0

В консоли Chrome isNaN («10a») -> true –

+0

Я стою исправлен. Но я не хочу повышать, потому что кажется, что isNaN() возвращает много ложных срабатываний, и этого следует избегать https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/isNan " Следующая версия ECMAScript (ES6) содержит функцию 'Number.isNaN' ... надежный способ проверить, является ли x NaN или нет ... поскольку результат не подлежит ложным срабатываниям, которые делают isNaN ненадежным. –

0

Вы можете использовать нижний подход, который сказал, что я не вижу ничего плохого в вашем подходе, чтобы подтвердить это.

<html> 
<head> 
    <title></title> 
    <meta charset="UTF-8" /> 
     <script type="text/javascript"> 
     function ValidateShippedQuantity() { 
    var shippedQty = jQuery("#txtShippedQuantity").val(); //alert(shippedQty); 
    shippedQty = shippedQty.toString(); 
    for (i = 0; i < shippedQty.length; i++) { 
     var c = shippedQty.charAt(i); 
     if (isNaN(c))   { 
      alert("Only Numeric Values Allowed"); 
      //x.focus(); 
      return false; 
     } 

    } 
    if(shippedQty.length == 0) 
     { 
      alert("Field can't be blank"); 
     } 
    return true; 
    $("form").submit(); 
} 
    </script> 
</head> 
<body> 
    <form method="GET"> 
    <input type="text" id="txtShippedQuantity" /><br /><br /> 
    <input type="submit" value="Validate" onclick="ValidateShippedQuantity()" /> 
</form> 
</body> 
</html> 

Я думаю, вы ошибаетесь, не имея возможности правильно вызвать функцию.

Я добавил демо тоже на JSFIDDLE

0
function ValidateShippedQuantity() { 
    var reg = new RegExp("^[0-9]+$"); 
    return reg.test(jQuery("#txtShippedQuantity").val()); 
} 
0

Все, что вам нужно, это то, что тесты, если все символы являются цифрами. Нет необходимости проходным каждого символа, просто использовать регулярные выражения http://jsfiddle.net/4nXT3/ Это не будет так легко, если вам необходимо поддерживать поплавки или другие форматы ввода, в этом случае вам нужно что-то более сложное like what was suggested by Cymen

function ValidateShippedQuantity() 
    var input = jQuery("#txtShippedQuantity").val(); 
    if (!/^\d+$/.test(input)) { 
     alert('Only Numeric Values allowed') 
     return false; 
    } 
    return true 
} 
Смежные вопросы