我正在使用以下内容获取一些更新的HTML并将其插入到ID为“content”的div中
var updater = new Ajax.PeriodicalUpdater('content', '/Doc?'+d.getTime(),
{
method: 'post',
frequency: 5,
});
问题在于,当服务器关闭时(它正在修改并提升数据的应用程序内部运行),更新程序会简单地清除内容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>
正如你所看到的,我尝试了Triptych的解决方案......但仍然没有去。当请求仍然失败时,它会使用空白数据进行更新。既然我现在已经完成了所有事情,那么任何人都可以看到我正在犯的错误。
注意:忽略像%doc_path%这样的字符串...这些只是我使用的控制字符串,以便以后可以用编程方式替换每个文档的正确路径......所有在服务器上完成的东西都没有对此很重要。
根据文档,onFailure是“当请求完成且其状态代码存在但不在2xy系列中时调用。如果定义了特定于代码的回调,则会跳过此选项,并在onComplete之前发生。”
但是如果服务器停止了,它不会只是超时并且根本没有状态代码吗?也许我理解错了......
答案 0 :(得分:1)
您可以在选项列表中添加onFailure选项,因为Ajax.PeriodicalUpdater继承了Ajax.Request(http://www.prototypejs.org/api/ajax/request)的属性
相反,您可能对使用“onComplete”或下面链接中的“请求生命周期”更感兴趣
答案 1 :(得分:1)
将对象(不是字符串)作为第一个参数传递给PeriodicalUpdater。键入为“成功”的值只会在成功的AJAX调用时调用。
new Ajax.PeriodicalUpdater({success: 'content'}, '/Doc?'+d.getTime(),
{
method: 'post',
frequency: 5,
});
More on Ajax.Updater(PeriodicalUpdater继承)
答案 2 :(得分: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函数中就可以了...现在解决你的问题,只需在handleTheReturn函数中验证newMessages var,你就可以做任何你想做的事情(让服务器发送一个JSON)要知道的对象是好的,或者其他一些代码可能,或者搜索您想要避免的特定错误!
答案 3 :(得分:0)
关于此的更多细节。
Ajax.PeriodicalUpdater not 继承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。