질문을 하자면, 소위 말하는 네이티브 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&¶ms.fail({message:"over time"}); window[cbName]=null; },params.time); }
以上就是本文的全部内容,希望对大家的学习有所帮助。
插件详细解析及使用方法见:https://github.com/LuckyWinty/AjaxPlugin