【问题标题】:jQuery AJAX call always firing successjQuery AJAX 调用总是触发成功
【发布时间】:2014-07-03 16:39:20
【问题描述】:

我有这个登录表单,我在其中进行服务器端验证,现在我正在尝试进行 jQuery 验证。

sn-p 形式:

<div class="form-actions">
     <button type="submit" class="btn green pull-right">Login <i class="m-icon-swapright m-icon-white"></i></button>
</div>

jQuery sn-p:(我使用bootstrap的login.js)

submitHandler: function (form) {
    var un = $('#usernameEmail').val();
    var p = $('#pass').val();

    $.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            form.submit();
         },
        error: function(data){
            alert("Error");
        }    
    });  
  }

函数checkIfUsernameOrEmailExists 运行良好。我在成功函数上做了一个console.log(data)(因为它总是在触发),当它必须为假时数据为假,当必须为真时为真。因此,鉴于这种情况,我对错误可能出在哪里感到困惑。

编辑

我之前尝试过但没有成功,现在我确定理论上它是正确的,正如 Ramesh 和 Keune 建议的那样......但仍然无法正常工作,也许我有什么问题并且没有意识到?没有显示错误,没有登录console.log,也没有出现警报。

submitHandler: function (form) {
     var un = $('#usernameEmail').val();
     var p = $('#pass').val();
     $.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            if (data) {
                form.submit()
            }else{
                // console.log(data);
                alert(data);
            };
        },
        error: function(data){
            alert("Error");
        }    
        });  
       }

解决方案

正如 Blurfus 所说,我错过了“”,因此,在成功函数内部,数据比较应该针对字符串:

success: function(data){
    if (data == "true") {
        form.submit()
    }else{
        alert(data);
    };
},

【问题讨论】:

  • 请求成功时调用success函数。它对您的业务逻辑一无所知。
  • @keune 我现在知道了。谢谢你的提示。无论如何,正如我告诉 RameshKotha 它在成功并且用户可以登录时工作。但如果错误,则不会显示警报消息
  • 如果data 是一个对象或一个数组,或者任何真实的东西(例如字符串 "false"),它将提交表单。
  • @KevinB 真的吗?什么是错误的正确显示方式? :s
  • 返回具有标志的对象的 json 字符串表示,例如 { "success": false },然后将 dataType 设置为 json。 if (data.success) { do stuff } 或者,您可以让您的服务器返回非 2xx 状态代码。

标签: jquery ajax twitter-bootstrap validation


【解决方案1】:

如果我对documentation 的理解正确,您需要在success 回调函数中执行此操作

success: function(data, status, jqXHR){
   ...
} 

是的,我知道其他两个是可选的,但根据函数签名:

Function(PlainObject data, String textStatus, jqXHR jqXHR )

Data 是从服务器返回的对象,根据dataType 参数(您尚未指定)格式化,可能的值为xml, json, script, or html - 但是,它确实尝试使用智能猜测。因此,换句话说,它不能很好地处理 data 的布尔值(完全?)。

我最好的猜测是,您必须检查 String 之类的:

if(data == "TRUE"){
    form.submit();
}else{
    alert('Error');
}

还可以指定一个dataType 参数。

【讨论】:

  • 嘿感谢您的评论。它与 Ramesh 和 Keune 所说的一致,将逻辑放入成功函数中。但是多亏了你,我发现问题是我在该行中缺少 de "": if(data == "TRUE")
【解决方案2】:

我认为您的 checkIfUsernameOrEmailExists 只是返回 TRUE 或 FALSE。如果它抛出任何错误,那么只会调用 jquery 错误。否则,它只会走向成功。如果要抛出错误,请检查 false 是否成功并警告它。

$.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            if(data){
               form.submit();
            }else{
               alert('Error');
            }
         },
        error: function(data){
            alert("Error");
        }    
    });  

参考:JQuery Ajax

【讨论】:

  • 拉梅什是对的。 jQuery 检查是否成功是 AJAX 查询是否成功。您收到的数据无关紧要。
  • 我以前这样做过,但我删除了它,因为它对我不起作用。我知道这是正确的逻辑,但是对我来说这段代码不起作用。警报错误仍未出现,这是什么情况?
  • 把console.log的数据,看看,什么来了,是不是假的?
  • @RameshKotha console.log 仅在为 true 时有效,为 false 时无效。这很奇怪,也没有出现错误
  • 如果你有firebug,它肯定会显示错误。
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多