Успешное событие Ajax не работает
У меня есть форма регистрации и я использую $.ajax
представить его.
Это мой запрос AJAX:
$(document).ready(function() {
$("form#regist").submit(function() {
var str = $("#regist").serialize();
$.ajax({
type: 'POST',
url: 'submit1.php',
data: $("#regist").serialize(),
dataType: 'json',
success: function() {
$("#loading").append("<h2>you are here</h2>");
}
});
return false;
});
});
В моем файле submit1.php я проверяю наличие полей адреса электронной почты и имени пользователя в базе данных. Я хочу отобразить сообщение об ошибке, если эти значения существуют без обновления страницы.
Как я могу добавить это к успешному обратному вызову моего AJAX-запроса?
17 ответов
Результат, вероятно, не в формате JSON, поэтому, когда jQuery пытается проанализировать его как таковой, происходит сбой. Вы можете поймать ошибку с error:
функция обратного вызова.
В любом случае, вам не нужен JSON в этой функции, поэтому вы также можете удалить dataType: 'json'
строка.
Хотя проблема уже решена, я добавляю это в надежде, что это поможет другим.
Я сделал ошибку, пытаясь использовать функцию, подобную этой (успех: OnSuccess(productID)). Но сначала вы должны передать анонимную функцию:
function callWebService(cartObject) {
$.ajax({
type: "POST",
url: "http://localhost/AspNetWebService.asmx/YourMethodName",
data: cartObject,
contentType: "application/x-www-form-urlencoded",
dataType: "html",
success: function () {
OnSuccess(cartObject.productID)
},
error: function () {
OnError(cartObject.productID)
},
complete: function () {
// Handle the complete event
alert("ajax completed " + cartObject.productID);
}
}); // end Ajax
return false;
}
Если вы не используете анонимную функцию в качестве оболочки, вызывается OnSuccess, даже если веб-служба возвращает исключение.
Я попытался удалить строку dataType, и у меня это не сработало. Я обошел проблему, используя "полный" вместо "успех" в качестве обратного вызова. Обратный вызов успеха все еще терпит неудачу в IE, но так как мой сценарий запускается и завершается в любом случае, это все, что меня волнует.
$.ajax({
type: 'POST',
url: 'somescript.php',
data: someData,
complete: function(jqXHR) {
if(jqXHR.readyState === 4) {
... run some code ...
}
}
});
в jQuery 1.5 вы также можете сделать это следующим образом.
var ajax = $.ajax({
type: 'POST',
url: 'somescript.php',
data: 'someData'
});
ajax.complete(function(jqXHR){
if(jqXHR.readyState === 4) {
... run some code ...
}
});
Убедитесь, что вы не печатаете (выводите или выводите) какой-либо текст / данные, прежде чем генерировать данные в формате JSON в файле PHP. Это может объяснить, что вы получили -sucessfull 200 OK-, но ваше событие sucess все равно не срабатывает в вашем javascript. Вы можете проверить, что ваш скрипт получает, проверив раздел "Сеть - Ответ" в firebug для POST submit1.php.
Положить alert()
в вашем success
обратный вызов, чтобы убедиться, что он вызывается вообще.
Если это не так, то это просто потому, что запрос вообще не был успешным, даже если вам удастся попасть на сервер. Разумные причины могут заключаться в том, что истекло время ожидания, или что-то в вашем php-коде вызывает исключение.
Установите дополнение Firebug для Firefox, если вы еще этого не сделали, и проверьте обратный вызов AJAX. Вы сможете увидеть ответ и узнать, получил ли он успешный ответ (200 OK). Вы также можете поставить другой alert()
в complete
обратный вызов, который обязательно должен быть вызван.
Я возвращал действительный JSON, получая ответ 200 в моем "завершенном" обратном вызове, и мог видеть его в сетевой консоли chrome... НО я не указал
dataType: "json"
однажды я сделал, в отличие от "принятого ответа", который на самом деле решил проблему.
У меня была такая же проблема. это случилось потому что javascript
ожидать json
тип данных в возвращаемых данных. но если вы используете echo или print в своем php, такая ситуация возникает. если вы используете echo
функция в php
чтобы вернуть данные, просто удалите dataType : "json"
работает довольно хорошо.
Вы должны объявить обратный вызов как Success, так и Error. Добавление
error: function(err) {...}
должен исправить проблему
У меня была та же проблема, я решил ее таким образом: Мой AJAX:
event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}),
success: function(php_response){
if (php_response == 'item')
{
console.log('it works');
}
}
})
Хорошо. Проблема не в json, а только в php-ответе. До: мой ответ php был:
echo 'item';
Сейчас:
$variable = 'item';
echo json.encode($variable);
Теперь мой успех работает. PS. Извините, если что-то не так, но это мой первый комментарий на этом форуме:)
Я использую XML для переноса результата с php на сервере на веб-страницу, и у меня такое же поведение.
В моем случае причина была в том, что закрывающий тег не совпадал с открывающим тегом.
<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<result>
<status>$status</status>
<OPENING_TAG>$message</CLOSING_TAG>
</result>";
?>
Я пытался вернуть строку из контроллера, но почему управление, возвращающееся к блоку ошибок, не выполняется в ajax
var sownum="aa";
$.ajax({
type : "POST",
contentType : 'application/json; charset=utf-8',
dataType : "JSON",
url : 'updateSowDetails.html?sownum=' + sownum,
success : function() {
alert("Wrong username");
},
error : function(request, status, error) {
var val = request.responseText;
alert("error"+val);
}
});
Я столкнулся с той же проблемой при обращении к контроллеру, который не возвращает ответ об успешном завершении, когда был изменен мой контроллер для возврата сообщения об успешном завершении. обратите внимание, используя Lavalite Framework. до:
public function Activity($id)
{
$data=getData();
return
$this->response->title('title')
->layout('layout')
->data(compact('data'))
->view('view')
->output();
}
after code looks like:
try {
$attributes = $request->all();
//do something
return $this->response->message('')
->code(204)
->status('success')
->url('url'. $data->id)
->redirect();
} catch (Exception $e) {
return $this->response->message($e->getMessage())
->code(400)
->status('error')
->url('nothing Wrong')
->redirect()
}
это сработало для меня
У меня была эта проблема с использованием функции ajax для восстановления пароля пользователя из Magento. Событие успеха не было запущено, тогда я понял, что было две ошибки:
- Результат не возвращался в формате JSON
- Я пытался преобразовать массив в формат JSON, но этот массив содержал не-UTF символы
Поэтому каждый раз, когда я пытался использовать json_eoncde() для кодирования возвращаемого массива, функция не работала, потому что один из ее индексов содержал не-utf символы, большинство из которых были выделены бразильскими португальскими словами.
поскольку я возвращал строку, используя res.render("index",myHTMLOBJ). Итак, я просто удалил dataType: «json» из вызова ajax, и это сработало для меня.
$.ajax({
url: url,
type: "POST",
processData: false,
contentType: false,
data: formData,
success: function (response) {
$("body").html(response);
}
})
Добавьте обратный вызов "error" (так же, как "success") следующим образом:
$.ajax({
type: 'POST',
url: 'submit1.php',
data: $("#regist").serialize(),
dataType: 'json',
success: function() {
$("#loading").append("<h2>you are here</h2>");
},
error: function(jqXhr, textStatus, errorMessage){
console.log("Error: ", errorMessage);
}
});
Итак, в моем случае я увидел в консоли:
Error: SyntaxError: Unexpected end of JSON input
at parse (<anonymous>), ..., etc.
В моем случае ошибка была в том, что это было на стороне сервера, и по этой причине он возвращал HTML
wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
Обратный вызов успеха принимает два аргумента:
success: function (data, textStatus) { }
Также убедитесь, что submit1.php
устанавливает правильный заголовок типа контента: application/json