【问题标题】:How to save var value outside ajax success function?如何在ajax成功函数之外保存var值?
【发布时间】:2011-09-30 18:54:25
【问题描述】:

我正在尝试制作一些表单验证功能。这是我所拥有的:

<script>
$(document).ready(function() {

var myObj = {}; 

$('#username').keyup(function () {

    id = $(this).attr('id');
    validateUsername(id);       

});

function validateUsername(id){

var username = $("#"+id).val();

    $.ajax({
        url : "validate.php",
        dataType: 'json',
        data: 'action=usr_id&id=' + username,
        type: "POST",
        success: function(data) {

            if (data.ok == true) {

                $(myObj).data("username","ok");

            } else {


                $(myObj).data("username","no");

            }

        }
    }); 


} // end validateusername function


$('#submit').click(function(){

    if (myObj.username == "ok")  {

        alert("Username OK");

    } else {

        alert("Username BAD");

    }   


});




}); // end doc ready

所以你可以看到,当在文本框中按下一个键时,它会检查它是否有效。 “data.ok”正确返回。问题基于响应,我定义了 $(myObj).username。出于某种原因,我无法让这个值在 validateusername 函数之外起作用。单击提交按钮时,它不知道 $(myObj).username 的值是什么。

我需要使用这样的东西,因为页面上有多个表单字段要验证,我可以这样做:

if (myObj.username && myObj.password && myObj.email == "ok")

...在提交表单之前检查我的所有表单字段。

我知道我一定是遗漏了一些基本的东西……有什么想法吗?

编辑:已解决

我所要做的就是将 var myObj = {}; 更改为 myObj = {}; ,它就像一个魅力。我想我已经盯着这个屏幕太久了!

【问题讨论】:

  • 祝你好运,让 ajax 跟上某人的打字速度......

标签: javascript jquery ajax json


【解决方案1】:

您没有访问正确存储的数据。以这种方式访问​​用户名值:

$(myObj).data("username")

资源:

看看 jQuery 的.data() docs

Very simple jsFiddle 展示了如何使用 jQuery 的 .data() 方法正确设置和检索数据。

【讨论】:

  • 哦,你是对的。我看错了。对此感到抱歉。
【解决方案2】:

我会将承诺存储在该全局变量中,然后在您单击提交按钮时将一个事件绑定到完成事件。

$(document).ready(function() {

var myObj = false; 

$('#username').keyup(function () {

    id = $(this).attr('id');
    validateUsername(id);       

});

function validateUsername(id){

    var username = $("#"+id).val();

    myObj = $.ajax({
        url : "validate.php",
        dataType: 'json',
        data: 'action=usr_id&id=' + username,
        type: "POST",
        success: function(data) {
          $('#username').removeClass('valid invalid');
          if (data.ok == true) {
            $('#username').addClass('valid');
          }
          else {
            $('#username').addClass('invalid');
          }
        }
    }); 


} // end validateusername function


$('#submit').click(function(){

    // if myObj is still equal to false, the username has
    // not changed yet, therefore the ajax request hasn't
    // been made
    if (!myObj) {
        alert("Username BAD");
    }
    // since a deferred object exists, add a callback to done
    else {
        myObj.done(function(data){
            if (data.ok == true) {
                alert("Username BAD");
            }
            else {
                alert("Username OK");
            }               
        });
    }

});




}); // end doc ready

您可能希望为 keyup 事件添加一些限制,以防止多个 ajax 请求同时处于活动状态。

【讨论】:

  • 在将第一行更改为“myObj = false”(删除了 var)后,这行得通,但问题是 myObj 会根据 POST 返回的结果而有所不同。这就是我在成功函数中所拥有的......
  • 您可以将我使用的“完成”功能视为您之前使用的成功功能。你不能把那个额外的逻辑放在那里吗?我不确定为什么从第一行删除 var 会有什么不同,这一切都应该正确界定。
  • 啊,我明白你的意思了。仅使用该功能添加成功方法,实际上不要在成功事件中修改 myObj。我会更新示例。
  • 我刚刚让我的原始代码工作......你的帖子给了我这个想法 - 我所做的只是从 myObj = {} 中删除“var”;现在它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多