原生js的ajax和解決跨域的jsonp(實(shí)例講解)
最近慢慢感覺,學(xué)再多框架,庫,都不如老老實(shí)實(shí)先把基礎(chǔ)弄扎實(shí)了。
不說廢話,先上一個(gè)用ajax請(qǐng)求下本地的一個(gè).txt文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload =function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
//創(chuàng)建XHR對(duì)象
var xhr = new XMLHttpRequest();
//請(qǐng)求的方式,地址,是否異步
xhr.open('get','test.txt',true);
//請(qǐng)求的確定操作,初始化,相當(dāng)于搜索時(shí),敲擊的回車
xhr.send(null);
//請(qǐng)求的readyState每變化一次就執(zhí)行一次onreadystatechange函數(shù)
//其中readyState表示的是:請(qǐng)求/響應(yīng)過程的當(dāng)前活動(dòng)階段
//readyState有如下取值
/*
* 0:未初始化,尚未調(diào)用send()方法
* 1: 啟動(dòng)
* 2:發(fā)送
* 3:接收
* 4:完成
*/
xhr.onreadystatechange =function(){
if(xhr.readyState ==4){
alert(xhr.responseText);
}
}
};
};
</script>
</head>
<body>
<input type="button" id="btn" value="show">
</body>
</html>
執(zhí)行效果如下,點(diǎn)擊show就會(huì)通過ajax請(qǐng)求本地的.txt文件。

代碼比較簡(jiǎn)單,加上注釋,相信很容易就看得懂。
但是工作中我們經(jīng)常會(huì)請(qǐng)求其他域下的資源(因?yàn)橥床呗裕@個(gè)時(shí)候就遇到了跨域(協(xié)議,端口,域名任何一個(gè)不同就算是跨域)。
解決跨域的一種常用辦法就是jsonp,雖然他有局限性(只支持get請(qǐng)求),不過優(yōu)點(diǎn)是兼容老式瀏覽器(不過現(xiàn)在好像很少有人在意老式瀏覽器了)。
jsonp的基本原理:就是通過動(dòng)態(tài)創(chuàng)建script標(biāo)簽,script標(biāo)簽的src是沒有跨域限制的。
接下來上一個(gè)類似百度搜索下拉的頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
input{
width:300px;
height:30px;
border:1px solid lightgray;
margin-top: 150px;
margin-left: 200px;
padding-left: 5px;
}
ul{
width:307px;
list-style: none;
margin-left: 200px;
display: none;
}
li{
height:30px;
border: 1px solid lightgray;
line-height: 30px;
padding-left: 5px;
}
</style>
<script>
function callbackD(response){
var oUl = document.getElementById('ulList');
var html='';
if(response.s.length !=0){
oUl.style.display='block';
for(var i = 0;i<response.s.length;i++){
html+='<li>'+response.s[i]+'</li>'
}
}
oUl.innerHTML = html;
}
</script>
<script>
window.onload = function(){
//獲取dom元素
var oData = document.getElementById('inputSearch');
var oUl = document.getElementById('ulList');
//鍵盤按下后抬起觸發(fā)事件(onkeyup)
oData.onkeyup = function(){
if(oData.value != ''){
//創(chuàng)建標(biāo)簽(createElement)
var script = document.createElement("script");
//添加地址
script.src='http://unionsug.baidu.com/su?wd='+this.value+'&p=3&cb=callbackD';
//添加給body的(成為body包涵的孩子)
document.body.appendChild(script);
}else{
oUl.style.display='none';
}
}
};
</script>
</head>
<body>
<input type="text" id="inputSearch">
<ul id="ulList">
<li>123</li>
</ul>
</body>
</html>
執(zhí)行效果如下:

代碼也相對(duì)比較簡(jiǎn)單,加上代碼的注釋,一定很容易看懂,這就是解決跨域的一種常用辦法,其他有反向代理,CORS啊等等,等我學(xué)好再整理出來。
以上這篇原生js的ajax和解決跨域的jsonp(實(shí)例講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
js Canvas實(shí)現(xiàn)圓形時(shí)鐘教程
這篇文章主要為大家詳細(xì)介紹了HTML5 Canvas實(shí)現(xiàn)圓形時(shí)鐘簡(jiǎn)易教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
JavaScript 深層克隆對(duì)象詳解及實(shí)例
這篇文章主要介紹了 JavaScript 深層克隆對(duì)象的相關(guān)資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)參考這部分知識(shí),需要的朋友可以參考下2016-11-11
uniapp使用uni-file-picker實(shí)現(xiàn)上傳功能
這篇文章主要介紹了uniapp使用uni-file-picker實(shí)現(xiàn)上傳功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-07-07
JS將指定的某個(gè)字符全部轉(zhuǎn)換為其他字符實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于JS如何將指定的某個(gè)字符全部轉(zhuǎn)換為其他字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
JS解決Date對(duì)象在IOS中的“大坑” 以及時(shí)間格式兼容問題
這篇文章主要介紹了JS解決Date對(duì)象在IOS中的“大坑” 以及時(shí)間格式兼容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
在Ajax中使用Flash實(shí)現(xiàn)跨域數(shù)據(jù)讀取的實(shí)現(xiàn)方法
今天,小子再提供一種使用Flash進(jìn)行跨域操作的方法。眾所周之,其實(shí)Flash的跨域操作也是有限制的,不過,F(xiàn)lash的跨域配置比簡(jiǎn)單,只需要在站點(diǎn)根目錄下放置crossdomain.xml即可。2010-12-12
使用JavaScrip實(shí)現(xiàn)一個(gè)記憶函數(shù)
在編程的世界里,性能優(yōu)化始終是一個(gè)重要的話題,今天,我們將一起來實(shí)現(xiàn)一個(gè)實(shí)用的記憶函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一2024-11-11

