JavaScript从函数中获取变量。

27 浏览
0 Comments

JavaScript从函数中获取变量。

我不是JavaScript的专业人士,我在互联网上搜索了很长时间。我在获取另一个函数的变量时遇到了问题。我的代码如下:\n

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

\n变量variabeltje必须从data中获取信息。当我将alert放在variabeltje=data下面时,它可以工作,但我需要在函数之后使用data变量。\n编辑:\n我已经按照别人的建议进行了更改,现在我的代码如下:\n

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());
                }
                }

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

0
0 Comments

问题的原因是post方法异步执行。这意味着在向服务器发送post请求时,执行流程会继续,因此你的alert尝试访问一个尚未设置的值,因为post还没有返回。

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

0
0 Comments

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

请参考SO上的这个问题

编辑:你可以改变你的代码,将post方法之后的部分放在成功触发的匿名函数体内。如下所示:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
    alert(window.variabeltje); // 或者任何你需要调用的函数,在这里调用它...
  }
);

0
0 Comments

问题的出现原因是由于ajax调用是异步的,所以数据只有在ajax调用完成后才可用,因此需要修改代码以适应这种情况,并等待ajax完成后再执行相关操作。

解决方法之一是在ajax调用的.done()函数中处理数据:

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

另一种解决方法是将ajax调用封装成一个函数,并在其他函数中调用该函数:

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') {
      alert(data);
      $(self).unbind('keypress').html($(self).find('input').val());
    }
}

非常感谢。还有一个问题,当我将$(this).html($(this).find('input').val())放在函数中时,如何将$(this)传递给XHR.done()函数?

你需要弄清楚作用域以及this指向的是什么,然后如果需要,可以使用一个变量或将其传递给函数,就像处理其他变量一样,以避免作用域问题。

0