关于jquery:JavaScript从函数中获取变量

JavaScript get variable from function

我在JavaScript方面不专业,我在网上看到了很长时间的搜索。

我从另一个函数获取变量时遇到问题。 我的代码看起来像这样:

1
2
3
4
5
6
7
8
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以下时,它正在工作,但我需要在函数后面的数据变量。

编辑:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
                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)没有传入函数。 我怎么解决这个问题?


因为它是异步的,所以只有在ajax调用完成后才能使用数据,所以你必须修改你的代码才能使用它并等到ajax完成之后再做你的东西:

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

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

或其他功能:

1
2
3
4
5
6
7
8
9
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);
    });
}

编辑:

基于您的编辑,它看起来像是一个范围问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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());
    }
}


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

请在SO上查看这个问题。

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

1
2
3
4
5
6
7
$.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...
  }
);


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

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