2012-04-02 5 views
4

Когда пользователь загружает мою страницу в первый раз на iPhone (отлично работает на Android, IE, FF, Opera, Chrome, Safari), две части страницы сгенерированный вызовом Prototype/Scriptaculous Ajax.Updater, искажены - они выглядят так, как будто двоичный файл был введен на страницу или карта символов была скремблирована. Если пользователь затем перезагружает страницу или использует вкладки страницы для навигации по запросам Ajax.Updater, все будет хорошо. Это первый раз, когда страница загружается в сеансе браузера, когда это происходит. Вот соответствующие вызовы с немного контекста:Выход Ajax.Updater искажен только при первой загрузке iPhone

soundManager.onready(function(){ 
    new Ajax.Updater('PlayerSet', 'http://' + location.host + 
     playerHTMLloc, {method: 'post', onComplete: startPlayer}); 
}); 

Это называется только один раз за посещение сайта (так что пользователь должен перезагрузить, чтобы получить его, чтобы правильно отобразить). Он вызывает скрипт python, который записывает html в stdout.

Вот другой:

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.

Заголовки отправления и приема идентичны для первой и последующих нагрузок, а допустимая кодировка - Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 во всех случаях для каждого Firebug.

У меня нет iPhone сам, и ни один из синглов iPhone или онлайн-игр я не пытался воспроизвести проблему, поэтому тестирование этого будет кошмаром. Следовательно, все, что можно было бы сделать, чтобы помочь, было бы очень полезным.

UPDATE на основе вопросов, которые я получил в списке прототипа 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 вкладка класс, который содержит шоу(), о которой я упоминал ранее. Функция document.observe выше находится в последнем js-файле в заголовке.

UPDATE # 2:

Замена

document.observe('dom:loaded', function() { 

с

Event.observe(window, 'load', function() { 

в 3-м блоке кода фиксирует искаженные нагрузки. Однако в решении возникли новые вопросы/вопросы:

  1. Зачем загружать всю страницу для правильной работы для загрузки Ajax.Updater? Загрузка DOM должна быть все, что необходимо. Нет никакой причины требовать, чтобы изображения, загруженные для работы ajax, работали.
  2. Моя общая производительность страницы теперь существенно ухудшилась, чтобы исправить проблему iPhone. Я бы очень хотел вернуться к загрузке после завершения загрузки DOM.

ответ

0

Вызов обновления(), а затем 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 обратного вызова крючок будет гарантировать, чтобы запустить и полное до отправки запроса, а элемент обновляются по AU

+0

Привет, Уолтер, спасибо за ответ. К сожалению, вопрос составляет почти 2 года, и веб-страница, о которой идет речь, давно ушла, поэтому я не могу проверить ваше предложение. – elhefe

+0

Спасибо, у меня была небольшая ладонь, когда я смотрел на дату. – Walter