Добрый день. Помогите разобраться.
Есть форма
<form id="feedback">
<div class="form-group">
<label>Name</label>
<input type="text" class="form-control" id="name">
</div>
<div class="form-group">
<label>email</label>
<input type="email" class="form-control" id="email" >
</div>
<div class="form-group">
<label>theme</label>
<input type="text" class="form-control" id="theme" >
</div>
<div class="form-check">
<label>
massage
</label>
<textarea id="message" class="form-control"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
есть ajax запрос
$(document).ready(function(){
$('button').on('click', function(e){
e.preventDefault();
sendMessage();
});
function sendMessage()
{
var user_name = $('#name').val(),
user_email = $('#email').val(),
user_theme = $('#theme').val(),
user_message = $('#message').val();
$.ajax({
url: 'action.php',
type: 'POST',
dataType: 'JSON',
data: {
name: user_name,
email: user_email,
theme: user_theme,
message: user_message
},
success: function(data){
alert('done');
},
error: function(request, status, error){
var statusCode = request.status; // вот он код ответа
console.log(statusCode);
}
})
}
})
и есть файл action.php который обрабатывает ajax и должен записывать в базу
$name = $_POST['name'];
$email = $_POST['email'];
$theme = $_POST['theme'];
$message = $_POST['message'];
$db_host = "*****";
$db_user = "*****";
$db_password = "******";
$db_table = "feedback";
$db = mysql_connect($db_host,$db_user,$db_password) OR DIE("Не могу создать соединение ");
// Выборка базы
mysql_select_db("*****_db",$db);
mysql_query ("INSERT INTO feedback (name, email, theme, message,) VALUES ('$name', '$email', '$theme', '$message')");
во время выполнения ajax отрабатывает error: и в консоль выводит статус 200 и в базу ничего не записывается
jQuery — запрос Ajax возвращает 200 OK, но возникает событие ошибки?
Просмотрите отправку формы jQuery Ajax.
$(document).ready(function () { $("#hostingForm").submit(function (e) { e.preventDefault(e); var data = {} data["id"] = $("#id").val(); data["domain"] = $("#domain").val(); data["name"] = $("#name").val(); //... $.ajax({ type: "POST", contentType: "application/json", url: "{{home}}/hosting/update", data: JSON.stringify(data), dataType: 'json', timeout: 600000, success: function (data) { console.log("SUCCESS: ", data); }, error: function (e) { console.log("ERROR: ", e); } }); }); });
Просмотрите серверную часть (Spring MVC), чтобы получить запрос Ajax.
@RestController @RequestMapping("/hosting") public class AdminHostingController { @Autowired HostingBo hostingBo; @RequestMapping(value = "/update", method = RequestMethod.POST) public String updateHosting(@RequestBody HostingForm hostingForm) { if(hostingForm!=null){ hostingBo.update(hostingForm, UpdatedBy.WEB); } return "success"; }
Приведенный выше код Spring MVC работает нормально, обновляет базу данных и возвращает строку «Success».
1. проблема
Как клиентская сторона (отправка формы jQuery Ajax), так и сторона сервера (Spring MVC) работают нормально, но возникает событие ошибки Ajax?
См. Следующий вывод в консоли браузера:
ERROR: Object {readyState: 4, responseText: "success", status: 200, statusText: "OK"}
200 OK, но возникает ошибка?
2. Решение
В jQuery.ajax()
, если указан параметрdataType: 'json'
, сервер должен возвращать действительную строку в формате JSON, иначе возникает ошибка.
«… Данные JSON анализируются строго; любой неверно сформированный JSON отклоняется и выдается ошибка синтаксического анализа… »
To fix this, обновите серверную часть, чтобы она возвращала строку в формате JSON:
@RestController @RequestMapping("/hosting") public class AdminHostingController { @Autowired HostingBo hostingBo; @RequestMapping(value = "/update", method = RequestMethod.POST) public String updateHosting(@RequestBody HostingForm hostingForm) { if(hostingForm!=null){ hostingBo.update(hostingForm, UpdatedBy.WEB); } //NEED JSON format return "{"msg":"success"}"; //return "success"; }
Повторите попытку, снова просмотрите консоль браузера, запускается событие «Success».
SUCCESS: Object {msg: "success"}
This is a tutorial on how to handle errors when making Ajax requests via the jQuery library. A lot of developers seem to assume that their Ajax requests will always succeed. However, in certain cases, the request may fail and you will need to inform the user.
Here is some sample JavaScript code where I use the jQuery library to send an Ajax request to a PHP script that does not exist:
$.ajax({ url: 'does-not-exist.php', success: function(returnData){ var res = JSON.parse(returnData); }, error: function(xhr, status, error){ var errorMessage = xhr.status + ': ' + xhr.statusText alert('Error - ' + errorMessage); } });
If you look at the code above, you will notice that I have two functions:
- success: The success function is called if the Ajax request is completed successfully. i.e. If the server returns a HTTP status of 200 OK. If our request fails because the server responded with an error, then the success function will not be executed.
- error: The error function is executed if the server responds with a HTTP error. In the example above, I am sending an Ajax request to a script that I know does not exist. If I run the code above, the error function will be executed and a JavaScript alert message will pop up and display information about the error.
The Ajax error function has three parameters:
- jqXHR
- textStatus
- errorThrown
In truth, the jqXHR object will give you all of the information that you need to know about the error that just occurred. This object will contain two important properties:
- status: This is the HTTP status code that the server returned. If you run the code above, you will see that this is 404. If an Internal Server Error occurs, then the status property will be 500.
- statusText: If the Ajax request fails, then this property will contain a textual representation of the error that just occurred. If the server encounters an error, then this will contain the text “Internal Server Error”.
Obviously, in most cases, you will not want to use an ugly JavaScript alert message. Instead, you would create an error message and display it above the Ajax form that the user is trying to submit.
JQuery 3.0: The error, success and complete callbacks are deprecated.
Update: As of JQuery 3.0, the success, error and complete callbacks have all been removed. As a result, you will have to use the done, fail and always callbacks instead.
An example of done and fail being used:
$.ajax("submit.php") .done(function(data) { //Ajax request was successful. }) .fail(function(xhr, status, error) { //Ajax request failed. var errorMessage = xhr.status + ': ' + xhr.statusText alert('Error - ' + errorMessage); })
Note that always is like complete, in the sense that it will always be called, regardless of whether the request was successful or not.
Hopefully, you found this tutorial to be useful.
AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.
Полное описание функции AJAX на jquery.com.
1
GET запрос
Запрос идет на index.php с параметром «text
» и значением «Текст
» через метод GET.
По сути это то же самое что перейти в браузере по адресу – http://site.com/index.php?text=Текст
В результате запроса index.php вернет строку «Данные приняты – Текст», которая будет выведена в сообщении alert.
$.ajax({
url: '/index.php', /* Куда пойдет запрос */
method: 'get', /* Метод передачи (post или get) */
dataType: 'html', /* Тип данных в ответе (xml, json, script, html). */
data: {text: 'Текст'}, /* Параметры передаваемые в запросе. */
success: function(data){ /* функция которая будет выполнена после успешного запроса. */
alert(data); /* В переменной data содержится ответ от index.php. */
}
});
JS
Код можно сократить используя функцию $.get
$.get('/index.php', {text: 'Текст'}, function(data){
alert(data);
});
JS
Код файла index.php
echo 'Данные приняты - ' . $_GET['text'];
PHP
GET запросы могут кэшироваться браузером или сервером, чтобы этого избежать нужно добавить в функцию параметр – cache: false
.
$.ajax({
url: '/index.php',
method: 'get',
cache: false
});
JS
2
POST запросы
$.ajax({
url: '/index.php',
method: 'post',
dataType: 'html',
data: {text: 'Текст'},
success: function(data){
alert(data);
}
});
JS
Или сокращенная версия – функция $.post
$.post('/index.php', {text: 'Текст'}, function(data){
alert(data);
});
JS
Код файла index.php
echo 'Данные приняты - ' . $_POST['text'];
PHP
POST запросы ни когда не кэшироваться.
3
Отправка формы через AJAX
При отправке формы применяется функция serialize()
, подробнее на jquery.com.
Она обходит форму и собирает названия и заполненные пользователем значения полей и возвращает в виде массива – {login: 'ЗНАЧЕНИЯ_ПОЛЯ', password: 'ЗНАЧЕНИЯ_ПОЛЯ'}
.
Особенности serialize()
:
- Кнопки формы по которым был клик игнорируются, в результате функции их не будет.
- serialize можно применить только к тегу form и полям формы, т.е.
$('div.form_container').serialize();
– вернет пустой результат.
Пример отправки и обработки формы:
<div class="form_container">
<div id="message"></div>
<form id="form">
<input type="text" name="login">
<input type="text" name="password">
<input type="submit" name="send" value="Отправить">
</form>
</div>
<script>
$("#form").on("submit", function(){
$.ajax({
url: '/handler.php',
method: 'post',
dataType: 'html',
data: $(this).serialize(),
success: function(data){
$('#message').html(data);
}
});
});
</script>
HTML
Код файла handler.php
if (empty($_POST['login'])) {
echo 'Укажите логин';
} elseif (empty($_POST['password'])) {
echo 'Укажите пароль';
} else {
echo 'Авторизация...';
}
PHP
4
Работа с JSON
Идеальный вариант когда нужно работать с массивами данных.
$.ajax({
url: '/json.php',
method: 'get',
dataType: 'json',
success: function(data){
alert(data.text); /* выведет "Текст" */
alert(data.error); /* выведет "Ошибка" */
}
});
JS
Короткая версия
$.getJSON('/json.php', function(data) {
alert(data.text);
alert(data.error);
});
JS
$.getJSON
передает запрос только через GET.
Код файла json.php
header('Content-Type: application/json');
$result = array(
'text' => 'Текст',
'error' => 'Ошибка'
);
echo json_encode($result);
PHP
Возможные проблемы
При работе с JSON может всплыть одна ошибка – после запроса сервер отдал результат, все хорошо, но метод success
не срабатывает. Причина кроется в серверной части (PHP) т.к. перед данными могут появится управляющие символы, например:
Из-за них ответ считается не валидным и считается как ошибочный запрос.
В таких случаях помогает очистка буфера вывода ob_end_clean
(если он используется на сайте).
...
// Очистка буфера
ob_end_clean();
header('Content-Type: application/json');
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
PHP
5
Выполнение JS загруженного через AJAX
В JQuery реализована функция подгруздки кода JS через AJAX, после успешного запроса он будет сразу выполнен.
$.ajax({
method: 'get',
url: '/script.js',
dataType: "script"
});
JS
Или
$.getScript('/script.js');
JS
6
Дождаться выполнения AJAX запроса
По умолчанию в JQuery AJAX запросы выполняются асинхронно. Т.е. запрос не задерживает выполнение программы пока ждет результатов, а работает параллельно.
Простой пример:
var text = '';
$.ajax({
url: '/index.php',
method: 'get',
dataType: 'html',
success: function(data){
text = data;
}
});
alert(text); /* Переменная будет пустая. */
JS
Переменная text
будет пустая, а не как ожидается текст который вернул index.php
Чтобы включить синхронный режим нужно добавить параметр async: false
.
Соответственно синхронный запрос будет вешать прогрузку страницы если код выполняется в <head>
страницы.
var text = '';
$.ajax({
url: '/index.php',
method: 'get',
dataType: 'html',
async: false,
success: function(data){
text = data;
}
});
alert(text); /* В переменной будет результат из index.php. */
JS
7
Отправка HTTP заголовков
Через AJAX можно отправить заголовки HEAD, они указываются в параметре headers
.
$.ajax({
url: '/index.php',
method: 'get',
dataType: 'html',
headers: {'Token_value': 123},
success: function(data){
console.dir(data);
}
});
JS
В PHP они будут доступны в массиве $_SERVER
, ключ массива переводится в верхний регистр с приставкой HTTP_
, например:
<?php
echo $_SERVER['HTTP_TOKEN_VALUE']; // 123
PHP
8
Обработка ошибок
Через параметр error
задается callback-функция, которая будет вызвана в случаи если запрашиваемый ресурс отдал 404, 500 или другой код.
$.ajax({
url: '/index.php',
method: 'get',
dataType: 'json',
success: function(data){
console.dir(data);
},
error: function (jqXHR, exception) {
if (jqXHR.status === 0) {
alert('Not connect. Verify Network.');
} else if (jqXHR.status == 404) {
alert('Requested page not found (404).');
} else if (jqXHR.status == 500) {
alert('Internal Server Error (500).');
} else if (exception === 'parsererror') {
alert('Requested JSON parse failed.');
} else if (exception === 'timeout') {
alert('Time out error.');
} else if (exception === 'abort') {
alert('Ajax request aborted.');
} else {
alert('Uncaught Error. ' + jqXHR.responseText);
}
}
});
JS
Через $.ajaxSetup
можно задать обработчик ошибок для всех AJAX-запросов на сайте.
$.ajaxSetup({
error: function (jqXHR, exception) {
...
}
});
JS
Error handling in AJAX
- Product & platform Engineering
Error handling in AJAX
Some times when we request to server we didn’t get proper response (HTTP Status 200) as per our expectation. For ex. we can get
1) Internal Server Error
2) Network Connection Error
3) Page Not Found Error,
4) Access Denied Error.
So if we are making call to server via http post request/simple http request directly then user will see these error in browser. But when we use AJAX service calls and if we don’t properly handle the inevitable errors (like mentioned above) then our code fails and it didn’t display anything and user get stucked. AJAX service calls are especially problematic. So to show proper error message to user we need to use proper error handling.
Even when a client-side error is thrown, most users won’t notice it and the ones who do notice won’t know what the error means or what to do next. In fact, many developers don’t notice client-side scripting errors that occur while they’re debugging their own applications!
For example : After logined in the system user open site link in new tab. Now user has opened two tab and if user logout from first tab and switch to second tab then in second tab whenever user will not refresh that page he will not be logged out. And without refresh the page if user fire an event that is AJAX based and if we didn’t used proper error handling user will get stucked because he will not get proper message, but we must show him a proper message that “Sorry!! Your session has expired. Please login again.” . Same may happen when session expired automatically after not using the system for few minutes.
So to come over this problem we will use AJAX error function.
$.post(url, data, function (response) { } ).error(function (jqXHR, textStatus, errorThrown) { alert(formatErrorMessage(jqXHR, errorThrown)); } );
So when ever we didn’t get “HTTP Status 200 OK” from server and get any error this response will automatically will go to error function.
1) jqXHR : This variable will contain status code and we can access by “jqXHR.status”.
2) textStatus : Response in text like Success.
3) errorThrown : Some time error may be related to parse error, timeout error so these error message will come under this variable.
alert(formatErrorMessage(jqXHR, errorThrown));
1) alert : Simple. using to show error message
2) formatErrorMessage : We are using this function to parse this variable and get exact error and to show a proper message to user.
Its defined below.
function formatErrorMessage(jqXHR, exception) { if (jqXHR.status === 0) { return ('Not connected.nPlease verify your network connection.'); } else if (jqXHR.status == 404) { return ('The requested page not found.'); } else if (jqXHR.status == 401) { return ('Sorry!! You session has expired. Please login to continue access.'); } else if (jqXHR.status == 500) { return ('Internal Server Error.'); } else if (exception === 'parsererror') { return ('Requested JSON parse failed.'); } else if (exception === 'timeout') { return ('Time out error.'); } else if (exception === 'abort') { return ('Ajax request aborted.'); } else { return ('Unknown error occured. Please try again.'); } }
Now how to handle errors in jquery load function.
$(href).load(url , function(result , textStatus, jqXHR){ if(jqXHR.status == 200) { // Type for code to parse result } else { alert(formatErrorMessage(jqXHR, 'nothing')); } });
Now in “HTTP Status 401 Not Authorized condition” if you want to redirect user to login page.
use
$.post(url, data, function (response) { } ).error(function (jqXHR, textStatus, errorThrown) { bootbox.alert(formatErrorMessage(jqXHR, errorThrown), function() { getout(jqXHR); }); } ); function getout(jqXHR) { if (jqXHR.status == 401) { window.location.href = websiteUrl+'/login'; } }
Note : bootbox.alert is a “bootboxjs” function to show alert message with proper bootstarp design popup.
http://bootboxjs.com/
You can also update error message in “formatErrorMessage” function as per your requirement and can add more exception and status code.
1) 400 : “Server understood the request, but request content was invalid.”
2) 403 : “Forbidden resource can’t be accessed.”
3) 503 : “Service unavailable.”
Also if you want to set your own “HTTP Status Code” according to your condition at server side you can use “header” function.
Ex : header(“HTTP/1.1 401 Unauthorized”);
Thanks for reading.
Page load link
Описание: Выполняет асинхронный HTTP (Ajax) запрос.
Функция $.ajax()
лежит в основе всех Ajax запросов отправляемых при помощи jQuery. Зачастую нет необходимости вызывать эту функцию, так как есть несколько альтернатив более высого уровня, такие как $.get()
и .load()
, которые более простые в использовании. Если требуется менее распространенные варианты , через, $.ajax()
Вы можете более гибко скофигурировать запрос.
В простейшем виде, функция $.ajax()
может быть вызвана без аргументов:
Важно: настройки по умолчанию могут быть установлены при помощи функции $.ajaxSetup()
.
Этот пример, не используюя никаких параметров, загружает содержимое текущей страницы, но ничего не делает с результатом. Для использования результата, Вы можете реализовать одну из функция обратного вызова.
Объект jqXHR
Объект jQuery XMLHttpRequest (jqXHR) возвращается функцией $.ajax()
начиная с jQuery 1.5 является надстройкой над нативным объектом XMLHttpRequest. Например, он содержит свойства responseText
и responseXML
, а также метод getResponseHeader()
. Когда траспортом используемым для запрос является что то иное, а не XMLHttpRequest (например, тэг script
tag для JSONP запроса) объект jqXHR
эмулирует функционал нативного XHR там где это возможно.
Начиная с jQuery 1.5.1, объект jqXHR
также содержит метод overrideMimeType()
(он был доступен в jQuery 1.4.x, но был временно удален в версии jQuery 1.5). Метод .overrideMimeType()
может быть использован в обработчике beforeSend()
, например, для изменения поля заголовка content-type
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Объект jqXHR возвращаемый методом $.ajax()
в версии jQuery 1.5 реализует интерфейс Promise, дающий ему все свойства, методы и поведение Promise. Эти методы принимают один или несколько аргументов, которые вызываются при завершении запроса инициированного при помощи $.ajax()
. Это позволяет назначать несколько обработчиков на один запрос и даже назначать обработчики после того как запрос может быть завершен. (Если запрос уже выполнен, то обработчики вызовутся немедленно). Доступные методы Promise в объекте jqXHR:
-
jqXHR.done(function( data, textStatus, jqXHR ) {});
Альтернатива создания обработчика
success
, подробнее смотрите наdeferred.done()
. -
jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
Альтернатива создания обработчика
error
, метод.fail()
заменяет устаревший метод.error()
. Смотрите подробнееdeferred.fail()
. -
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); (добавлен в версии jQuery 1.6)
Альтернатива создания обработчика
complete
, метод.always()
заменяет устаревший метод.complete()
.В ответ на успешный запрос, аргументы функции те же самые что и у
.done()
: data, textStatus и объект jqXHR. Для ошибочных зпросов аргументы те же самые что и у.fail()
: объект jqXHR, textStatus и errorThrown. Смотрите подробнееdeferred.always()
. -
jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});
Включает в себя функциональность методов
.done()
и.fail()
, что упрощает (начиная с jQuery 1.8) проще управлять объектом Promise. Смотрите подробнееdeferred.then()
.
Внимание: обработчики jqXHR.success()
, jqXHR.error()
и jqXHR.complete()
будут удалены в jQuery 3.0. Вы можете использовать jqXHR.done()
, jqXHR.fail()
и jqXHR.always()
соответственно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Ссылка this
внутри всех обработчиков указывает на объект заданный в параметре context
переданные в аргумент settings метода $.ajax
; если context
не указан, то this
указывает на объект settings.
Для обеспечения обратной совместимости с кодом XMLHttpRequest
, в объекте jqXHR
предоставляет следующие свойства и методы:
-
readyState
-
status
-
statusText
-
responseXML
и/илиresponseText
когда запрос вернул xml и/или text, соответственно -
setRequestHeader(name, value)
те заголовки что отходят от стандарта, заменят старое значение на новое, а не конкатенируют старое и новые значения -
getAllResponseHeaders()
-
getResponseHeader()
-
statusCode()
-
abort()
Механизма onreadystatechange
не предусмотрено, так как done
, fail
, always
и statusCode
охватывает все возможные требования.
Очередность функций обратного вызова
Все параметры beforeSend
, error
, dataFilter
, success
и complete
принимают в качестве значений функции обратного вызова, которые вызываются в соотвествующие моменты времени.
С версии jQuery 1.5 функции fail
и done
, и, начиная с jQuery 1.6, always
вызовутся в первую очередь, первыми из упрвляемой очереди, что позволяет более чем один обработчик для каждого элемента очереди. Смотрите отложенные методы, которые реализуют внутренности обработчиков метода $.ajax()
.
Функции обратного вызова предоставленные методом $.ajax()
следующие:
-
beforeSend
вызывается всегда; принимаетjqXHR
объект и объектsettings
как параметры. -
error
вызывается, если запрос выполняется с ошибкой. Принимает объектjqXHR
, строку со статусом ошибки и объект исключения если применимо. Некоторые встроенные ошибки обеспечивают строку качестве объекта исключения: «abort», «timeout», «No Transport». -
dataFilter
вызывается немедленно при успешном получении данных ответа. Принимает в качестве параметров возвращенные данные и знчение параметраdataType
и должен вернуть (возможно измененные данные) для передачи далее в обработчикsuccess
. -
success
вызывается если запрос выполнен успешно. Принимает данные ответа, строку содержащую код успеха и объектjqXHR
. -
Promise обработчик —
.done()
,.fail()
,.always()
и.then()
— выполняются, в том порядке в котором зарегистрированы. -
complete
вызывается когда запрос закончен, независимо от успеха или неудачи выполнения запроса. Принимает объектjqXHR
, отформатированную строку со статусом успеха или ошибки.
Типы данных
Различные типы ответа на вызов $.ajax()
подвергаются различным видам предварительной обработки перед передачей обработчика success
. Тип предварительной подготовки зависит от указанного в ответе поля заголовка Content-Type
, но может быть явно указан при помощи опции dataType
. Если параметр dataType
задан, то поле заголовка Content-Type
будет проигнорирован.
Возможны следующие типы данных: text
, html
, xml
, json
, jsonp
и script
.
Если указан text
или html
, никакой предварительной обработки не происходит. Данные просто передаются в обработчик success
и доступны через свойство responseText
объекта jqXHR
.
Если указан xml
, то ответ парсится при помощи jQuery.parseXML
перед передачей в XMLDocument
в обработчик success
. XML документ доступен через свойство responseXML
объекта jqXHR
.
Если указан json
, то ответ парсится при помощи jQuery.parseJSON
перед передачей в объект для обработчика success
. Полученный JSON объект доступен через свойство responseJSON
объекта jqXHR
.
Если указан script
, то $.ajax()
выполнит JavaScript код который будет принят от сервере перед передачей этого кода как строки в обработчик success
.
Если указан jsonp
, $.ajax()
автоматически добавит в строку URL запроса параметр (по умолчанию) callback=?
. Параметры jsonp
и jsonpCallback
из объекта settings переданных в метод $.ajax()
могут быть использованы для указания имени URL-параметра и имени JSONP функции обратного вызова соответственно. Сервер должен вернуть корректный Javascript который будет переда в обработчик JSONP. $.ajax()
выполнит возвращенный JavaScript код, вызвыв функцию JSONP по ее имени, перед передачей JSON объекта в обработчик success
.
Отправка данных на сервер
По умолчанию, Ajax запросы отправляются при помощи GET HTTP метода. Если POST метод требуется, то метод следует указать в настройках при помощи параметра type
. Этот параметр влияет на то как данные из параметра data
будут отправлены на сервер. Данные POST запроса всегда будут переданы на сервере в UTF-8 кодировкепо стандарту W3C XMLHTTPRequest.
Параметр data
может содержать строку произвольной формы, например сериализованная форма key1=value1&key2=value2
или Javascript объект {key1: 'value1', key2: 'value2'}
. Если используется последний вариант, то данные будут преобразованы в строку при помощи метода jQuery.param()
перед их отправкой. Эта обработка может быть отключена при помощи указания значения false
в параметре processData
. Обработка может быть нежелательной, если Вы хотите отправить на сервере XML документ, в этом случае измените параметр contentType
с application/x-www-form-urlencoded
на более подходящий MIME тип.
Расширенные настройки
Параметр global
предотвращает выполнение обработчиков зарегистрированных при помощи методов .ajaxSend()
, .ajaxError()
и подобных методов. Это может быть полезно, например, для скрытия индикатора загрузки реализованного при помощи .ajaxSend()
если запросы выполняются часто и быстро. С кросс-доменными и JSONP запросами, параметр global
автоматически устанавливается в значение false
.
Если сервер выполняет HTTP аутентификацию перед предоствлением ответа, то имя пользователя и пароль должны быть отправлены при помощи параметров username
и password
options.
Ajax запросы ограничены по времени, так что ошибки могут быть перехвачены и обработаны, чтобы обеспечить наилучшее взаимодействие с пользователем. Таймауты запроса обычно либо установлены по умолчанию, либо установлены глобально при помощи $.ajaxSetup()
вместо того чтобы указывать параметр timeout
для каждого отдельного запроса.
По умолчанию, запросы всегда совершаются, но браузер может предоставить ответ из своего кэша. Для запрета на использования кэшированных результатов установите значение параметра cache
в false
. Для того чтобы вызвать запрос с отчетом об изменении ресурса со времени последнего запроса установите значение параметра ifModified
в true
.
Параметр scriptCharset
разрешает кодировку которая будет явно использована в запросах использующих тэг <script>
(то есть тип данных script
или jsonp
). Это применимо в случае если удаленный скрипт и Ваша текущая страница используют разные кодировки.
Первая буква в слове Ajax означает «асинхронный», что означает что операция происходит параллельно и порядок ее выполнения не гарантируется. Параметр async
метода $.ajax()
по умолчанию равен true
, что указывает что выполнение кода может быть продолжено после совершения запроса. Установка этого параметра в false
(и следовательно, не делая Ваш вывод более асинхронным) настоятельно не рекомендуется, так как это может привести к тому что браузер перестанет отвечать на запросы.
Метод $.ajax()
вернет объект XMLHttpRequest
который и создает. Обычно jQuery обрабатывает создание этого объекта внутри, но можно указать при помощи параметра xhr
функция которая переопределит поведение по умолчанию. Возвращаемый объект обычно может быть отброшен, но должен обеспечивать интерфейс низкого уровня для манипуляции и управления запросом. В частности, вызов .abort()
на этом объекте должен будет остановить запрос до его завершения.
Расширение Ajax
Начиная с jQuery 1.5, реализация Ajax в jQuery включает предварительные фильтры, транспорты и преобразователи, которые позволят Вам очень гибко настроить Ajax запросы под любые нужды.
Использование преобразований
$.ajax()
преобразователи поддерживают трансформацию одних типов данных другие. Однако, если Вы хотите трансформировать пользовательский тип данных в известный тип данных (например json
), Вы должны добавить добавить соответствие между Content-Type
ответа и фактическим типом данных, используя параметр contents
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Этот дополнительный объект необходим, потому что Content-Types
ответа и типы данных никогда не имеют однозначного соответствия между собой (отсюда и регулярное выражение).
Для преобразования из поддерживаемого типа (например text
или json
) в пользовательский тип данных и обратно, используйте другой сквозной преобразователь:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Пример выше позволяет перейти из text
в mycustomtype
и затем из mycustomtype
в json
.