Поиск…


Вступление

AJAX означает «Асинхронный JavaScript и XML». Хотя имя включает XML, JSON чаще используется из-за его более простого форматирования и более низкой избыточности. AJAX позволяет пользователю общаться с внешними ресурсами без перезагрузки веб-страницы.

замечания

AJAX означает A синхронный J avaScript и X ML. Тем не менее вы можете использовать другие типы данных и - в случае -switch - в устаревшем синхронном режиме.

AJAX позволяет веб-страницам отправлять HTTP-запросы на сервер и получать ответ, не загружая всю страницу.

Использование GET и никаких параметров

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
    if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
        //parse the response in xhttp.responseText;
    }
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
6

API-интерфейс fetch - это новый способ, основанный на обещаниях для создания асинхронных HTTP-запросов.

fetch('/').then(response => response.text()).then(text => {
  console.log("The home page is " + text.length + " characters long.");
});

Отправка и получение данных JSON через POST

6

Первоначальные запросы на выборку возвращают объекты Response. Они будут предоставлять информацию заголовка ответа, но они не включают непосредственно тело ответа, которое еще не загружено. Методы объекта Response, такие как .json() могут использоваться для ожидания загрузки тела ответа, а затем для его анализа.

const requestData = {
  method : 'getUsers'
};

const usersPromise = fetch('/api', {
  method : 'POST',
  body : JSON.stringify(requestData)
}).then(response => {
  if (!response.ok) {
    throw new Error("Got non-2XX response from API server.");
  }
  return response.json();
}).then(responseData => {
  return responseData.users;
});

usersPromise.then(users => {
  console.log("Known users: ", users);
}, error => {
  console.error("Failed to fetch users due to error: ", error);
});

Отображение верхних JavaScript-вопросов месяца из API-интерфейса Stack Overflow

Мы можем сделать запрос AJAX API-интерфейса Stack Exchange, чтобы получить список верхних вопросов JavaScript за месяц, а затем представить их в виде списка ссылок. Если запрос терпит неудачу или возвращает ошибку API, наша обработка ошибок обещаний отображает ошибку.

6
Просмотр результатов в реальном времени на HyperWeb .
const url =
    'http://api.stackexchange.com/2.2/questions?site=stackoverflow' +
    '&tagged=javascript&sort=month&filter=unsafe&key=gik4BOCMC7J9doavgYteRw((';

fetch(url).then(response => response.json()).then(data => {
  if (data.error_message) {
    throw new Error(data.error_message);
  }

  const list = document.createElement('ol');
  document.body.appendChild(list);

  for (const {title, link} of data.items) {
    const entry = document.createElement('li');
    const hyperlink = document.createElement('a');
    entry.appendChild(hyperlink);
    list.appendChild(entry);

    hyperlink.textContent = title;
    hyperlink.href = link;
  }
}).then(null, error => {
  const message = document.createElement('pre');
  document.body.appendChild(message);
  message.style.color = 'red';

  message.textContent = String(error);
});

Использование GET с параметрами

Эта функция выполняет вызов AJAX с использованием GET, позволяя нам отправлять параметры (объект) в файл (строку) и запускать обратный вызов (функцию), когда запрос завершен.

function ajax(file, params, callback) {

  var url = file + '?';

  // loop through object and assemble the url
  var notFirst = false;
  for (var key in params) {
    if (params.hasOwnProperty(key)) {
      url += (notFirst ? '&' : '') + key + "=" + params[key];
    }
    notFirst = true;
  }

  // create a AJAX call with url as parameter
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      callback(xmlhttp.responseText);
    }
  };
  xmlhttp.open('GET', url, true);
  xmlhttp.send();
}

Вот как мы его используем:

ajax('cars.php', {type:"Volvo", model:"300", color:"purple"}, function(response) {
  // add here the code to be executed when data comes back to this page      
  // for example console.log(response) will show the AJAX response in console
});

Далее показано, как восстановить параметры url в cars.php :

if(isset($_REQUEST['type'], $_REQUEST['model'], $_REQUEST['color'])) {
  // they are set, we can use them !
  $response = 'The color of your car is ' . $_REQUEST['color'] . '. ';
  $response .= 'It is a ' . $_REQUEST['type'] . ' model ' . $_REQUEST['model'] . '!';
  echo $response;
}

Если у вас был console.log(response) в функции обратного вызова, результатом в консоли было бы:

Цвет вашего автомобиля фиолетовый. Это модель Volvo 300!

Проверьте, существует ли файл через запрос HEAD

Эта функция выполняет запрос AJAX, используя метод HEAD, позволяющий нам проверить, существует ли файл в каталоге, указанном в качестве аргумента. Это также позволяет нам запускать обратный вызов для каждого случая (успех, сбой).

function fileExists(dir, successCallback, errorCallback) {
    var xhttp = new XMLHttpRequest;

    /* Check the status code of the request */
    xhttp.onreadystatechange = function() {
        return (xhttp.status !== 404) ? successCallback : errorCallback;
    };

    /* Open and send the request */
    xhttp.open('head', dir, false);
    xhttp.send();
};

Добавить предварительный загрузчик AJAX

Вот способ показать предварительный загрузчик GIF во время выполнения вызова AJAX. Нам нужно подготовить наши функции добавления и удаления предустановок:

function addPreloader() {
  // if the preloader doesn't already exist, add one to the page
  if(!document.querySelector('#preloader')) {
    var preloaderHTML = '<img id="preloader" src="https://goo.gl/cNhyvX" />';
    document.querySelector('body').innerHTML += preloaderHTML;
  }
}

function removePreloader() {
  // select the preloader element
  var preloader = document.querySelector('#preloader');
  // if it exists, remove it from the page
  if(preloader) {
    preloader.remove();
  }
}

Теперь мы рассмотрим, где использовать эти функции.

var request = new XMLHttpRequest();

Внутри функции onreadystatechange вы должны иметь оператор if с условием: request.readyState == 4 && request.status == 200 .

Если true : запрос завершен, и ответ готов, и мы будем использовать removePreloader() .

Else if false : запрос все еще выполняется, в этом случае мы запустим функцию addPreloader()

xmlhttp.onreadystatechange = function() {

  if(request.readyState == 4 && request.status == 200) {
    // the request has come to an end, remove the preloader
    removePreloader();
  } else {
    // the request isn't finished, add the preloader
    addPreloader()
  }

};

xmlhttp.open('GET', your_file.php, true);
xmlhttp.send();

Прослушивание событий AJAX на глобальном уровне

// Store a reference to the native method
let open = XMLHttpRequest.prototype.open; 

// Overwrite the native method
XMLHttpRequest.prototype.open = function() {
    // Assign an event listener
    this.addEventListener("load", event => console.log(XHR), false);
    // Call the stored reference to the native method
    open.apply(this, arguments);
};


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow