#ajax #forms #validation #prototypejs
#ajax #формы #проверка #prototypejs
Вопрос:
У меня есть формы на сайте, которые обрабатываются PHP, включая проверку. Обычно, если есть ошибки, пользователь возвращается в форму с соответствующими сообщениями об ошибках. Для пользователей с включенным javascript я пытаюсь написать javascript с Prototype, который использует AJAX для выполнения той же проверки PHP (чтобы избежать дублирования кода) и отображения сообщений об ошибках без фактической отправки формы и ожидания ее перезагрузки.
Скрипт работает очень хорошо, улавливая ошибки через AJAX и отображая их. Но, когда ошибок нет, я не могу отправить форму и перейти к следующей странице. Я работал с Event.stopObserving, но он просто перезагружает страницу (которая не является URL-адресом действия формы, форма отправляется на страницу, отличную от самой формы, так что это не сервер, отправляющий браузер обратно). Я не настолько хорош в javascript и Prototype, поэтому, вероятно, я упускаю что-то очевидное, но любая помощь была бы очень признательна. В любом случае, вот мой код:
document.observe("dom:loaded", function() {
$$('form')[0].observe('submit', validate);
function validate(event) {
event.stop();
// remove any existing error messages
var curErrors = $$('ul.error');
for( i=0, im=curErrors.length; i<im; i ) curErrors[i].remove();
$$('form')[0].request({
parameters: { 'js' : 1 },
requestHeaders: {Accept: 'application/json'},
onSuccess: function(req) {
var errors = req.responseText;
if( errors == '[]' ) {
// no errors, submit form to server
$$('form')[0].stopObserving('submit', validate);
$$('form')[0].submit();
} else {
// have errors, display error messages
var errors = errors.evalJSON(true);
for( var error in errors ) {
var errorMsg = '<ul class="error"><li>' errors[error] '</li></ul>';
var input = $$('[name="' error '"]')[0];
// display error message next to form field
. . .
}
}
},
onFailure: function() {
// can't validate here, let server do it
$$('form')[0].stopObserving('submit', validate);
$$('form')[0].submit();
}
});
}
});
Ответ №1:
Не вызывайте event.stop()
немедленно в своем методе validate — обработчик события произойдет раньше, чем событие, что означает, что метод validate будет запущен до отправки формы. Просто переместите эту строку в ветку инструкции if относительно сбоя проверки, и она должна работать просто отлично. http://www.prototypejs.org/api/event/stop
Комментарии:
1. Спасибо, это тоже была моя оригинальная мысль и то, чего я действительно хотел бы для чистого кода, но объект event, похоже, не передается в функцию onSuccess. Похоже, проблема с переменной областью видимости, и я не могу понять, как правильно ссылаться на событие в функции onSuccess. Я пытался передать ее с помощью req, но это не работает — это всегда просто неопределенный объект.
2. Разве вы не хотели бы использовать
new Ajax.Request()
функцию вместо$$('form')[0].request()
выполняемого вами вызова? Я считаю, что это сработало бы. В любом случае, как я уже говорил изначально, если событие действительно передает функцию OnFailure, тогда вы просто переместитеevent.stop()
вызов в метод сбоя.