Ньюансы работы Opera с XMLHttpRequest или почему пусто в responseText
Понедельник, 10 сентября 2007Учиться-учиться и ещё раз учиться, потому что всегда приятно узнавать что-то новое, даже о, казалось бы, давно известных вещах.
Комментарий товарища Maelow к посту про Anti-Smap Image + Ajax Comment :
“в опере у меня при вводе неверных символов в КАПЧЕ выскакивает окно с ошибкой не содержащей текста”
заставил запустить установленную, но редко применяемую Opera, дабы удостовериться в том, что действительно выдаётся пустое сообщение.
Долгие попытки поиска ошибок в коде плагина, а так же гугленье заставили сделать вот какой вывод о работе XMLHttpRequest, а точнее о получаемых ответах:
“При получении Opera в header’е страницы, возвращаемой запросом при помощи XMLHttpRequest, любого статуса кроме 200, данные, содержащиеся на странице, не попадают в responseText.”
Именно поэтому и не работали в Опере сообщения об ошибках Ajax-Comment, который возвращал текст сообщения вместе с 406 (Not Acceptable) ошибкой. FireFox и IE ловили ошибку и, получив ещё и текст со страницы, выдавали alert как нужно, а Опере ничего не оставалось, кроме как показывать пустые строки.
В принципе всё достаточно логично, только вот в скрипте Ajax-Comment пришлось делать “финт-ушами” и вносить изменения, дабы и Опера жила припеваючи.
Сам способ я считаю не слишком хорошим, но если кто знает более простой, то прошу дать ссылку или описать свой метод.
Поступил я так: заменил header ответа с 406 на 200 (вот это-то, по сути, и есть не правильное, в плане логики, действие) и добавил в сам текст сообщения - “Error!”.
В java-script, который обрабатывал ответы, добавил проверку на наличие этого сообщения, а затем уже вызов alert без него:
if(request.responseText.indexOf('Error!')==0) {
alert(request.responseText.substr(6));
return;
}
Если вы уже поставили себе Ajax-Comment, то просто замените файл ajax-commens.php, взяв его из этого архива. Во всех остальных сборках я уже обновил этот файл.

