Javascript AJAX запрос проблемы - PullRequest
0 голосов
/ 06 июля 2011

У меня проблема с выполнением определенного бита AJAX.Вот как я хочу это сделать:

У меня есть форма, в которой после нажатия кнопки я хочу выполнить небольшой кусочек Javascript (подтвердить выполнение действия), отправить запрос AJAX, а затем отправитьформа.Меня не волнует вывод запроса AJAX, но он должен быть запущен до отправки формы.

Кнопка определена как:

<input title="Delete" onclick="return check_delete('id');" 
type="submit" name="Delete" value="Delete">

Функция check_delete:

var sure = confirm('Are you sure you want to delete this?');
if (!sure) return false;

var del = confirm('Would you like to delete related content?');
if (window.XMLHttpRequest) {
    xmlhttp=new XMLHttpRequest();
} else {
    xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
}
var url = '/del_check.php&id='+id+'&del='+del;

xmlhttp.open('GET',url,true);
xmlhttp.send();
return true;

Функция работает нормально, за исключением части xmlhttp.send() - запросне отображается в логах веб-сервера и не выполняется.Немного поиграв с ним, я обнаружил, что если я изменю последнюю строку в функции, чтобы она возвращала false вместо true, мой AJAX начинает работать, однако из-за возвращаемого значения false форма неполучить представление.

Что мне не хватает?

1 Ответ

1 голос
/ 06 июля 2011

Эта строка:

xmlhttp.open('GET',url,true);

означает, что вы отправляете запрос асинхронный ( MSDN , W3C ).Запрос инициируется вашим кодом, но ваш код не блокирует ожидание его завершения (что обычно является хорошей вещью tm ).

Однако, когда вы отправляете форму,страница сносится и заменяется результатом отправки формы.Любые невыполненные или поставленные в очередь запросы Ajax будут прерваны или даже не запущены.

Вы могли бы сделать запрос синхронным (блокирующим), изменив этот true на false, но затем выВы заблокируете страницу (в лучшем случае) или браузер (в худшем случае) до тех пор, пока этот запрос не будет завершен, что не идеально.

Альтернативы - полностью отказаться от выполнения запроса ajax или отменить отправку формы.дождитесь ответа ajax (даже если вас это не волнует), а затем отправьте форму программно (через HTMLFormElement#submit - например, вызов submit для элемента DOM form).Если вы сделаете это второе, обратите внимание, что кнопка, которую вы нажали, не будет включена в данные формы, если вы не вставите ее вручную, поскольку форма больше не отправляется этой кнопкой.

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