当用户第一次在iPhone上加载我的页面时(在Android,IE,FF上正常工作) Opera,Chrome,Safari),由Prototype / Scriptaculous Ajax.Updater调用生成的页面的两个部分是乱码 - 它们看起来好像是二进制文件被注入到页面中或字符映射被扰乱。如果用户然后重新加载页面,或使用页面的选项卡通过Ajax.Updater请求导航,那么一切都很好。这只是第一次在浏览器会话中加载页面时发生这种情况。以下是具有一些上下文的相关调用:
soundManager.onready(function(){
new Ajax.Updater('PlayerSet', 'http://' + location.host +
playerHTMLloc, {method: 'post', onComplete: startPlayer});
});
每个站点访问只调用一次(因此用户必须重新加载才能使其正确显示)。它调用一个将html写入stdout的python脚本。
这是另一个:
show: function(elm) {
var id = elm.identify();
elm.addClassName(id.sub('-html', '-selected'));
var link = 'ajax/' + id.sub('-', '.');
$('centercontent').update('<div id="floaterForSpinner"></div><div
id="centerSpinner"><img src="images/ajax-loader.gif"></div>');
new Ajax.Updater('centercontent', link, {evalScripts: 'true',
method: 'post'});
}
这是处理页面标签的小类的一部分。同样,只有第一次调用show()才会发生错误。之后,tabber正常工作。更新程序只是从服务器中提取html文本文件。
Prototype / Scripty 1.6.1 / 1.8.3和1.7 / 1.9.0都会出现问题。
对于第一次和后续加载,post和receive标题是相同的,并且每个Firebug的所有情况下可接受的charset都是Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
。
我自己没有iPhone,而且我尝试过的iPhone或在线iPhone模拟器都没有重现这个问题,因此测试这将是一场噩梦。因此,任何人都可以提供帮助的事情,呃,非常......非常有帮助。
更新基于我在GG原型列表中收到的问题:
加载DOM后调用上面的所有代码:
document.observe('dom:loaded', function() {
Ajax.Responders.register({onCreate: removeListeners});
Ajax.Responders.register({onComplete: postAJAX});
new Lightbox();
initMailList();
AT = new AjaxTabber('tablist');
initInternalLinkListener();
initIE6msgClose();
$('PlayerSet').update('<div style="text-align:center">
<img src="images/ajax-loader.gif"></div>');
soundManager.onready(function(){
new Ajax.Updater('PlayerSet', 'http://' + location.host +
playerHTMLloc, {method: 'post', onComplete: startPlayer});
});
});
AjaxTabber是包含我之前提到的show()函数的选项卡类。上面的document.observe函数位于标题中的最后一个js文件中。
更新#2:
更换
document.observe('dom:loaded', function() {
带
Event.observe(window, 'load', function() {
第三个代码块中的修复了乱码负载。但是,该修复提出了新的问题:
答案 0 :(得分:0)
在这样的相同元素上调用update()然后调用Ajax.Updater可能会引入难以诊断的时序问题。我建议这样做(为你的Ajax加载元素添加一个“加载”指示符):
new Ajax.Updater('elementID', '/path/to/server', {
parameters: {},
method: 'get',
onCreate: function(){
$('elementID').update('placeholder html here');
},
onSuccess: function(){
// any other cleanup here
}
});
onCreate回调挂钩将保证在发送请求之前运行并完成,并且该元素由A.U更新。