Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在函数完成之前触发Javascript回调(无jQuery)_Javascript_Ajax_Callback - Fatal编程技术网

在函数完成之前触发Javascript回调(无jQuery)

在函数完成之前触发Javascript回调(无jQuery),javascript,ajax,callback,Javascript,Ajax,Callback,我有两个javascript函数,第一个是加载ajax内容的函数(通过另一个函数),第二个是回调函数。它们看起来像: function createReply(callBack){ ajaxPage('test.html', 'next-reply'); callBack(); } function updateNext(){ document.getElementById('next-reply').id = "reply-item"; } createReply

我有两个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:no jQuery

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

正如在评论中指出的,这是由于AJAX调用是异步进行的。运行
createReply
的线程在服务器返回响应之前继续运行

您需要重新考虑
ajaxPage
以接受对
回调的引用,并在响应就绪时调用它。比如:

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

什么是ajaxPage
?你也能把消息来源发出来吗?基本上,您需要将
callBack
传递到
ajaxPage
中,并在服务器返回响应时调用它。我想到了这一点,但我无法改变
ajaxPage
函数的工作方式,它在网站上广泛使用,我不想影响网站上的任何其他内容。这肯定会破坏回调函数的作用吗?问题是AJAX调用是异步进行的,即,
ajaxPage
在实际完成之前立即返回。如果
ajaxPage
确实不支持回调事件的概念,那么您需要重新考虑您的设计。是的,我想我必须咬紧牙关,改变
ajaxPage
函数的工作方式。这应该不会太糟糕,只是添加了一个可选的回调函数。我希望会有一个“更好”的解决方案,但哦,好吧。让我更加欣赏jQuery:)这是JavaScript的优点之一。您只需在末尾添加一个可选参数,然后说
if(callback)callback()并不会破坏现有代码。祝你好运谢谢你,迈克。是的,我同意。我面临的主要问题是
ajaxPage
函数正在调用一系列其他函数,因此我必须通过被调用的函数不断向下传递回调函数。我让它工作了,我只是觉得它不太优雅,希望有一个更整洁的解决方案。是的,这就是范围界定的目的。如果所有其他函数都在
ajaxPage()
函数范围内,则不需要一直传递它。但很高兴你的工作顺利!