使Jquery模糊处理元素时出错

时间:2009-12-17 06:03:01

标签: jquery asp.net-mvc

我正在开发一个表单,允许用户输入他们的信用卡信息来完成交易。我在服务器上验证,但也希望提供顺畅的客户端验证。我正在使用ASP.NET MVC和JQuery。

我正在做的是使用JQuery模糊函数在有人将焦点从一个字段移开时执行javascript。然后javascript将确定它是否是有效条目,然后显示“检查”或“交叉”以帮助用户更正表单。

到目前为止,它正在为一个字段(信用卡到期日期)工作。但它不适用于任何其他元素(已尝试使用信用卡号和邮政编码)。使用Firebug,它甚至看起来没有其他模糊射击。请协助。谢谢!

这是我的JQuery:

$(document).ready(function() {

  // Hide all of the validation checkers
  $('#credit-card-number-validator').hide();
  $('#credit-card-number-correct').hide();
  $('#credit-card-expiration-validator').hide();
  $('#credit-card-expiration-correct').hide();
  $('#zip-validator').hide();
  $('#zip-correct').hide();

  // Check Zip Code
  $('#donor-zip').blur(function() {
    $('#zip-validator').show();
    $('#zip-correct').show();
    var enteredValue = $('#donor-zip').val();
    var regex = new RegExp(/^\d{5}$|^\d{5}-\d{4}$/);
    var isValid = regex.exec(enteredValue);
    if (isValid == null) {
      $('#zip-correct').hide();
      $('#zip-validator').show();
      if (enteredValue == "") {
        $('#zip-validator').hide();
      }
    }
    else {
      $('#zip-validator').hide();
      $('#zip-correct').show();
    }
  });

  // Credit Card Number Checker
  $('#donor-credit-card-number').blur(function() {
    $('#credit-card-number-validator').show();
    $('#credit-card-number-correct').show();
    var enteredValue = $('#donor-credit-card-number').val();
    var regexCard = new RegExp(/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13})$/);
    var isCardValid = regexCard.exec(enteredValue);
    if (isCardValid == null) {
      $('#credit-card-number-validator').show();
      $('#credit-card-number-correct').hide();
      if (enteredValue == "") {
        $('#credit-card-number-validator').hide();
      }
    }
    else {
      $('#credit-card-number-validator').hide();
      $('#credit-card-number-correct').show();
    }
  });

  // Expiration Date Checker
  $('#donor-credit-card-expiration-date').blur(function() {
    $('#credit-card-expiration-validator').show();
    $('#credit-card-expiration-correct').show();
    var enteredValue = $('#donor-credit-card-expiration-date').val();
    var regex = new RegExp(/^(\d{2})1[0-9]$/);
    var isValid = regex.exec(enteredValue);
    if (isValid == null) {
      $('#credit-card-expiration-correct').hide();
      $('#credit-card-expiration-validator').show();
      if (enteredValue == "") {
        $('#credit-card-expiration-validator').hide();
      }
    }
    else {
      $('#credit-card-expiration-validator').hide();
      $('#credit-card-expiration-correct').show();
    }
  });
});

以下是我的视图中的代码(对于此部分):

  <div id="donor-zip" class="textlabel">Zip Code:<br /> <%= Html.TextBox("donor-zip", null, new { @class = "textinput" })%> <span id="zip-validator"> <img src="<%= Url.Content("~/content/images/12-em-cross.png") %>" /></span> <span id="zip-correct"> <img src="<%= Url.Content("~/content/images/12-em-check.png") %>" /></span></div>

...

 <div id="donor-credit-card-number" class="textlabel">Credit Card Number:<br /> <%= Html.TextBox("donor-credit-card-number", null, new { @class = "textinput" })%> <span id="credit-card-number-validator"> <img src="<%= Url.Content("~/content/images/12-em-cross.png") %>" /></span> <span id="credit-card-number-correct"> <img src="<%= Url.Content("~/content/images/12-em-check.png") %>" /></span> </div>
  <div id="donor-credit-card-expiration" class="textlabel">Card Expiration Date:<br /> <%= Html.TextBox("donor-credit-card-expiration-date", null, new { @class = "textinput" })%> <span id="credit-card-expiration-validator"> <img src="<%= Url.Content("~/content/images/12-em-cross.png") %>" /></span> <span id="credit-card-expiration-correct"> <img src="<%= Url.Content("~/content/images/12-em-check.png") %>" /></span> </div>

2 个答案:

答案 0 :(得分:2)

看起来问题是你正在选择包装输入的DIV元素。您想要的模糊事件位于INPUT元素上。

在DIV中选择INPUT的一种方法示例:

$('#donor-credit-card-number input').blur(function(){
    //etc...
});

答案 1 :(得分:1)

这是通过@jchapa进行搜索的大量代码。 :)

然而,使用类名而不是volitile id可能会付出代价。

所以<div id="donor-credit-card-number" class="textlabel Donor-Credit-Card-Number">然后在你的jQuery中使用点符号,如$('.Donor-Credit-Card-Number').blur

所以无论你的id是什么,代码都可以工作。

这可能无法解决您的问题,但它会消除您的id的依赖性,以便jQuery正常工作。

我知道mvc框架通常不会将控件的名称更改为ctrl000_,但你永远不会知道。

如果这不起作用,则删除模糊括号之间的所有代码并粘贴到笔记本中,并用警报替换代码,以查看触发的内容和不触发的内容。

至少你需要一个较小的代码库来完成。

然后逐行添加你的代码。