5

我不是 JavaScript 方面的专业人士,我已经看到在互联网上搜索了很长时间。

我在从另一个函数获取变量时遇到问题。我的代码如下所示:

var variabeltje;
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
  }
);
alert(window.variabeltje);

变量variabeltje必须从数据中获取信息。当我将警报放在下面variabeltje=data时它正在工作,但我需要在函数之后使用数据变量。

编辑:

我已经把它改成了人们所说的,我现在有这个:

                var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});
                XHR.done(function(data) {
                    console.log(data); 
                    getData(data);
                }); 

                function getData(data) {
                if(data == 'true') {
                    alert(data);
                    $(this).unbind('keypress');
                    $(this).html($(this).find('input').val());
                }
                }

但是现在 $(this) 没有传递给函数。我该如何解决这个问题?

4

3 回答 3

4

由于它是异步的,因此数据仅在 ajax 调用完成后才可用,因此您必须修改代码以使用它并等到 ajax 完成后才能完成您的工作:

var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});

XHR.done(function(data) {
    console.log(data);
});

或在其他功能中:

function XHR(time){
   return $.post('js/ajax/handle_time.php', {time: time});
}

function doStuff(element) {
    XHR($(element).find('input').val()).done(function(data) {
        console.log(data);
    });
}

编辑:

根据您的编辑,看起来这是一个范围问题:

var self = this,
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()});

XHR.done(function(data) {
    console.log(data); 
    getData(data);
}); 

function getData(data) {
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string
      alert(data);
      $(self).unbind('keypress').html($(self).find('input').val());
    }
}
于 2012-10-30T13:11:02.807 回答
2

这是因为 $.post 方法是异步运行的。

请在 SO 上查看这个问题。

编辑:您可以更改代码并将 post 方法之后的部分放在成功触发的匿名函数的主体内。如下:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
    alert(window.variabeltje); // or whatever function you need to call, call it here...
  }
);
于 2012-10-30T13:01:48.513 回答
1

问题是该post方法是异步执行的。也就是说,一个帖子被发送到服务器,但执行流程仍在继续,因此您的警报正在尝试访问一个由于帖子尚未返回而未设置的值。

ajax如果您需要同步执行,您可以使用方法。

于 2012-10-30T13:01:31.640 回答