Можно ли как-нибудь отловить завершение запроса, создаваемого checkValidity (html5 api)?

Здравствуйте.
Возникла проблема. Есть форма, которая валидируется при помощи html5 api, в частности - checkValidity. Соответственно, на сервер шлется post-запрос, и нужно получить callback, чтобы, в зависимости от результата запроса, решить, отправлять форму, или нет. Проблема заключается в том, что запрос checkValidity не поддается перехвату вообще!

Есть такой код, который работает со всеми post-запросами, кроме того, который нужен.
var XMLHttpListener = new Object();
XMLHttpListener.tempOpen = XMLHttpRequest.prototype.open;
XMLHttpListener.tempSend = XMLHttpRequest.prototype.send;
XMLHttpListener.callback = function () {
	// кэллбэк
}

XMLHttpRequest.prototype.open = function(a,b) {
  if(!a) var a='';
  if(!b) var b='';
  XMLHttpListener.tempOpen.apply(this, arguments);
  XMLHttpListener.method = a;  
  XMLHttpListener.url = b;
  if(a.toLowerCase() == 'get') {
    XMLHttpListener.data = b.split('?');
    XMLHttpListener.data = XMLHttpListener.data[1];
  }
}

XMLHttpRequest.prototype.send = function(a,b) {
  if(!a) var a='';
  if(!b) var b='';
  XMLHttpListener.tempSend.apply(this, arguments);
  if(XMLHttpListener.method.toLowerCase() == 'post') XMLHttpListener.data = a;
  
  XMLHttpListener.callback();
}

Вопрос: есть ли более универсальный способ перехвата ajax-запросов, позволяющий реализовать вышеописанное? К сожалению, вариант if(checkValidity()) не прокатит, т.к. придется влезать в ядро чужого плагина.
  • Вопрос задан
  • 850 просмотров
Решения вопроса 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Я не понимаю этих приёмов с искажением прототипа XMLHttpRequest...
Что же касается формы и проверки ограничений, то она не отправится, если валидация вернула отрицательный результат.

Если форма не прошла валидацию (и событие submit бесполезно), но отправить-таки хочется, ничто не мешает отменить нативный вызов валидации и запускать проверку вручную.
Пример

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

Второй вариант можно организовать, не ища элементы формы (по атрибуту required или свойству willValidate). Хотя событие invalid не всплывает, его можно ловить в фазе распространения. Как и в предыдущем случае, информацию об ошибках валидации получаем с помощью свойства validity.
Пример
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы