>웹 프론트엔드 >JS 튜토리얼 >네이티브 JS 캡슐화된 Ajax 플러그인(동일 도메인, jsonp 크로스 도메인)_javascript 기술

네이티브 JS 캡슐화된 Ajax 플러그인(동일 도메인, jsonp 크로스 도메인)_javascript 기술

WBOY
WBOY원래의
2016-05-16 15:02:432230검색

질문을 하자면, 소위 말하는 네이티브 JS의 익숙함이란 무엇일까요?

최근에는 네이티브 JS를 사용하여 친숙한 연습을 해왔습니다. . .

네이티브 JS를 사용하여 Ajax 플러그인을 캡슐화하고 일반 프로젝트를 소개하며 데이터를 전송하는 것이 가능하다고 느껴집니다. . . 내용을 간략하게 설명해주세요. 틀린 부분이 있으면 정정해주세요^_^

1. Ajax 코어, XHR 객체 생성

Ajax 기술의 핵심은 XMLHttpRequest 객체(줄여서 XHR)입니다. IE5는 XHR 객체를 최초로 도입한 브라우저입니다. IE5의 XHR 객체는 MSXML 라이브러리의 ActiveX 객체를 통해 구현됩니다. IE에는 MSXML2.XMLHttp, MSXML2.XMLHttp.3.0 및 MSXML2.XMLHttp.6.0의 세 가지 버전이 있습니다. 따라서 XHR 객체를 생성할 때 호환성 작성을 사용해야 합니다.

createXHR:function(){
 if(typeof XMLHttpRequest!='undefined'){
 return new XMLHttpRequest();
 }else if(typeof ActiveXObject!='undefined'){
 if(typeof arguments.callee.activeXString!='string'){
  var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
  for(i=0,len=versions.length;i<len;i++){
  try{
   new ActiveXObject(versions[i]);
   arguments.callee.activeXString=versions[i];
   break;
  }catch(ex){
  }
  }
  return new ActiveXObject(arguments.callee.activeXString);
  }else{
  throw new Error("No XHR object available.");
 }
}

2. XHR의 주요 메소드 속성

방법:

open() 메소드: 3개의 매개변수, 전송할 요청 유형, 요청 URL, 비동기 전송 여부에 대한 부울 값을 허용합니다

send() 메소드: 요청 본문으로 보낼 데이터입니다. 요청 본문을 통해 데이터를 보낼 필요가 없으면 null을 전달해야 합니다.

abort() 메서드: 비동기 요청을 취소하기 위해 응답을 받기 전에 호출됩니다.

속성:

responseText: 응답 본문으로 반환된 텍스트입니다.

상태: 응답의 HTTP 상태

statusText: HTTP 상태 설명

readyState: 요청/응답 프로세스의 현재 활성 단계를 나타냅니다

의 값은 다음과 같습니다.

0: 초기화되지 않았습니다. open() 메소드가 아직 호출되지 않았습니다

1: 시작합니다. open() 메소드가 호출되었으나 send() 메소드가 아직 호출되지 않았습니다

2: 보내기. send() 메소드가 호출되었지만 응답이 수신되지 않았습니다.

3: 수신합니다. 부분 응답 데이터가 수신되었습니다

4: 완료. 모든 응답 데이터가 수신되었으며 클라이언트에서 사용할 준비가 되었습니다.

이 예의 onreadystatechange 이벤트 핸들러:

var complete=function(){
 if(xhr.readyState==4){
  if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
  if(params.success){
   params.success(xhr.responseText);//执行调用ajax时指定的success函数
   }
 }else{
  if(params.fail){
  params.fail();//执行调用ajax时指定的fail函数
  }else{
  throw new Error("Request was unsucessful:"+xhr.status);
  }
 }
 }
}

참고: 브라우저 간 호환성을 보장하려면 open() 메서드를 호출하기 전에 onreadystatechange 이벤트 핸들러를 지정해야 합니다.

3. 동일한 도메인으로 요청 보내기

①GET요청

