Простая проблема AJAX / PHP, но с длинным объяснением - PullRequest
2 голосов
/ 02 сентября 2011

Я только начал эту книгу - «AJAX и PHP, второе издание» и потерпел неудачу на самом первом примере. Я почти уверен, что код такой же, как он показан в книге, но все же, когда я запускаю index.htm в консоли ошибок (Mozzila 6.0) я получаю следующее: «xmlResponse имеет значение NULL http://localhost/ajax/quickstart/quickstart.js.I, не знаю, что происходит, но на самом деле не хочу сдаваться с самого начала, поэтому я сделаю все 3 файлы и, надеюсь, кто-нибудь укажет мне, где проблема. Вот index.htm:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>AJAX with PHP, 2nd Edition: Quickstart</title>
<script type="text/javascript" src="quickstart.js"></script>
</head>
<body onload="process();">
Server wants to know your name:
<input type="text" id="myName" />
<div id="divMessage" ></div>
</body>
</html>

вот быстрый старт.js:

// stores the reference to the XMLHttpRequest object
var xmlHttp = createXmlHttpRequestObject();
// retrieves the XMLHttpRequest object
function createXmlHttpRequestObject()
{
// stores the reference to the XMLHttpRequest object
var xmlHttp;
// if running Internet Explorer 6 or older
if(window.ActiveXObject)
{
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
xmlHttp = false;
}
}
// if running Mozilla or other browsers
else
{
try {
xmlHttp = new XMLHttpRequest();
}
catch (e) {
xmlHttp = false;
}
}
// return the created object or display an error message
if (!xmlHttp)
alert("Error creating the XMLHttpRequest object.");
else
return xmlHttp;
}
// make asynchronous HTTP request using the XMLHttpRequest object
function process(name)
{
// proceed only if the xmlHttp object isn't busy
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
// retrieve the name typed by the user on the form
name = encodeURIComponent(
document.getElementById("myName").value);
// execute the quickstart.php page from the server
xmlHttp.open("GET", "quickstart.php?name=" + name, true);
// define the method to handle server responses
xmlHttp.onreadystatechange = handleServerResponse;
// make the server request
xmlHttp.send();
}
else
// if the connection is busy, try again after one second
setTimeout('process()', 1000);
}
// callback function executed when a message is received from the
//server
function handleServerResponse()
{
// move forward only if the transaction has completed
if (xmlHttp.readyState == 4)
{
// status of 200 indicates the transaction completed
//successfully
if (xmlHttp.status == 200)
{
// extract the XML retrieved from the server
xmlResponse = xmlHttp.responseXML;
// obtain the document element (the root element) of the XML
//structure
xmlDocumentElement = xmlResponse.documentElement;
// get the text message, which is in the first child of
// the the document element
helloMessage = xmlDocumentElement.firstChild.data;
// display the data received from the server
document.getElementById("divMessage").innerHTML =
'<i>' + helloMessage
+ '</i>';
// restart sequence
setTimeout('process()', 1000);
}
// a HTTP status different than 200 signals an error
else
{
alert("There was a problem accessing the server: " +
xmlHttp.statusText);
        }
    }
}

и, наконец, quickstart.php:

<?php
// we'll generate XML output
header('Content-Type: text/xml');
// generate XML header
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
// create the <response> element
echo '<response>';
// retrieve the user name
$name = $_GET['name'];
// generate output depending on the user name received from client
$userNames = array('YODA', 'AUDRA', 'BOGDAN', 'CRISTIAN');
if (in_array(strtoupper($name), $userNames))
echo 'Hello, master ' . htmlentities($name) . '!';
else if (trim($name) == '')
echo 'Stranger, please tell me your name!';
else
echo htmlentities($name) . ', I don\'t know you!';
// close the <response> element
echo '</response>';
?>

Спасибо заранее! Лерон

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Я обнаружил пару проблем с вашим кодом.Упоминание некоторых из них

  • Вы звоните process() при нагрузке на тело.Это означает, что когда DOM готов, браузер вызывает функцию process().Это, IMO, не то, что вы хотели бы.Вместо этого есть кнопка, которая вызывает эту функцию процесса с событием onclick.Примерно так:

    <button onclick="process('YODA');return false;">Click Me!</button>
  • Процесс определен как принятие одного параметра с именем name, вы не передаете ни одного.Итак, исправьте что-то вроде этого:

    <button onclick="myProcess();return false;">Click Me!</button>

И это ваш JS-раздел / файл

function myProcess(){
    process(encodeURIComponent(document.getElementById('myName').value));
}
  • Не иметь этого document.getElementById(..)внутри функции процесса.Он не имеет смысла передавать этот параметр 'name'

. Я бы попросил вас использовать действительно хороший браузер, такой как Mozilla Firefox или Google Chrome (поскольку вы, кажется, предпочитаете IE6 в своем кодеПо крайней мере, кажется, что это!).У Chrome фантастическое окно инспектора.Как только вы это освоите, вы почти влюбитесь в него.Я сделал!; -)

Я бы предложил, чтобы вы использовали библиотеки, такие как jQuery (www.jquery.com) или что-то подобное, для ajax.Облегчает вашу жизнь!: -)

EDIT

Я бы предложил следующие шаги, так как вы хотите, чтобы этот фрагмент кода работал.

  • Сначала откройте URL [BASE-URL]/quickstate.php?name=YODA.Если все в порядке, вы должны увидеть XML, который должен быть ответом на ваш вызов AJAX.Если нет, то есть проблема с файлом PHP (или несколькими настройками вашего сервера), а не с чем-либо еще.Я чувствую, что этот шаг не будет проблемой.

  • Затем, после загрузки страницы, введите «YODA» в текстовое поле, введите его в поле URL браузера: javascript:process(''),Это должно вызвать функцию, которая имеет вызов ajax.Вы можете оставить вкладку в разделе передаваемых данных firebug (я точно не знаю название, но это раздел «Сеть» в Google Chrome).Вы можете проанализировать заголовки, отправленные в сценарии PHP, и ответ (включая коды ошибок HTTP), отправленный вам с сервера.Я также чувствую, что это не будет проблемой.

Причины проблемы: DOM страницы загружен.Вызов AJAX выполняется, когда DOM готов.Это означает, что запрос AJAX выполняется даже до того, как вы введете что-либо в этом текстовом поле.Таким образом, запрос, отправляемый на сервер, имеет пустое значение для параметра name.Это именно (IMO) причина, по которой у вас все не работает.Но даже тогда, это не причина, по которой вы видите null для XML.Не могли бы вы сделать console.log(xmlHttp) и сообщить нам результаты?

0 голосов
/ 02 сентября 2011

Это все выглядит правильно.Где находится скрипт PHP?На локальной установке Apache или на сервере у вас есть доступ?В Firefox вы можете установить невероятное дополнение Firebug, перейти на вкладку скриптов и посмотреть, что именно возвращает запрос.Что бы это ни было, Fx не распознает его как XML (следовательно, член xmlResponse равен NULL).

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