【问题标题】:I need to use a var outside of a get function in jQuery我需要在 jQuery 的 get 函数之外使用 var
【发布时间】:2011-11-25 19:29:18
【问题描述】:

考虑这段代码sn-p:

$('#selectone').change(function(){
    var amount;
    $.get('search.php', {search:'units'}, function(result){
        //this will return only one or zero for me.
        amount = result;
    })
    if(amount>0)
    {
        alert('This option has been selected, please select another one');
    }
})

我的变量amount 总是会出现undefined。如何修复或重构?

【问题讨论】:

标签: jquery scope


【解决方案1】:

那是因为下面的代码在你的$.get()请求中的回调函数之前运行:

if(amount>0)
{
    alert('This option has been selected, please select another one');
}

AJAX 调用是异步的,这意味着它们周围的代码在 AJAX 调用等待响应时运行。所以 if(amount>0) 代码在 AJAX 回调触发之前运行(这意味着对于您的 if/then 语句 amount 将始终等于 null)。

要执行您想要的操作,我建议将该代码放入您的 $.get() 请求的回调函数中:

$('#selectone').change(function(){
    $.get('search.php', {search:'units'}, function(result){
        //this will return only one or zero for me.
        if(result>0)
        {
            alert('This option has been selected, please select another one');
        }
    });
});

--更新--

你也可以使用jQuery的$.when()方法:

$('#selectone').change(function(){
    var amount;
    var jqXHR = $.get('search.php', {search:'units'}, function(result){
        //this will return only one or zero for me.
        amount = result;
    });
    $.when(jqXHR).then(function () {
        if(amount>0)
        {
            alert('This option has been selected, please select another one');
        }
    });
});

【讨论】:

  • 我不能,这个 $.get 只会在另一个字段有值的情况下执行,而这个 "if(amount>0){}" 将包含两种情况的代码。还是谢谢。
  • @GustavoMartins 我更新了我的答案以提供一个结构更像您的代码的解决方案。我需要查看您的实际代码以提供进一步帮助。
  • 这个限制可以使用 Jasper 的建议来解决(你没有指出需要满足哪些其他条件,所以 Jasper 无法为它们提供代码),所以我要赞成它。听起来您只需要在更改函数中添加另一个条件来检查金额是否已经设置(由另一个字段?)或者它是否已经大于零。
  • 现在完美运行。我很抱歉我忘记了另一种情况。但知道是完美的。谢谢。
【解决方案2】:

你不能只在成功函数中使用它吗?最好的办法:

$('#selectone').change(function(){
 var amount;
    $.post({
        async : false, // this makes it possible
        url: 'search.php', 
        data: {search:'units'}, 
        success : function(result){
            //this will return only one or zero for me.
            amount = result;
        }
    });

    if(amount>0)
    {
        alert('This option has been selected, please select another one');
    }
})

【讨论】:

  • 这与问题的代码相同。 if(amount>0) 将在 amount = result; 之前评估,这意味着对于 if 语句,amount 将始终等于 null
  • 不行,因为我得到了async=false,所以代码会设置,等到ready函数完成,所以可以在函数之后设置值使用。
  • 明白了,只是让阅读本文的人知道,这意味着浏览器将锁定直到 AJAX 调用完成(对于一个小的响应,这可能是 50 毫秒到几秒之间的任何时间)。跨度>
  • 没错,但唯一的方法是在没有 $.when 和成功函数之外的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2012-02-24
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多