>  기사  >  웹 프론트엔드  >  AJAX 및 JavaScript 사용에 대한 자세한 설명

AJAX 및 JavaScript 사용에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-03-31 13:39:331497검색

이번에는 AJAX와 JavaScript 사용에 대한 자세한 설명을 가져왔습니다. AJAX와 JavaScript 사용 시 주의사항은 무엇인가요?

AJAX는 JavaScript 사양이 아니며 친구가 "발명한" 약어인 Asynchronous JavaScript and XML입니다. 이는 JavaScript를 사용하여 비동기 네트워크 요청을 수행한다는 의미입니다.

양식 제출을 주의 깊게 관찰하면 사용자가 "제출" 버튼을 클릭하고 양식 제출이 시작되면 브라우저가 페이지를 새로 고친 다음 새 페이지에서 작업 여부를 알려준다는 것을 알 수 있습니다. 성공했거나 실패했습니다. 안타깝게도 네트워크가 너무 느리거나 다른 이유로 인해 404 페이지가 표시됩니다.

웹이 작동하는 방식은 다음과 같습니다. 하나의 HTTP 요청이 하나의 페이지에 해당합니다.

사용자가 현재 페이지에 머무르면서 동시에 새로운 HTTP 요청을 하게 하려면 JavaScript를 사용하여 데이터를 받은 후 페이지를 업데이트해야 합니다. 사용자는 현재 페이지에 여전히 머물러 있다고 느낄 것입니다. 하지만 데이터는 지속적으로 업데이트될 수 있습니다.

AJAX를 최초로 대규모로 사용한 것은 Gmail이었습니다. Gmail 페이지가 처음 로드된 후 나머지 모든 데이터는 AJAX에 의존하여 업데이트되었습니다.

JavaScript로 완전한 AJAX 코드를 작성하는 것은 복잡하지 않지만 주의해야 합니다. AJAX 요청은 비동기식으로 실행됩니다. 즉, 콜백 함수를 통해 응답을 얻습니다.
최신 브라우저에서 AJAX를 작성하려면 주로 XMLHttpRequestObject:

function success(text) {
 var textarea = document.getElementById('test-response-text');
 textarea.value = text;
}
function fail(code) {
 var textarea = document.getElementById('test-response-text');
 textarea.value = 'Error code: ' + code;
}
var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象
request.onreadystatechange = function () { // 状态发生变化时,函数被回调
 if (request.readyState === 4) { // 成功完成
  // 判断响应结果:
  if (request.status === 200) {
   // 成功,通过responseText拿到响应的文本:
   return success(request.responseText);
  } else {
   // 失败,根据响应码判断失败原因:
   return fail(request.status);
  }
 } else {
  // HTTP请求还在继续...
 }
}
// 发送请求:
request.open('GET', '/api/categories');
request.send();
alert('请求已发送,请等待响应...');

IE의 하위 버전의 경우 ActiveXObject 개체로 변경해야 합니다.

function success(text) {
 var textarea = document.getElementById('test-ie-response-text');
 textarea.value = text;
}
function fail(code) {
 var textarea = document.getElementById('test-ie-response-text');
 textarea.value = 'Error code: ' + code;
}
var request = new ActiveXObject('Microsoft.XMLHTTP'); // 新建Microsoft.XMLHTTP对象
request.onreadystatechange = function () { // 状态发生变化时,函数被回调
 if (request.readyState === 4) { // 成功完成
  // 判断响应结果:
  if (request.status === 200) {
   // 成功,通过responseText拿到响应的文本:
   return success(request.responseText);
  } else {
   // 失败,根据响应码判断失败原因:
   return fail(request.status);
  }
 } else {
  // HTTP请求还在继续...
 }
}
// 发送请求:
request.open('GET', '/api/categories');
request.send();
alert('请求已发送,请等待响应...');

표준 쓰기와 IE 쓰기를 혼합하려는 경우 , 다음과 같이 작성할 수 있습니다:

var request;
if (window.XMLHttpRequest) {
 request = new XMLHttpRequest();
} else {
 request = new ActiveXObject('Microsoft.XMLHTTP');
}

window 객체에 XMLHttpRequest 속성이 있는지 감지하여 브라우저가 표준 XMLHttpRequest을 지원하는지 확인합니다. 브라우저가 특정 JavaScript 기능을 지원하는지 여부를 감지하기 위해 브라우저의 navigator.userAgent를 사용하지 마십시오. 첫째, 문자열 자체가 위조될 수 있고, 둘째, JavaScript 기능을 통해 판단하는 것이 매우 복잡하기 때문입니다. IE 버전.

XMLHttpRequest 객체를 생성한 후 먼저 onreadystatechange의 콜백 기능을 설정해야 합니다. 콜백 함수에서는 일반적으로 readyState === 4를 통해 요청이 완료되었는지 여부만 판단하면 됩니다. 완료되면 status === 200을 기준으로 성공적인 응답인지 여부를 판단합니다. .
XMLHttpRequest 객체의 open() 메서드에는 3개의 매개변수가 있습니다. 첫 번째 매개변수는 GET인지 POST인지 지정하고, 두 번째 매개변수는 URL 주소를 지정하며, 세 번째 매개변수는 비동기식을 사용할지 여부를 지정합니다. 기본값은 true이므로 작성할 필요가 없습니다.

참고, 세 번째 매개변수를 false로 지정하지 마세요. 그렇지 않으면 AJAX 요청이 완료될 때까지 브라우저가 응답을 중지합니다. 이 요청에 10초가 걸리면 10초 이내에 브라우저가 "일시 중단" 상태에 있음을 알게 됩니다.

마지막으로 send() 메서드를 호출하여 실제로 요청을 보냅니다. GET 요청에는 매개변수가 필요하지 않으며 POST 요청에는 본문 부분을 문자열 또는 FormData 객체로 전달해야 합니다.

보안 제한

위 코드의 URL은 상대 경로를 사용합니다. 'http://www.sina.com.cn/'으로 변경하고 다시 실행하면 반드시 에러가 발생합니다. Chrome 콘솔에서도 오류 메시지를 볼 수 있습니다. 이 문제는 브라우저의 동일 출처 정책으로 인해 발생합니다. 기본적으로 JavaScript가 AJAX 요청을 보낼 때 URL의 도메인 이름은 현재 페이지와 정확히 동일해야 합니다.

完全一致的意思是,域名要相同(www.example.comexample.com不同),协议要相同(http和https不同),端口号要相同(默认是:80端口,它和:8080就不同)。有的浏览器口子松一点,允许端口不同,大多数浏览器都会严格遵守这个限制。

那是不是用JavaScript无法请求外域(就是其他网站)的URL了呢?方法还是有的,大概有这么几种:

一是通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。

二是通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器:
'/proxy?url=http://www.sina.com.cn'代理服务器再把结果返回,这样就遵守了浏览器的同源策略。这种方式麻烦之处在于需要服务器端额外做开发。

第三种方式称为JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源:

<html>
<head>
 <script src="http://example.com/abc.js"></script>
 ...
</head>
<body>
...
</body>
</html>

JSONP通常以函数调用的形式返回,例如,返回JavaScript内容如下:
foo('data');这样一来,我们如果在页面中先准备好foo()函数,然后给页面动态加一个