Проблема с доступом к содержимому div, когда этот контент поступил из Ajax-вызова - PullRequest
0 голосов
/ 16 сентября 2008

Вот очень простой пример прототипа.

Все, что он делает, это при загрузке окна ajax-вызов, который вставляет некоторый html в div.

<html>
    <head>
        <script type="text/javascript" src="scriptaculous/lib/prototype.js"></script>
        <script type="text/javascript">
            Event.observe(window, 'load', function(){
                new Ajax.Request('get-table.php', {
                    method:  'get',
                    onSuccess:  function(response){
                        $('content').innerHTML = response.responseText;
                        //At this call, the div has HTML in it
                        click1();
                    },
                    onFailure:  function(){
                        alert('Fail!');
                    }
                });
                //At this call, the div is empty
                click1();
            });

            function click1(){if($('content').innerHTML){alert('Found content');}else{alert('Empty div');}}
        </script>
    </head>
    <body><div id="content"></div></body>
</html>

Что сбивает с толку, так это контекст, в котором Prototype понимает, что в div действительно есть что-то.

Если вы посмотрите на часть onSuccess вызова ajax, вы увидите, что в этот момент $ ('content'). InnerHTML содержит в себе материал.

Однако, когда я проверяю $ ('content'). InnerHTML сразу после вызова ajax, он кажется пустым.

Это должно быть фундаментальное недоразумение с моей стороны. Кто-нибудь хочет мне это объяснить?


Редактировать
Я просто хочу кое-что уточнить. Я понимаю, что вызов Ajax является асинхронным.

Вот фактический порядок выполнения вещей и почему меня это смущает:

  1. Страница загружается.
  2. Выполнен Ajax-запрос к get-table.php.
  3. Вызов click1 () INSIDE onSuccess происходит. Я вижу предупреждение, что у div есть содержимое.
  4. Вызов click1 () ПОСЛЕ вызова Ajax. Я вижу предупреждение о том, что div пуст.

Таким образом, код выполняется в том порядке, в котором он написан, но DOM не обновляется в том же порядке.


Редактировать 2 Таким образом, краткий ответ заключается в том, что размещение кода в onSuccess - правильное место.

Другой случай, который следует рассмотреть, это тот случай, когда вы выполняете Ajax-вызов, а затем делаете еще один Ajax-вызов из onSuccess первого вызова, например:

new Ajax.Request('foo.php',{
  method:  'get',
  onSuccess:  function(response){
    doAnotherAjaxCall();
  }
  });

function doAnotherAjaxCall(){
  new Ajax.Request('foo.php',{
    method:  'get',
    onSuccess:  function(response){
      //Anything that needs to happen AFTER the call to doAnotherAjaxCall() above
      //needs to happen here!
    }
  });
}
* *} Тысяча сорок-одина);

Ответы [ 4 ]

5 голосов
/ 16 сентября 2008

Первая буква AJAX обозначает «асинхронный». Это означает, что вызов AJAX выполняется в фоновом режиме, то есть вызов запроса AJAX немедленно возвращает . Это означает, что код сразу после того, как он обычно выполняется до , вызывается обработчик onSuccess (и до того, как запрос AJAX даже завершится).

Принимая во внимание ваш отредактированный вопрос: в некоторых браузерах (например, Firefox) окна предупреждений не так модальны, как вы думаете. Асинхронный код может появиться в окне предупреждения, даже если другой уже открыт. В этом случае более новое окно предупреждения (из асинхронного кода) отображается поверх более старого. Это создает иллюзию того, что асинхронный код был выполнен первым.

0 голосов
/ 16 сентября 2008

Элемент onSuccess вызова функции, который вы выполняете для обработки вызова AJAX, выполняется во время получения ответа от get-table.php. Это отдельная функция Javascript, которую вы говорите браузеру вызывать, когда получаете ответ из get-table.php. Код под вашим вызовом AJAX.Request доступен сразу после вызова AJAX.Request, но не обязательно до вызова get-table.php. Так что да, я думаю, что есть некоторое фундаментальное недопонимание того, как работает AJAX, вероятно, из-за использования библиотеки, чтобы скрыть детали.

0 голосов
/ 16 сентября 2008

Это Ajax-вызов, который является асинхронным. Это означает, что сразу после этого запроса ответ еще не вернулся, поэтому $ ('content') все еще пусто.

0 голосов
/ 16 сентября 2008

Не попробовав свой код: вызов AJAX выполняется асинхронно. Это означает, что ваш Ajax.Request срабатывает, затем переходит к вызову click1 (), который сообщает, что div пуст. В какой-то момент после этого запрос Ajax завершается, и содержимое фактически помещается в div. На этом этапе выполняется функция onSuccess, и вы получаете ожидаемый контент.

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