Ajax.Updater输出仅在iPhone首次加载时出现乱码

时间:2012-04-02 19:39:33

标签: iphone ajax character-encoding prototypejs

当用户第一次在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() {
第三个代码块中的

修复了乱码负载。但是,该修复提出了新的问题:

  1. 为什么Ajax.Updater加载需要加载整个页面才能正常工作? DOM加载应该是所有必要的。没有理由需要为ajax加载加载图像。
  2. 我的整体网页性能现已大幅下降,以解决iPhone唯一的问题。一旦DOM加载完成,我真的想回去加载。

1 个答案:

答案 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更新。