【问题标题】:Jquery validation async not workingJquery验证异步不起作用
【发布时间】:2012-01-13 15:00:52
【问题描述】:

我已经制作了这个函数,它似乎工作正常,但它返回“#”表示等待 AJAX。我试图删除回电,不看。

它需要等到 AJAX 完成才能返回。 JSP 工作正常。

怎么了?

jQuery.validator.addMethod("knidExist", function(value, element) {
    var valid = "#";
      $.ajax({
          async: false,
          type: "POST",
          url: "USER.jsp",
          data: "knid="+value,
          dataType: "html",
          success: function(msg) {
              // if the user exists, it returns a string "true"
              if($.trim(msg) != "true") {
                 //return false;
                 valid = false;  // already exists
              } else {
                 //return true;
                 valid = true;      // username is free to use
              }
          }  
     });
    return valid;
}, 'This USER does not exist');

【问题讨论】:

  • AJAX 中的第一个 A 代表 Asynchronous。在调用完成后试图让函数返回是一个非常糟糕的主意。你需要重新审视你的方法。
  • 我很高兴有人会为我们提供哪种解决方案!
  • @Jon - 他们设置了 async: false。他们正在尝试同步调用。
  • @jfriend00:这仍然是一个非常糟糕的主意。 :)
  • @Jon - 同意。同步ajax是邪恶的。我自己永远不会使用它。锁定浏览器。您允许使用异步请求的答案可能是更好的方法。尽管如此,从纯粹的求知欲的角度来看,我还不清楚为什么 OP 的功能不起作用。

标签: jquery ajax validation


【解决方案1】:

您无需添加自己的验证方法,而是需要使用专门为此目的设计的内置remote 验证方法。

你会以这样的方式使用它

remote: {
    type: "POST", 
    url: "USER.jsp",  
    data: { knid: value },
}

查看文档链接到的示例。

【讨论】:

  • 我知道这个方法,但是我要使用这个验证方法100次,所以把它做成jquery验证也可以做的方法会很好。
【解决方案2】:

我自己找到了一个方法。几乎是远程方法的完整副本,但带有静态消息和 url。 希望我能帮助一些人。

jQuery.validator.addMethod("userExist", function(value, element, param) {
if ( this.optional(element) )
    return "dependency-mismatch";

var previous = this.previousValue(element);
if (!this.settings.messages[element.name] )
    this.settings.messages[element.name] = {};
previous.originalMessage = this.settings.messages[element.name].remote;
this.settings.messages[element.name].remote = previous.message;

param = typeof param == "string" && {url:param} || param;

if ( this.pending[element.name] ) {
    return "pending";
}
if ( previous.old === value ) {
    return previous.valid;
}

previous.old = value;
var validator = this;
this.startRequest(element);
var data = {};
data["**user**"] = value;
$.ajax($.extend(true, {
    url: "validation.jsp",
    mode: "abort",
    dataType: "json",
    data: data,
    success: function(response) {
        validator.settings.messages[element.name].remote = "**This user do not exist"**;
        var valid = response === true;
        if ( valid ) {
            var submitted = validator.formSubmitted;
            validator.prepareElement(element);
            validator.formSubmitted = submitted;
            validator.successList.push(element);
            validator.showErrors();
        } else {
            var errors = {};
            var message = response || validator.defaultMessage( element, "remote" );
            errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
            validator.showErrors(errors);
        }
        previous.valid = valid;
        validator.stopRequest(element, valid);
    }
}, param));
return "pending";
}, "");

【讨论】:

    【解决方案3】:

    将这些请求类型设为“发布”类型会导致问题。 这基本上提交了值并且没有等待响应。 - 尝试将其设为“get”类型,它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多