Ajax с PHP и XML, проблема IE getElementsByTagName - PullRequest
2 голосов
/ 04 августа 2009

У меня проблема с getElementsByTagName в IE (7 и 8).

У меня есть поиск адреса, который возвращает каждый предложенный адрес (в виде строки XML) в переменную сеанса PHP, к которой затем осуществляется доступ с помощью функции AJAX, которая возвращает запрошенную переменную сеанса.

Каждая переменная сеанса устанавливается в шаге 1 поиска адреса ajax (я пробовал без кодировки символов и с utf-8):

$_SESSION['addrHint_' . $k1] = '<?xml version="1.0" encoding="ISO-8859-1"?>';
$_SESSION['addrHint_' . $k1] .= '<Address>';
$_SESSION['addrHint_' . $k1] .= '<Postcode>' . $v1->Postcode . ' </Postcode>';
$_SESSION['addrHint_' . $k1] .= '<Line1>' . $v1->Line1 . ' </Line1>';
$_SESSION['addrHint_' . $k1] .= '<Line2>' . $v1->Line2 . ' </Line2>';
$_SESSION['addrHint_' . $k1] .= '<Line3>' . $v1->Line3 . ' </Line3>';
$_SESSION['addrHint_' . $k1] .= '</Address>';

И затем извлекается на шаге 2:

header('Content-Type: text/xml');
print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

В AJAX js, когда состояние готово, оно выполняет среди других подобных строк кода следующее:

var xmlDoc = xmlHttp.responseXML;
var xmlRoot = xmlDoc.documentElement;
var postcode = xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue;
document.forms[0]["address"+addr+"_Postcode"].value = postcode.substring(0, postcode.length-1);

(Он выполняет аналогичные действия для каждой строки адреса.) Фрагмент длины 1 находится там, потому что мне пришлось добавить пробел к каждому элементу, чтобы остановить проблему, возникшую у меня, когда элемент был нулевым.

В Firefox работает нормально, но не в IE. С тех пор я был в Google и нашел ряд результатов среди первых 5 страниц, но никаких решений. Я был бы очень признателен, если бы кто-нибудь мог пролить свет на это.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Вместо того, чтобы изменять возвращаемые значения, возможно, вам следует реализовать проверку ошибок вокруг кода, который выбирает значения вашего узла.

Если вы делаете тонну цепочек, вы не можете проверить на нули. Вместо цепочки вот так:

xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue

Почему бы не добавить некоторую проверку ошибок заранее? Что-то вроде:

var postCodes = xmlRoot.getElementsByTagName("Postcode");
if( postCodes && postCodes[0] && postCodes[0].childNodes[0] ) {
    document.forms[0]["address"+addr+"_Postcode"].value = postCodes[0].childNodes[0].childNodes[0].nodeValue;
}

Таким образом, вы будете пытаться выполнить назначение, только если там нет данных. Получение пустого значения ввода там, где вы ожидаете.

Теперь все эти цепочки и оператор if могут стать утомительными, поэтому вы можете обернуть их в функцию, если хотите.

Не стесняйтесь проверить рабочий пример здесь: http://jsbin.com/ahidu

ура!

0 голосов
/ 04 августа 2009

Используйте инструменты разработчика IE (IE8: встроенный, IE7: Панель инструментов разработчика ) для отладки JavaScript.
Вы также можете добавить код отладки консоли , например. отслеживать состояние готовности.
На стороне сервера установите php error_reporting в E_ALL и следите за ошибкой web-сервера error.log (где будут появляться сообщения php)

0 голосов
/ 04 августа 2009

print_r ???

print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

"$ SESSION ['addrHint '. $ _ REQUEST ['addr']]" не является массивом.

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