2012-12-13 24 views
1

我有2個javascript函數,第一個是加載ajax內容(通過另一個函數)的函數,第二個是回調函數。它們看起來像:在函數完成之前正在啓動Javascript回調(沒有jQuery)

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爲「下一個回覆」,因爲它不」元素的含量t存在,並且它不存在的原因是因爲回調函數改變了該元素的id。意圖是在ajax內容加載後(即在執行ajaxPage()函數後)發生回調火災

任何人都可以看到問題出在哪裏?有沒有更好的方式在普通的JavaScript中實現回調函數?

PS:沒有jQuery的

+2

什麼是'ajaxPage'?你是否也可以發佈源代碼?基本上,您需要將'callBack'傳遞給'ajaxPage'並在從服務器返回響應時調用它。 –

+0

我想到了這一點,但我無法改變'ajaxPage'函數的工作方式,它在網站上廣泛使用,我不想影響網站上的其他任何內容。這肯定會破壞回調函數的意義? –

+3

問題是您的AJAX調用異步發生,即'ajaxPage'在* *實際完成之前立即返回。如果確實'ajaxPage'不支持回調事件的概念,則需要重新考慮設計。 –

回答

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

謝謝麥克。是的,我去了。我面臨的主要問題是'ajaxPage'函數正在調用一系列其他函數,所以我必須通過調用的函數繼續傳遞迴調函數。我得到它的工作,我只是不覺得它很優雅,希望有一個更好的解決方案。 –

+0

是的,這是範圍的目的。如果所有這些*其他函數*都在'ajaxPage()'函數範圍內,則不需要繼續傳遞它。但很高興你有事情的工作! –

0

現在你的回調函數ajaxPage後立即執行。在我意思之後,你不要等待ajaxPage返回成功。它在ajax呼叫結束後立即被解僱。在你的回調被觸發之前,它很可能沒有完成。

相關問題