가장 일반적인 요청 유형으로 특정 정보를 쿼리하는 데 자주 사용됩니다. 정보는 URL 끝에 쿼리의 문자열 매개변수를 추가하여 서버로 전송됩니다. get 메소드 요청에서 주의할 점은 쿼리 문자열의 각 매개변수 이름과 값이 encodeURIComponent()를 사용하여 인코딩되어야 하고 모든 이름-값 쌍이 앰퍼샌드로 구분되어야 한다는 것입니다.

요청 방법:

if((this.config.type=="GET")||(this.config.type=="get")){
 for(var item in this.config.data){
 this.config.url=addURLParam(this.config.url,item,this.config.data[item]);//使用encodeURIComponent()进行编码
 }
 xhr.onreadystatechange=complete;
 xhr.open(this.config.type,this.config.url,this.config.async);
 xhr.send(null);
}

②POST 요청

일반적으로 서버에 저장해야 하는 데이터를 보내는 데 사용됩니다. POST 요청은 데이터를 요청 본문으로 제출해야 합니다. 그러면 양식 제출이 시뮬레이션됩니다. 즉, Content-Type 헤더 정보를 application/x-www-form-urlencoded; charset=UTF-8로 설정합니다.

직렬화 기능:

 function serialize(data){
  var val="";
  var str="";
  for(var item in data){
   str=item+"="+data[item];
   val+=str+'&';
  }
  return val.slice(0,val.length-1);
 }

요청 방법:

if(this.config.type=="POST"||this.config.type=="post"){
  xhr.addEventListener('readystatechange',complete);
  xhr.open(this.config.type,this.config.url,this.config.async);
  if(params.contentType){
   this.config.contentType=params.contentType;
   }
  xhr.setRequestHeader("Content-Type",this.config.contentType);
  xhr.send(serialize(this.config.data));
}

两个请求的一些区别:

 ①GET请求把参数数据写到URL中,在URL中可以看到,而POST看不到,所以GET不安全,POST较安全。

②GET传送的数据量较小,不能大于2kb。POST传送的数据量较大,一般默认为不受限制。

③GET服务器端用Request.QueryString来获取变量的值,POST服务器端用Request.From来获取。

④GET将数据添加到URL中来传递到服务器,通常利用一个?,后面的参数每一个数据参数以“名称=值”的形式出现,参数与参数之间利用一个连接符&来区分。POST的数据是放在HTTP主体中的,其组织方式不只一种,有&链接方式,也有分隔符方式。可以隐藏参数,传递大批数据,比较方便。

四、jsonp跨域发送请求

 首先,跨域是神马情况呢?

一个域名的组成:

http://     www  .  abc.com:   8080  / scripts/AjaxPlugin.js

协议       子域名      主域名      端口号     请求资源地址

~当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同于。

~不同域之间互相请求资源,就算作“跨域”。

所有的浏览器都遵守同源策略,这个策略能够保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。浏览器会阻止ajax请求非同源的内容。

JSONP(JSON with Padding) 是一种跨域请求方式。主要原理是利用了script 标签可以跨域请求的特点,由其 src 属性发送请求到服务器,服务器返回 JS 代码,网页端接受响应,然后就直接执行了,这和通过 script 标签引用外部文件的原理是一样的。但是jsonp跨域只支持get请求。

JSONP由两部分组成:回调函数和数据,回调函数一般是由网页端控制,作为参数发往服务器端,服务器端把该函数和数据拼成字符串返回。

jsonp跨域主要需要考虑三个问题:

1、因为 script 标签的 src 属性只在第一次设置的时候起作用,导致 script 标签没法重用,所以每次完成操作之后要移除;

2、JSONP这种请求方式中,参数依旧需要编码;

3、如果不设置超时,就无法得知此次请求是成功还是失败;
由于代码有点长,就放个计时器的代码吧,完整代码见AjaxPlugin

//超时处理
if(params.time){
 scriptTag.timer=setTimeout(function(){
  head.removeChild(scriptTag);
  params.fail&&params.fail({message:"over time"});
  window[cbName]=null;
 },params.time);
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

插件详细解析及使用方法见:https://github.com/LuckyWinty/AjaxPlugin

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.