2013-02-21 75 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; 
} 

我想要的是检查仅包含数值的文本框。上面的函数是NaN或/^\ d + $ /。test()不起作用,因为无论我输入什么,例如“1”或“10”,它总是返回false。 即使很奇怪,isNaN也曾经工作过一段时间。然后,不管我以前做了什么,我都没有办法解决这个问题。我的javascript验证号码功能无法正常工作

调用验证函数的按钮位于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部分。在google chrome开发者工具中找到txtbox txtShippedQuantity的正确ID后。

+0

相信该行应be var c = shippedQty.charAt(i); if(isNaN(c)) – 2013-02-21 19:59:20

+0

@BradM这是一个错字。 changed.thanks。 – Tiger 2013-02-21 20:06:09

+0

不需要测试每个字符,只需要'return/^ \ d + $ /。test(jQuery(“#txtShippedQuantity”).val())' – 2013-02-21 20:26:42

回答

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; 
} 

这是一个功能正常的演示(带广告doryal alert on valid):http://jsfiddle.net/S4CQT/

请注意,如果输入1,000,将会失败,因为它会检查'1000'是否等于'1,000'。所以,如果你想支持逗号,你有两个选择,但一个快速的方法(即会考虑10,00是有效的),是改变本声明,如果这样:

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

另一个潜在的失败是如果你允许非整数(如10.5)。在这种情况下,请查看parseFloat

+0

谢谢。它是整数。我试着你的代码有相同的问题。没有运气。 – Tiger 2013-02-21 20:12:10

+1

然后,你是如何挂钩它的问题。这里是显示它的工作一个的jsfiddle:http://jsfiddle.net/S4CQT/ – Cymen 2013-02-21 20:16:11

+0

呀。我在上面添加了更多细节。 – Tiger 2013-02-21 20:23:54

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

这应该是一个建议,因为它是一个解决方法) – 2013-02-21 19:58:58

+0

这是一种解决方法吗?这是标准化的内置方式来验证ASP.NET中的控件 – Syddraf 2013-02-21 20:00:23

+1

问题是关于JS,你可以解决方案必须使用ASP.NET验证器编写自己的JS – 2013-02-21 20:01:03

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; 
} 

更新:阅读注释知道为什么这个坏。

+0

'isNaN()'叫上一个字符串是永远不会返回true,你proably意思'isNan(parseInt函数(shippedQty),10)' – 2013-02-21 20:04:16

+0

在Chrome的控制台,isNaN( “10A”) - >真 – 2013-02-21 20:06:12

+0

我站在纠正。但我不愿意给予好评,因为它似乎isNaN()确实返回了很多误报,并且应该避免https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/isNan“的ECMAScript(ES6)的下一个版本中包含的功能'Number.isNaN' ......一个可靠的方法来测试x是否是NaN或不...因为结果是不受误报,使isNaN不可靠的。 – 2013-02-21 20:11:32

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 
}