如何在ajax成功函数之外保存var值?

时间:2011-09-30 18:54:25

标签: javascript jquery ajax json

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

<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 = {}; ,它就像魅力一样。我想我已经盯着这个屏幕太久了!

2 个答案:

答案 0 :(得分:2)

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

$(myObj).data("username")

<强>资源:

看一下jQuery的.data() docs

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

答案 1 :(得分:0)

我会将promise存储在该全局变量中,然后在提交按钮单击中将事件绑定到done事件。

$(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请求一次处于活动状态。