onComplete для Ajax.Request глючит с кэшированным контентом - PullRequest
1 голос
/ 24 января 2010

У меня есть Ajax.Request, в котором я использую onLoading и onComplete, чтобы показать и скрыть GIF-анимацию загрузки. Проблема в том, что каждые 10 щелчков или около того анимация загрузки не скрывается и просто остается там анимацией, даже если запрос ajax успешно завершен. У меня есть несколько элементов div, каждый из которых имеет собственную анимацию загрузки и щелчок мышью с Ajax.Request, который выглядит следующим образом:

    <div id="word_block_<%= word_obj.word %>" class="word_block" >
    <%= image_tag("ajax-loader_word_block.gif", :id => "load_animation_#{word_obj.word}",
                    :style => 'display:none') %>
    <a href="#" onclick="new Ajax.Request('/test/ajax_load', 
     {asynchronous:true, evalScripts:true, 
      onLoading:function() {
        Element.show('load_animation_<%= word_obj.word %>')},
      onComplete:function(){
        Element.hide('load_animation_<%= word_obj.word %>')}}); 
        return false;">Click Here</a>  
    </div>

Похоже, что-то может быть не так с этим? Может быть, я должен попытаться удалить встроенный onclick и добавить onclick программно с помощью javascript? Я действительно понятия не имею, почему это происходит. Я использую библиотеку прототипов с ruby ​​на рельсах.

1 Ответ

0 голосов
/ 16 марта 2010

Я обнаружил, что свойство onLoading также ненадежно ... Допустим, ваш запрос уже кэширован и почти сразу возвращается к вашему внешнему коду. Теперь давайте также скажем, что по какой-то причине выполнение метода onLoading занимает больше времени, чем метод onComplete. Наконец, давайте сходим с ума и предположим, что ajax является асинхронным и что он не будет ждать завершения метода onLoading, прежде чем запустит метод onComplete. И тогда у вас есть причина вашей проблемы! Подводить итоги: - Запрос отправлен - метод onLoading запущен, но по какой-то причине еще не запущен - запрос возвращается практически мгновенно - метод onComplete запускается и запускается сразу => вы получите метод onComplete, который будет завершен до запуска onLoading: ваш элемент будет скрыт и затем отобразится!

В качестве обходного пути, почему бы не создать свой "Element.show ('load_animation _ <% = word_obj.word%>')}" прямо перед созданием объекта запроса Ajax? Таким образом, вы не полагаетесь на метод onLoading и «асинхронность», которая сопровождает его?

Кроме того, я всегда добавляю «requestHeaders: [« If-Modified-Since »,« Fri, 31 Dec 1999 23:59:59 GMT »]» в мои запросы ajax, чтобы предотвратить кэширование запроса, особенно в IE, где кэшированные запросы AJAX могут запутаться!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...