수색…


소개

AJAX는 "Asynchronous JavaScript and XML"의 약자입니다. 이름에는 XML이 포함되지만 JSON은 서식 설정이 간단하고 중복성이 낮기 때문에 더 자주 사용됩니다. AJAX를 사용하면 웹 페이지를 다시로드하지 않고도 외부 리소스와 통신 할 수 있습니다.

비고

AJAX는 동기 J avaScript 습니 X ML을 의미합니다. 그럼에도 불구하고 실제로 다른 유형의 데이터를 사용할 수 있으며 의 경우 비추천 동기 모드로 전환됩니다.

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

fetch API는 비동기 HTTP 요청을하기위한 새로운 약속 기반 방식입니다.

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

POST를 통한 JSON 데이터 송수신

6

페치 요청 약속은 처음에 응답 객체를 반환합니다. 이것들은 응답 헤더 정보를 제공 할 것이지만 아직로드되지 않은 응답 본문을 직접 포함하지는 않습니다. .json() 과 같은 Response 객체의 메소드를 사용하여 응답 본문이로드 될 때까지 기다린 다음 파싱 할 수 있습니다.

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);
});

Stack Overflow의 API에서 해당 달의 가장 중요한 JavaScript 질문 표시

우리는 Stack Exchange의 API 에 대한 AJAX 요청을 작성하여 그 달의 가장 중요한 JavaScript 질문 목록을 검색 한 다음이를 링크 목록으로 제시 할 수 있습니다. 요청이 실패하거나 API 오류를 반환하면 Google의 약속 오류 처리가 대신 오류를 표시합니다.

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 사용하기

이 함수는 GET을 사용하여 AJAX 호출을 실행하여 매개 변수 (객체)를 파일 (문자열)로 보내고 요청이 끝나면 콜백 (함수)을 시작합니다.

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
});

다음은 cars.php 에서 url 매개 변수를 검색하는 방법을 보여줍니다.

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) 가 있다면 console의 결과는 다음과 같습니다.

차 색깔은 자주색입니다. 볼보 모델 300입니다!

HEAD 요청을 통해 파일이 있는지 확인하십시오.

이 함수는 HEAD 메서드를 사용하여 AJAX 요청을 실행하여 인수로 주어진 디렉토리에 파일이 있는지 여부확인할있습니다 . 또한 각 사례 (성공, 실패)에 대한 콜백시작할 수 있습니다.

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 프리 로더 추가

AJAX 호출이 실행되는 동안 GIF 프리 로더를 표시하는 방법은 다음과 같습니다. 프리 로더 기능을 추가하고 제거 할 준비를해야합니다.

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() 합니다.

그렇지 않은 경우 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