1

我有 2 个 javascript 函数,第一个是加载 ajax 内容的函数(通过另一个函数),第二个是回调函数。他们看起来像:

function createReply(callBack){
    ajaxPage('test.html', 'next-reply');
    callBack();
}

function updateNext(){
    document.getElementById('next-reply').id  = "reply-item";
}

createReply(updateNext);

如您所见,我正在调用该createReply()函数并将回调函数的名称传递给它,在这种情况下updateNext()

createReply()函数中,我正在调用另一个通过 ajax 加载内容的函数。当这个函数完成时,回调应该被执行。回调会更改正在加载 ajax 内容的 div 的 id。这就是问题发生的地方

我收到错误消息:

Uncaught TypeError: Cannot set property 'innerHTML' of null 

也就是说,它不能更改 id 为“ next-reply ”的元素的内容,因为它不存在,而它不存在的原因是因为回调函数更改了该元素的 id。目的是在加载 ajax 内容后触发回调(即,在ajaxPage()函数执行后)

任何人都可以看到问题是什么?有没有更好的方法在纯 javascript 中实现回调函数?

PS:没有 jQuery

4

2 回答 2

2

正如评论中所指出的,这是因为 AJAX 调用是异步发生的。在服务器返回响应之前,运行的线程会createReply继续运行。

您需要重构ajaxPage以接受对 的引用callback,并在响应准备好时调用它。就像是:

function createReply(callBack){
    ajaxPage('test.html', 'next-reply', callBack);
}

然后,在 ajaxPage 中:

function ajaxPage(url, id, callback){
   //Do AJAX stuff

   //When the response is returned:
   if(callback) callback();
}
于 2012-12-13T20:57:41.220 回答
0

现在你的回调是在 ajaxPage 函数之后执行的。我的意思是你不要等待 ajaxPage 返回成功。它在 ajax 调用结束后立即被触发。在您的回调被触发之前,它很可能没有完成。

于 2012-12-13T20:31:20.147 回答