关于ajax跨域实战的一个小demo(真正的干货上篇)

jsonp1.png
jsonp.png
jsonp2.png
众所周知,ajax技术只有在同源的前提下使用,我是刚入行的小白,才疏学浅,http的无状态协议的原则,也指导ajax访问非同域的api的时候回报一个不是同源的错,自己也是找了很久,才把这个东西解决,虽然玩的不6但是这个问题我已经知道怎么解决了,今天就分享一个demo,帮助大家彻底理解使用ajax调用非本地资源,说了这么多废话赶紧进入正题。

今天首先要准备一个api,我这边有两个api可以供大家选择,其中一个是已经写好的一个demo但是他不需要跨域这个我也不懂,其实是学来的。另外一个是自己发掘的,你们大家都可以使用,但是有一点我想说,就是如果你们相传到github上面的话,我有一个建议一定要找https协议的api,因为github不支持非https的一切api,又说了一堆废话,正式开始吧。

首先我想一下这二个demo的实现功能。

这个demo实现的就是一个ajax获取非同源数据的时候,用jsonp方式来获取,我这边将会给大家提供两种方式一种是原生js封装jsonp,另外一种方式就是调用jQuery封装好的ajax,我分两次说完,那么就开始了。

我先上一段效果吧给大家看一下,最终实现的效果是什么样的

大致说一下 这些图片还有文字都是通过ajax请求回来的而不是不过这个没有跨域我先讲这个是怎么实现的,当我第二篇的时候就把另外的demo一起说一下,因为如果直接上跨域还要说一下别的知识,html页面,有两个部分,一个是请求回来的图片数据和新闻链接,当你点击的时候会进入相应的网页具体的文章就会浮现出来,下面的几个按钮是我写的丑陋的分页按钮,但是他已经可以实现分页的功能了。每页请求的数目规定在api里面,我就把他们分成了几个页面加载,来实现一个分页的功能,说的可嫩不太清楚,来看代码吧。

首先这个api全称是 https://route.showapi.com/181-1?&showapi_appid=30603&showapi_sign=98960666afeb4992ae91971d13494090&num=10
showapi_appid:这就是一个公用的appid
showapi_sign:这个算是一个登陆密码吧,就这理解,我也是偶然得来的
num:这个参数是请求文章数目

=========================手动分割线===========================
这是公共用的数据库供大家学习。
下面开始讲代码
先分享思路,这个首先通过ajax对象获取我们想要的东西,这个要用到一个XMLHttpRequest 对象那我们先创建一个这个对象
这里用原生ajax
创建对象 我习惯用const
const xmlHttp = new XMLHttpRequest();
然后拆解我们的api,url
const url = 'https://route.showapi.com/181-1';
创建我们要发送的数据比如appid 等这些参数
所以
const sendData = {
showapi_appid: '30603',
showapi_sign: '98960666afeb4992ae91971d13494090',
num: 8 //每一页请求多少条数据
}
然后我们把url完整的拼接起来,有人可能问我为什么这么写,要写成对象的样子吧url拆解,我的理解是为了代码的健壮性,还有就是为了修改方便,不把他写死。
现在我们开始吧url拼接起来这里顺便复习一下扫描对象的方法for in 这个方法,
建立一个空数组来存放url的参数对象
let params = [ ]
for( let key in sendData){
params.push(key + '=' sendData[key] )
}
然后将数组中每一个元素用&拼接成字符串数组转字符串
const postData = parmas.join('&')
试着打印一下
console.log(postData)
然后用我们的XHR对象的方法连接url 之前把XRH存到了 xmlHttp中所以
xmlHttp.open('GET', url + '?' +postData ,true ) 这里异步请求默认可以不写 true
需要我们发送一个消息通常默认这个send的消息为空或者null
xmlHttp.send(null)
最后我们需要检查一下他状态,用到了一个onreadystateChange的事件
这个事件是检查返回状态是否正确的
判断一下这里有两个判断的一个状态1,2,3,4我们要让他走过这个四个步骤还有一个就是状态吗status=200的时候让他返回一些东西,或者执行一些东西。

