【问题标题】:Returning the html from .ajax call从 .ajax 调用返回 html
【发布时间】:2010-04-14 13:35:19
【问题描述】:

当我尝试通过回调函数返回 html 时,由于某种原因,我变得未定义:

function getDataFromUrl(urlWithContent)
{  
    // jQuery async request
    $.ajax(
    {
        url: urlWithContent,
        dataType: "html",
        success: function(data) {
                                    return $('.result').html(data);
                                },
        error: function(e) 
        {
            alert('Error: ' + e);
        }
    });
}

我知道我正在取回数据,我在响应中的 firebug 中看到它,当我发出数据警报时,我看到整个页面内容出现在警报框中。

当我调用我的函数时,我正在执行以下操作:

var divContent = getDataFromUrl(dialogDiv.attr("href"));

if(divContent)
    dialogDiv.innerHTML = divContent;

当我提醒 divContent(在 if 语句之前)时,我变得不确定。也许我只是在返回数据的方式上犯了这个错误?

我也试过只返回数据;同样的事情,当设置为我的变量时,在调用此方法后我得到未定义。

根据回复更新:

试过了,还是不确定:

function getDataFromUrl(urlWithContent, divToUpdate)
{  
    $.ajax(
    {
        url: urlWithContent,
        aSync: false,
        dataType: "html",
        success: function(data) {
                                    divToUpdate.innerHTML = data;
                                },
        error: function(e) 
        {
            alert('Error: ' + e);
        }
    });
}

我在另一个函数中这样调用它:

var divContent = "";

if (dialogDiv.attr("href"))
{
    getDataFromUrl(dialogDiv.attr("href"), divContent);
}

【问题讨论】:

  • 自更新以来 - 您传入的是 divContent,而不是 dialogDiv - 您需要传入对 div 的引用才能更新。
  • 感谢大家的时间。我想我现在已经 360 度了。

标签: jquery


【解决方案1】:

您不能从回调中返回数据 - 因为无法保证在函数退出时数据已经从函数中返回(因为它是一个异步调用。)

你要做的是更新回调中的内容,比如:

success: function(data) {
    $('#dialogDiv').html(data);
},

您的对话框DIV 附加了id="dialogDiv"

我认为您还可以修改函数以在调用完成时更新对象,如下所示:

function getDataFromUrl(urlWithContent, divToUpdate)
{  
    // jQuery async request
    $.ajax(
    {
        url: urlWithContent,
        dataType: "html",
        success: function(data) {
            divToUpdate.innerHTML = data;
        },
        error: function(e) 
        {
            alert('Error: ' + e);
        }
    });
}

然后像这样调用它(其中dialogDiv 是代表DIV 的对象,要像您的示例一样更新。)

getDataFromUrl(dialogDiv.attr("href"), dialogDiv);

【讨论】:

  • “因为不能保证在函数退出时数据会从函数返回”但是如果我成功地这样做了,那不是告诉我吗有数据吗?
  • 否,因为该函数在从 AJAX 调用返回数据之前不会执行,这可能是在您的 getDataFromUrl 函数退出之后,具体取决于客户端的连接到远程服务器的速度。你正在做的是触发 AJAX 请求,说“当它回来时让我知道”然后继续你之前所做的 - 即退出 getDataFromUrl 函数。
  • 感谢您的示例确实帮助我获得了更好的视角(解决此问题的方法)
  • 奇怪,我想如果我调用 getDataFromUrl,它不会退出函数,直到成功......这意味着它有数据..
  • 函数的其余部分。执行堆栈可能如下所示: 1. 您调用 getDataFromUrl。 2. getDataFromUrl 发出 AJAX 请求。 3. getDataFromUrl 退出(而 AJAX 请求在后台运行) 4. AJAX 请求完成并执行您的成功函数。看到问题了吗?如果您的连接速度足够快,则 #4 可能会在 #3 之前发生 - 无法保证顺序。如果请求成功,您的成功函数就会执行。如果没有,你的错误函数就会执行。
【解决方案2】:

ajax 调用异步运行。因此,您的函数在您的 ajax 调用完成之前返回(通过退出块的末尾)。你有两种方法来处理这个问题。添加 aSync: false 选项以强制 ajax 调用同步运行或使用回调到您的函数,该回调可以在 ajax 调用完成时执行。我更喜欢后者。

function setDataFromUrl(urlWithContent,callback) 
{   
    // jQuery async request 
    $.ajax( 
    { 
        url: urlWithContent, 
        dataType: "html", 
        success: function(data) { 
                                    callback(data);
                                }, 
        error: function(e)  
        { 
            alert('Error: ' + e); 
        } 
    }); 
}

setDataFromUrl(dialogAnchor.attr("href"), function(data) {
     dialogDiv.html(data);
});

甚至更好,除非您在很多地方共享此代码:

var dialogDiv = $('div.dialog');
var dialogAnchor = dialogDiv.find('a');
// jQuery async request 
$.ajax( 
{ 
    url: dialogAnchor.attr('href'), 
    dataType: "html", 
    success: function(data) { 
                                dialogDiv.html(data);
                            }, 
    error: function(e)  
    { 
        alert('Error: ' + e); 
    } 
});

【讨论】:

  • 当你说运行异步时,同时...同时在什么时候,DOM 加载?
  • 这是同步与异步调用的一个很好的类比 - groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/…。代码示例来自 GWT,但这个想法也适用于此。
  • @coffeeaddict -- 当你调用 ajax 方法时,它实际上在调用完成之前返回,这意味着下一行代码(这里是块的结尾)可能在实际请求之前执行完全的。它不会等到请求完成后再继续执行函数中的下一行。如果您将async 设置为false,那么它将等待,但您仍然有一个问题:即返回实际上是从ajax 完成回调返回,而不是您的函数。您需要捕获本地范围变量中的值,然后在函数末尾返回它。
  • @sri:这是一个绝妙的类比。
  • dialogDiv 位于另一个调用此异步函数的函数中
【解决方案3】:

你为什么不试试这个:

function getDataFromUrl(urlWithContent)
{  
    // jQuery async request
    $.ajax(
    {
        url: urlWithContent,
        dataType: "html",
        success: function(data) {
                                    $('#dialogDiv').html(data);
                                },
        error: function(e) 
        {
            alert('Error: ' + e);
        }
    });
}

并且只是调用函数而不将其分配给任何变量。

HTH

【讨论】:

  • 什么意思? dialogDiv 是另一个调用它的函数的变量(或传入参数)。它如何知道其他变量或参数?
  • 如果它是动态的,那么您可能必须遵循安迪的方法,因为它很有意义。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2011-02-20
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多