2009-01-13 47 views
2

我使用以下抓住一些更新的HTML,並將其與ID爲「內容」原型Ajax.PeriodicalUpdater插入時無法連接到服務器

var updater = new Ajax.PeriodicalUpdater('content', '/Doc?'+d.getTime(), 
    { 
    method: 'post', 
    frequency: 5, 
    }); 

的問題是插入一個div空字符串,當服務器關閉(它運行在正在修改和服務器數據的應用程序內部),更新程序然後只是清除內容div。

有沒有辦法讓它這樣當PeriodicalUpdater超時,獲得404等,它只是讓內容保持不變?我寧願將最後可用的數據留在那裏,不要被刪除。


爲了完整,這是我的全部代碼:

<html> 
<head> 
<title></title> 
<script type="text/javascript" src="/Prototype"></script> 
<script type="text/javascript"> 
var css; 
var css_data; 

function load_content() 
{ 
    var d = new Date(); 

    css = document.createElement('style'); 
    css.setAttribute('type', 'text/css'); 
    if(css.styleSheet) { css.styleSheet.cssText = '';} //Because IE is evil 
    else { css_data = document.createTextNode(''); css.appendChild(css_data); } //And everyone else is cool 
    document.getElementsByTagName("head")[0].appendChild(css); 

    var updater = new Ajax.PeriodicalUpdater({success: 'content'}, '/%doc_path%?'+d.getTime(), 
    { 
    method: 'post', 
    frequency: 5, 
    onSuccess: function(transport) { 
      new Ajax.Request('/%css_path%?'+d.getTime(), { 
       method: 'post', 
       onSuccess: function(transport) { 
       if(css.styleSheet) { css.styleSheet.cssText = transport.responseText} 
       else { 
        var new_css_data = document.createTextNode(transport.responseText); 
        css.replaceChild(new_css_data, css_data); 
        css_data = new_css_data; 
       } 
       } 
      }); 
      new Ajax.Request('/%title_path%?'+d.getTime(), { 
       method: 'post', 
       onSuccess: function(transport) { 
       document.title = transport.responseText; 
       } 
      }); 
    } 
    }); 
} 

</script> 

</head> 

<body> 
<div id="content"></div> 

<script type="text/javascript"> 
    load_content(); 
</script> 

</body> 
</html> 

正如你所看到的,我試過三聯的解決方案......但仍然沒有去。當請求失敗時,它會用空白數據更新。既然我現在已經掌握了所有的東西,任何人都可以看到我犯的錯誤。

注意:忽略像%doc_path%這樣的字符串...這些只是我使用的控制字符串,以便稍後可以用編程方式替換每個文檔的正確路徑...所有在服務器上完成的東西,這並不重要。


@Vinze

根據該文件,onFailure處是「時調用請求完成和存在的狀態代碼,但不是在2XY家庭。如果一個特定代碼的回調定義這被跳過,並在onComplete之前發生。「

但是,如果服務器停了,它不會超時,並且根本沒有狀態碼嗎?也許我的理解是錯誤的...

+0

@基礎 - 啊。在將來只需要標記,你不需要編輯,因爲我們有一個mod工具來做這種聰明的事情。但是,無論如何感謝:) – Kev 2012-07-13 22:59:46

回答

1

將一個對象(不是字符串)作爲第一個參數傳遞給PeriodicalUpdater。只有成功的AJAX調用纔會調用鍵值爲「成功」的值。

new Ajax.PeriodicalUpdater({success: 'content'}, '/Doc?'+d.getTime(), 
    { 
    method: 'post', 
    frequency: 5, 
    }); 

More on Ajax.Updater(從中PeriodicalUpdater繼承)在此

1

你可以添加一個onFailure處選項列表中選擇,因爲Ajax.PeriodicalUpdater繼承的Ajax.Request(http://www.prototypejs.org/api/ajax/request

的屬性,在你可能會更對面對以下鏈接中的「onComplete」或任何「請求生命週期」的使用感興趣

0

如何自己完成這一切?

開始,將調用更新功能:

function requestMoreInfo(){ 
new Ajax.Request('url', 
    { 
    method:'get', 
    parameters: "someget=here", 
    onSuccess: handleTheReturn 
    }); 

} 

然後創建將要處理的答案來自服務器的功能:

function handleTheReturn(reply){ 
    var newMessages = eval('(' + reply.responseText + ')'); 
    //update your element or whatever 
} 

,然後運行它每20(或任何)秒:

new PeriodicalExecuter(requestMoreInfo, 20); 

然後,只需將第一個requestMoreInfo添加到您的onload函數n和你的好去...現在要解決你的問題,只需在handleTheReturn函數中驗證newMessages var,並且你可以做任何你想做的事(讓服務器發送一個JSON對象來知道是好的,或者其他一些代碼,或搜索你想避免的具體錯誤!

+0

降票?告訴我爲什麼! – DFectuoso 2009-01-13 15:31:29

0

的更多細節。

Ajax.PeriodicalUpdater不從的Ajax.Updater 繼承,作爲http://www.prototypejs.org/api/ajax/periodicalupdater解釋說:

Ajax.PeriodicalUpdater不是的Ajax.Updater的一個特例,儘管它的名字。

它確實向前的可選參數的Ajax.Updater(本身從Ajax.Request的繼承的類),它似乎暗示它相當於實例化的Ajax.Request並傳遞迴調到它。

我已經測試過,可以確認在這種情況下添加onFailure功能而不是。也不添加onException。

因爲它們被傳遞給由Ajax.PeriodicalUpdater實例化的Ajax.Updater對象,所以它們都可能已經可以工作。但是,經過一些調試後,Ajax.Updater似乎從不將不可用的服務器視爲異常或故障。也就是說,即使定義爲{success:'content',failure:'failureContent'},成功的容器也會始終更新(在這種情況下會被清空)。

另外,根據我的測試,當服務器沒有響應時,Ajax.Updater(和Ajax.PeriodicalUpdater)既不會調用onSuccess()也不會調用onComplete()。

其實,我設法拿到了唯一的回調是ON0,如​​下:

new Ajax.PeriodicalUpdater('content', 'url', { 
    frequency: 5, 
    on0: function(requester, exception) { 
     alert("ERROR 0"); 
    } 
}); 

看起來0是Ajax.Request的錯誤代碼(Ajax.Updater的父類)時,服務器無法訪問。

但是,壞消息是on0()在之前被稱爲內容被更新/清空,這意味着不可能用自定義內容替換該內容。

據我所知,在服務器無法訪問的情況下,更新內容後根本不會調用任何可選回調。

對於Ajax.PeriodicalUpdater和Ajax.Updater都是如此。這意味着我看到得到想要的行爲的唯一方法是直接使用Ajax.Request。