Почему код Javascript, возвращенный с AJAX, не записывается в указанном <div>, но заменяет всю страницу? - PullRequest
2 голосов
/ 15 июля 2011

Я запрашиваю с AJAX (используя jQuery) тег, который содержит вызов функции Javascript для сервера Apache + PHP.Вот код HTML и AJAX:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://localhost/LivingLab/javascript/jquery.min.js"></script>
</head>

<body>
<a href="javascript: void(0)" onclick="
    $.post(
        'http://localhost/test.php',    // server target page
        {some_var: 'abc'},              // data to be sent via POST method
        function(data) {                // JS callback function
            $('#container').html(data); // innerHTML of <div id="container"> will be replaced
        }
    )
">Click me!</a>
<div id="container"></div>
</body>
</html>

AJAX запрашивает страницу 'http://localhost/test.php', которая имеет следующий код PHP:

<?php
    echo '<script type="text/javascript"> document.write("Javascript output"); </script>';
?>

Когда я нажимаю на ссылку, послеAJAX-запрос, вся страница заменяется на «вывод Javascript», вместо того, чтобы писать это только внутри тега div с идентификатором «container».

Если скрипт сервера PHP пишет что-то другое, а не тег скрипта, напримерэто:

<?php echo 'text' ?>

вызов AJAX ведет себя нормально, заменяя div на id "container", а не на всю страницу.

Я пытался исследовать данные HTTP, передаваемые этими страницами, с помощью Wireshark ипохоже, это не проблема HTTP, потому что ответ сервера точно такой, каким он должен быть:

<script type="text/javascript"> document.write("Javascript output"); </script>

Запуск кода Javascript без AJAX не заменяет всю страницу, это происходит только тогда, когда тег scriptвернулся с использованием AJAX.A заметил такое же поведение в Firefox 3 и 5, а также в Google Chrome.

Почему это происходит?

Ответы [ 3 ]

9 голосов
/ 15 июля 2011

document.write обычно используется во время основной загрузки страницы, во время которой он выводит поток анализа, который браузер считывает для отображения главной страницы. Если вы используете после , когда начальная загрузка страницы завершена, он неявно делает open для документа, который полностью разрушает документ и начинает заново с вновь записанного содержимого.

Короткая версия: Используйте document.write только во время загрузки главной страницы (если затем). После загрузки страницы используйте манипуляцию DOM.

Пример ( живая копия ):

<body>
  <input type='button' id='theButton' value='Click Me'>
  <script>
    document.write(
      "<p><code>document.write</code> is fine here, during " +
      "the main load of the page.</p>");
    document.getElementById("theButton").onclick = function() {
      document.write(
        "<p>But not here, because the initial " +
         "page load is complete and using " +
         "<code>document.write</code> at this point tears " +
         "down the document and starts  new one.</p>");
    };
  </script>
</body>

Подробнее о спецификации HTML DOM2 , спецификации HTML5 и MDC :

  • document.write: DOM2 | HTML5 | MDC
  • document.open: DOM2 | HTML5 | MDC
    (неявно вызывается document.write, если вы вызываете его после загрузки страницы)
0 голосов
/ 15 июля 2011

https://groups.google.com/forum/#!topic/jquery-en/tzu5n5k8Jp4

<script type="text/javascript"> document.write("Javascript output"); </script>

Почему бы просто не вернуть «Вывод JavaScript», так как вы все равно изменяете значение $ ('# container'), нет необходимости пытаться использовать встроенный JavaScript document.write для его записи.

0 голосов
/ 15 июля 2011

Поскольку jQuery распознает блок javascript и запускает его для страницы, а не для целевого контейнера.

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