Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не могу вызвать обработку xhr.responseXML (https://javascript.ru/forum/jquery/44449-ne-mogu-vyzvat-obrabotku-xhr-responsexml.html)

Veterinar 20.01.2014 10:57

Не могу вызвать обработку xhr.responseXML
 
Умоляю! Подскажите, пожалуйста!

Данные отправляются на сервер XMLHttpRequest. Всё передаётся, возвращается с сервера правильный XML. Только не могу понять почему не вызывается функция с обработкой ответа сервера.
Просто вызывается скрипт PHP и не отдаётся обратно в JS.

Только, пожалуйста без издёвок! Я только ещё начинаю разбираться...

Вот JS отправляющий данные и тот, который должен принять ответ в нём вообще всё убрано - пусть хотя бы чо-нить булькнет а alert-е...

function upload(file, onSuccess, onError, onProgress) {
  var xhr = new XMLHttpRequest();
  xhr.onload = xhr.onerror = function() {
    if(this.status != 200 || this.responseText != 'OK') {
      onError(this);
      return;
    }
    onSuccess(xhr.responseXML);
	return false;  // тут ставил true и ваще ничего не ставил и вовсе без "return" - результат один - фигу.
  }
  xhr.upload.onprogress = function(event) {
    onProgress(event.loaded, event.total);
  }
  xhr.open("POST", "newphoto.php", true); 
  xhr.send(file);
}

function onSuccess(responseXML){
alert('бульк :-)');
}

krasovsky 20.01.2014 11:18

Проверь выполняется ли условие в if'e, если выполняется, то понятно почему - у тебя там return стоит. Соответственно до osnSuccess не доходит. Возможно стоит изменить условие.

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

Veterinar 20.01.2014 13:20

Вроде понятно, что с RETURN может не передаваться управление, НО, я убирал его - и ничего не меняется!

danik.js 20.01.2014 13:42

Veterinar, скрипт newphoto.php точно отсылает "OK"?
Функцию onSuccess точно передаешь при вызове функции upload?
Нажми F12 в браузере - там все ответы гарантирую 100%!!!

Veterinar 20.01.2014 14:08

Вот же, блин!
Ну, конечно же! Скрипт же отдает XML, а вовсе не ОК!
Не, ну, вот же!

Спасибо, danik.js!

Veterinar 20.01.2014 14:16

Оно, конечно, спасибо!

Только, увы, ничего не дало... передаются данные в PHP и не вызывается и ничего не передается onSuccess

krasovsky 20.01.2014 14:53

Я бы посоветовал разделить onerror и onload. И судя по всему консолью ты не пользуешься. И очень зря потому что без нее скрипты сложнее чем навешивание клика ненаписать.

В конце концов, убери к чету и if и функцию пропиши console.log('Прошло') и смотри в консоли. Упало в консоль?Значит все ок, пробуй просто функцию свою.

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

Veterinar 20.01.2014 16:43

Так в том и дело, что в отладчике не успеваю перехватить событие - сразу переводит на серверный скрипт!

Veterinar 20.01.2014 23:06

Поставил вывод responseXML и responseText - и тот, и другой пустые. Почему? - при вызове серверного скрипта возвращается валидный XML. Данные на сервере сохраняются.
Нихрена не понимаю! Где глюк, подскажите!

function log(html) {
  document.getElementById('beforeshow').innerHTML = html;
}

function onSuccess(responseXML) {
	alert('Вызвана onSuccess\n'+responseXML);
}

function onError() {
  log('error');
}

function onProgress(loaded, total) {
  log(loaded + ' / '+ total);
}
//-------------------
var form = document.forms.newphoto;
form.onsubmit = function() {
  var file = this.elements.file.files[0];  
  if (file) upload(file, onSuccess, onError, onProgress);  
}

function upload(file, onSuccess, onError, onProgress) {
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "newphoto.php", true); 
  xhr.onreadystatechange = function() {
		alert('upload: \n'+xhr.responseText+'\n'+xhr.responseXML); // оба пустые! :(
  		onSuccess(xhr.responseText);
		return;
  };
  xhr.send(file);
//  console.log('Прошло');
}

При вызове алерта из функции upload успеваю заметить сообщение и запускает серверный скрипт с XML....

Уважаемые! Помогите пожалуйста!

danik.js 21.01.2014 00:30

функция onreadystatechange вызывается несколько раз. Тебя должен интересовать только случай когда xhr.readyState == xhr.DONE - только тогда будет доступен response.
Свойство responseXML будет доступно только если сервер выставил правильный заголовок Content-Type (application/xml). А вобще, xml не модно. Нынче JSON практикуется повсеместно.


Часовой пояс GMT +3, время: 21:36.