У меня есть регистрационная форма, и я использую $.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?
Результат, вероятно, не в формате JSON, поэтому, когда jQuery пытается разобрать его как таковой, он терпит неудачу. Вы можете поймать ошибку с помощью функции error:
callback.
Кажется, вам не нужна JSON в этой функции, поэтому вы также можете вывести строку dataType: 'json'
.
dataType:'text'
Хотя проблема уже решена, я добавляю это в надежде, что она поможет другим.
Я сделал ошибку, попытался использовать функцию прямо так (успех: 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, но поскольку мой script запускает и завершает все, что мне все равно.
$.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 ...
}
});
complete
всегда вызывается независимо от того, был ли успешным вызов ajax или нет, в то время как success
вызывается только в том случае, если веб-сервер отвечает HTTP-заголовком 200 OK
(все в порядке).
Убедитесь, что вы не печатаете (эхо или печатаете) текст или данные перед созданием ваших форматированных данных JSON в вашем файле PHP. Это может объяснить, что вы получаете -sucessfull 200 OK, но ваше событие sucess все еще не работает в вашем javascript. Вы можете проверить, что получает ваш script, проверив раздел "Сеть - ответ" в firebug для POST submit1.php.
Поместите alert()
в ваш обратный вызов success
, чтобы убедиться, что он вообще вызван.
Если это не так, просто потому, что запрос не был успешным вообще, даже если вам удастся поразить сервер. Разумными причинами могут быть истечения тайм-аута, или что-то в вашем php-коде генерирует исключение.
Установите аддон firebug для firefox, если вы еще этого не сделали, и проверьте обратный вызов AJAX. Вы сможете увидеть ответ и получит ли он успешный ответ (200 OK). Вы также можете поместить еще один alert()
в обратный вызов complete
, который обязательно должен быть вызван.
success
, то это не успех. так как ответ 200 OK, ответ Tatu кажется разумным, но для дальнейшего устранения неполадок вы можете использовать другое событие, называемое complete
которое всегда вызывается независимо от того, успешен ли запрос ( success
происходит только в том случае, если запрос успешен). complete: function (xhr, status) { alert('complete: '+status); }
У меня была такая же проблема. это происходит потому, что javascript
ожидает json
тип данных при возврате данных. но если вы используете эхо или печать в своем php, эта ситуация возникает. если вы используете функцию echo
в php
для возврата данных, просто удалите dataType : "json"
, работая довольно хорошо.
Я столкнулся с той же проблемой при обращении к контроллеру, который не возвращает ответ об успешном завершении, когда был изменен мой контроллер для возврата сообщения об успешном завершении. обратите внимание, используя 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
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);
}
});
У меня возникла проблема с использованием функции ajax для восстановления пароля пользователя от Magento. Событие успеха не было уволено, тогда я понял, что есть две ошибки:
Поэтому каждый раз, когда я пытался использовать json_eoncde() для кодирования возвращаемого массива, функция не работала, потому что один из его индексов имел не-utf-символы, большинство из которых подчеркивали бразильские португальские слова.
Я возвращал действительный JSON, получив ответ 200 в моем "полном" обратном вызове и мог видеть его в хромной сетевой консоли... НО я не указал
dataType: "json"
как только я это сделал, в отличие от "принятого ответа", это фактически устранило проблему.
У меня была та же проблема, я решил ее таким образом: Мой 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. Извините, если что-то не так, но это мой первый комментарий на этом форуме :)
Добавьте обратный вызов "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");
Я использую 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>";
?>
успешный обратный вызов принимает два аргумента:
success: function (data, textStatus) { }
Также убедитесь, что submit1.php
устанавливает правильный заголовок типа содержимого: application/json
success
требует двух аргументов, кажется совершенно неуместным для вопроса. Вы можете передать любое количество параметров в функцию javascript, независимо от того, сколько она принимает в своем объявлении, так что это определенно не является причиной этих проблем, и поскольку ни одно из значений data
или textStatus
не используется в textStatus
success, существует Кажется, нет веской причины объявлять их в функции вообще.