Что такое ajax?
AJAX-это набор API, предоставляемых браузерами, которые можно вызывать с помощью JavaScript для управления запросами и ответами с помощью кода. Реализация сетевого программирования
1. Процесс использования AJAX может быть аналогичен обычному процессу посещения веб-страниц.
// 1. Create an object of type XMLHttpRequest -- equivalent to opening a browser var xhr = new XMLHttpRequest() // 2. Open the connection to a web site - the equivalent of entering an access address in the address bar xhr.open('GET', './time.php') // 3. Send a request through a connection -- the equivalent of a return or click-through request xhr.send(null) // 4. Specify the XHR state change event handler --- equivalent to the operation after processing web page rendering xhr.onreadystatechange = function () { // The readyState of XHR determines whether the response to the request has been received or not. if (this.readyState === 4) { // Get the response body of the response through the responseText of XHR console.log(this) } }
2,Состояние готовности
Поскольку событие readystatechange запускается при изменении состояния объекта XHR (а не только при получении ответа), это означает, что событие будет запускаться много раз, поэтому необходимо понимать значение каждого значения состояния:
Ось времени:
var xhr = new XMLHttpRequest() console.log(xhr.readyState) // => 0 // Initialize request proxy object xhr.open('GET', 'time.php') console.log(xhr.readyState) // => 1 // The open method has been invoked to establish a connection to a specific port on the server side xhr.send() xhr.addEventListener('readystatechange', function () { switch (this.readyState) { case 2: // => 2 // The response header of the response message has been received // You can get it. // console.log(this.getAllResponseHeaders()) console.log(this.getResponseHeader('server')) // But they haven't got the body yet. console.log(this.responseText) break case 3: // => 3 // The response body of the response message being downloaded may be empty or incomplete. // Dealing with responders here is not safe (unreliable) console.log(this.responseText) break case 4: // => 4 // All OK (the entire response message has been downloaded in full) // Here the response body is processed console.log(this.responseText) break } })
Понимая значение каждого значения состояния, мы приходим к выводу, что обычно мы выполняем логику последующего ответа, когда значение readyState равно 4.
xhr.onreadystatechange = function () { if (this.readyState === 4) { // Follow-up logic... } }
3. Следуйте HTTP
По сути, XMLHttpRequest-это способ отправки HTTP-запросов JavaScript на веб-платформах, поэтому запросы, которые мы отправляем, по-прежнему являются HTTP-запросами в том же формате, что и соглашения HTTP:
// Setting the request line of the request message xhr.open('GET', './time.php') // Setting the request header xhr.setRequestHeader('Accept', 'text/plain') // Setting Request Body xhr.send(null) xhr.onreadystatechange = function () { if (this.readyState === 4) { // Getting Response State Code console.log(this.status) // Getting Response State Description console.log(this.statusText) // Getting response header information Console. log (this. getResponseHeader ('Content Type')// Specify response header Console. log (this. getAllResponseHeader ()// all response headers // Get the response volume Console. log (this. responseText)// text form The console. log (this. responseXML) // XML form, which is unnecessary to understand } }
4. ПОЛУЧИТЬ запрос
Обычно в запросе GET параметр передается через параметр в URL-адресе.
var xhr = new XMLHttpRequest() // GET request passing parameters usually use question mark passing parameters // Here you can add parameters after the request address to pass data to the server. xhr.open('GET', './delete.php?id=1') // Generally, when GET requests do not need to set the response body, it can pass null or not at all. xhr.send(null) xhr.onreadystatechange = function () { if (this.readyState === 4) { console.log(this.responseText) } } // In general, URLs pass data of parametric nature, while POST is usually business data.
5. ОТПРАВИТЬ запрос
В запросах POST запрашивающий используется для передачи данных, которые необходимо отправить.
var xhr = new XMLHttpRequest() // The first parameter of the open method is to set the method of the request. xhr.open('POST', './add.php') // Set Content Type in the request header to application/x www form urlencoded // Identify the body of the request as urlencoded so that the server can receive the data xhr.setRequestHeader('Content‐Type', 'application/x‐www‐form‐urlencoded') // Data that needs to be submitted to the server can be passed through the parameters of the send method // Format: key1 = value1 & key2 = Value2 xhr.send('key1=value1&key2=value2') xhr.onreadystatechange = function () { if (this.readyState === 4) { console.log(this.responseText) } }
6. Синхронизация и синхронизация
Synchronization: A person can only do one thing at the same time, perform some time-consuming operations (no need to watch) and do nothing else, just wait. stay 异步:在执行一些耗时的操作(不需要看管)去做别的事,而不是等stay
Третий параметр метода xhr. open () требует, чтобы было передано значение bool. Его функция состоит в том, чтобы установить, выполняется ли запрос асинхронно по умолчанию. Для true, если требуется синхронное выполнение, это может быть достигнуто путем передачи false:
console.log('before ajax') var xhr = new XMLHttpRequest() // The default third parameter, true, implies asynchronous execution xhr.open('GET', './time.php', true) xhr.send(null) xhr.onreadystatechange = function () { if (this.readyState === 4) { // The code here is finally executed console.log('request done') } } console.log('after ajax')
При синхронном выполнении код застревает в xhr. send ():
console.log('before ajax') var xhr = new XMLHttpRequest() // Synchronization xhr.open('GET', './time.php', false) // Synchronization 执行需要 先注册事件再调用 send,否则 readystatechange 无法触发 xhr.onreadystatechange = function () { if (this.readyState === 4) { // The code here is finally executed console.log('request done') } } xhr.send(null) console.log('after ajax')
Продемонстрируйте синхронные асинхронные различия. Обязательно зарегистрируйте readystatechange (синхронный или асинхронный) перед отправкой запроса send () Для того, чтобы это событие было более надежным (срабатывающим), его необходимо сначала зарегистрировать. Понимания режима синхронизации достаточно, помните, что не следует использовать режим синхронизации. До сих пор у нас есть общее представление об основном API AJAX.
7. Формат данных ответа
Вопрос: Если вы хотите, чтобы сервер возвращал сложные данные, как вы с этим справляетесь? Вопрос, вызывающий озабоченность, заключается в том, в каком формате данные отправляются сервером и как этот формат анализируется в JavaScript на стороне клиента.
XML
Один вид описания данных означает, что в основном сейчас проект не используется, причина устранения: слишком большая избыточность данных.
JSON
Это также средство описания данных, аналогичное литералам JavaScript. Сервер использует формат JSON для возврата данных, а клиент анализирует данные в соответствии с форматом JSON. Будь то JSON или XML, он используется только в процессе запроса AJAX. Это не значит, что между ними существует необходимая связь. Это просто Протокол передачи данных
Схема совместимости
XMLHttpRequest имеет проблемы с совместимостью со старыми браузерами (IE5/6) и может быть заменен другим способом.
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
8, инкапсуляция
Инкапсуляция запросов AJAX
Функции можно понимать как то, что вы хотите сделать, и процесс выполнения этого прописан в теле функции до тех пор, пока она не будет вызвана. Передача функции в качестве параметра подобна передаче чего-то кому-то другому. Такова концепция делегирования полномочий.
/** * Send an AJAX request *@ Param {String} method request method *@ Param {String} URL request address *@ Param {Object} params request parameters *@ Param {Function} done request completes what needs to be done later (delegation/callback) */ function ajax (method, url, params, done) { // Converting Uniform to Capital for Follow-up Judgment method = method.toUpperCase() // Object-based parameter conversion to urlencoded format var pairs = [] for (var key in params) { pairs.push(key + '=' + params[key]) } var querystring = pairs.join('&') var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP') xhr.addEventListener('readystatechange', function () { if (this.readyState !== 4) return // Trying to parse the response volume in JSON format try { done(JSON.parse(this.responseText)) } catch (e) { done(this.responseText) } }) // If it is a GET request, set the URL address question mark parameter if (method === 'GET') { url += '?' + querystring } xhr.open(method, url) // Set the body of the request if it is a POST request var data = null if (method === 'POST') { xhr.setRequestHeader('Content‐Type', 'application/x‐www‐form‐urlencoded') data = querystring } xhr.send(data) } ajax('get', './get.php', { id: 123 }, function (data) { console.log(data) }) ajax('post', './post.php', { foo: 'posted data' }, function (data) { console.log(data) })
9. AJAX в jQuery
$.ajax
$.ajax({ url: './get.php', type: 'get', dataType: 'json', data: { id: 1 }, beforeSend: function (xhr) { console.log('before send') }, success: function (data) { console.log(data) }, error: function (err) { console.log(err) }, complete: function () { console.log('request completed') } })
Описание общих параметров опции: Url: Тип адреса запроса: Метод запроса, по умолчанию для получения типа данных: Тип данных ответа на стороне сервера ajax(“get”, “./get.php’, { id: 123 }, функция (данные) { console.log(данные) }) ajax(‘сообщение’, ‘./post.php’, { foo: ‘опубликованные данные’ }, функция (данные) { console.log(данные) }) $.ajax({ url: ‘./get.php”, тип: “получить”, тип данных: “json”, данные: { идентификатор: 1 }, Перед отправкой: функция (xhr) { console.log(“перед отправкой”) }, успех: функция (данные) { console.log(данные) }, ошибка: функция (ошибка) { console.log(ошибка) }, завершено: функция () { console.log(‘запрос завершен’) } }) Описание общих параметров опции: Url: Тип адреса запроса: Метод запроса, по умолчанию для получения типа данных: Тип данных ответа на стороне сервера Тип содержимого: Тип содержимого тела запроса, по умолчанию приложение/x-www-форма-url-кодированные данные: Данные, которые необходимо передать на сервер, если GET передается через URL, если СООБЩЕНИЕ передается через тайм-аут отправителя запроса: тайм-аут запроса перед отправкой: Срабатывает до
10, кросс-домен
Связанные понятия Политика гомологии-это политика безопасности для браузеров. Гомология относится к доменным именам, протоколам и портам, которые идентичны. Только гомологичные адреса могут проходить друг через друга. Запрос способа AJAX. Гомологичные или разные источники ссылаются на связь между двумя адресами. Запросы между различными исходными адресами называются междоменными запросами. Что такое гомология? Например: http://www.example.com/detail… по сравнению со следующим адресом
JSONP
JSON с заполнением-это метод отправки междоменных запросов с тегами сценариев. Принцип заключается в том, что клиент запрашивает динамическую веб-страницу (php-файл) сервера с тегом сценария, а сервер возвращает динамическую веб-страницу. Сценарий глобального вызова функции JavaScript с вызовом функции передает данные, которые в противном случае необходимо было бы вернуть клиенту. В большинстве случаев JSONP используется для выполнения междоменных запросов между различными адресами источников.
Foo (['I','Yes','You','Original','Ben','Need','Want','Of','Number','According')
Резюме: Поскольку XMLHttpRequest не может отправлять междоменные запросы между разными исходными адресами, мы должны найти другой способ, скрипт. Случай-это способ, который мы, наконец, выбираем. Мы называем это JSONP. Если вы не понимаете принцип, сначала вспомните, как его использовать, а затем используйте его в течение длительного времени. Посмотрите на принцип.