xmlHttp.onreadystatechange = function(){
if(xmlHttp.readtState===4&&xmlHttp.status===200){
let result = JSON.parse(xmlHttp.response); // 注意这里我们用JSON对象的parse方法把url接收回来的数据字符串编程json对象
let dataList = result.showapi_resbody.newlist // 注意这里 因为json对象里面一般有数组我们取他们的数组,这时候你需要查看一下之前
https://route.showapi.com/181-1?&showapi_appid=30603&showapi_sign=98960666afeb4992ae91971d13494090&num=10 这个api里面 直接打开 就可以看见 很容易的showapi_resbody对象相面
newlist 是一个数组 所以我们要那里面的东西并且把它放进我们dataList的变量里面 大家可以打印一下看一下你是不是应获取到这个 Object了呢
console.log(dataList)

}

}

以下是完整代码,可能有地方是多余或者有问题,大家可以修改,有什么建议请简讯我,谢谢大家支持。

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <style>
        .style{
            border: 1px solid #333; height: 22px; width: 22px;
            text-align: center;
            float: left;
            padding: 6px;
            margin-top: 100px;
            margin-left: 20px;
            list-style: none;

        }
    </style>

</head>

<body>
<div class="content">
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
<footer>
    <ul class="Li" style=" cursor: pointer;">
        <li class="style">1</li>
        <li class="style">2</li>
        <li class="style">3</li>
        <li class="style">4</li>
        <li class="style">5</li>
        <li class="style">6</li>
    </ul>
</footer>
<script >
//这边我使用了原生ajax对象来实现的这个demo html和css就是随便写的,大家可以自己改写。

let oCon = document.querySelector('.content'); //获取元素
let allLi = document.querySelectorAll('.style');
let page = 1;//页码初始化
pageList();
function pageList() {
  //用var无法阻断for循环 采用let 块级作用
  let len = allLi.length;
  for (let i =0; i<len; i++){
    allLi[i].onclick = function () {
           // alert(i+1);
      page = i;
      getJson();

        }
  }
// 匿名体立即执行
/*  for(var i=0, len = allLi.length ;i<len;i++){
    (function (i) {
     allLi[i].onclick = function () {
            alert(i+1)
         }
        })(i)
}*/

}

getJson();
function showPage (dataList) {//页面渲染
  let str = '';//初始化标签文本域
  let len = dataList.length;//数组长度
  for(let i=0  ;i<len ;i++){
    str+=`<a  style="text-decoration:none" href="${dataList[i].url}" >
    ![](http://www.tanzhouphp.com/tanzhoue/images/newsList/${1+(i%8)}.jpg)
    <p >${dataList[i].title}
    <span style="margin-left: 50px ; ">  >  </span></p>
    </a>`
  }
    oCon.innerHTML =str; //渲染列表到content中
    //console.log(str)
}
function getJson () { //数据拉取模块
const params = [];
const xmlHttp = new XMLHttpRequest();//创建对象
const  url = 'https://route.showapi.com/181-1';
const  sendData = {
        showapi_appid: '30603',
        showapi_sign: '98960666afeb4992ae91971d13494090',
        page: page, //page 绑定到全局作用于page变量
        num: 8
};
for(let key in sendData){//讲json键值对添加到数组
    params.push(key + '=' + sendData[key]);
}
const postData = params.join('&'); //数组每一个元素以&拼接字符串
console.log(postData);
xmlHttp.open('GET',url + '?'+ postData,true);
    console.log(url + '?'+ postData)
xmlHttp.send(null);
xmlHttp.onreadystatechange = function () {
    if(xmlHttp.readyState===4&&xmlHttp.status===200){
        let result = JSON.parse(xmlHttp.response);
        let dataList = result.showapi_res_body.newslist;//数组
        showPage(dataList);
        console.timeEnd('数据拉取');
      console.log(dataList)
    }
};
}
</script>
</body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • 引言 秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是个phper最近在写微信支付...
    恩就是这个名阅读 7,959评论 2 15
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,190评论 1 23
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,625评论 18 399
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,309评论 0 6
  • 《长谈》已经看完了。我也有有些惊呆了。自己暗自揣测,首要原因可能就是新鲜感。因为确实和自己平时接触到的不是一种类型...
    齐思宇阅读 126评论 0 0