原生Js封装Ajax

loadmore-ajax.PNG
  • 这是一个点击加载更多的插件,点击more按钮,请求ajax,将依次加载3条数据
  • html由一个ul和一个button组成
  1. 首先,获取dom节点,分别获取列表和按钮
var more = document.getElementsByClassName("more")[0],                         // more按钮
    contents = document.getElementsByClassName("contents")[0];                // 列表
  1. 监听more的点击事件,点击按钮则发送ajax获取数据,所以下面来封装ajax,发送ajax的步骤可以理解为:创建异步对象-连接服务器-发送请求-接受返回值
// 封装创建异步对象
function createXHR(){
    // 该对象用于在后台与服务器交换数据,IE7+及其他浏览器都支持
    var xhr = new XMLHttpRequest();
    try{
        xhr = new XMLHttpRequest();
    }catch (error){
        try{
            // 兼容老版本的IE5、IE6
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }catch (error){
            xhr = null;
        }
    }
    return xhr;
}
  1. 下面创建一个名为ajax的函数,在这里面处理参数和发送请求
function ajax(opts){
  // opts参数即请求对象,包括的请求链接、请求方式及参数
  // 创建异步对象
  var xhr = createXHR();
}
  1. 在发送ajax请求前,我们先需要处理下参数,也就是要告诉服务器从第几条开始返回数据和返回几条数据,在调用ajax函数时会给2个参数:startnum以键值对形式保存在参数的data属性中
// 处理参数,将参数转换成 key=value 的形式
var dataStr = "";
for(var key in opts.data){
    dataStr += key + "=" + opts.data[key] + "&";
}
// 去掉字符串末尾的&符号
dataStr = dataStr.substr(0,dataStr.length-1);
  1. 处理好参数后,再判断发送ajax时使用的是get请求还是post请求,分别针对这2种请求方式:
// open()的参数分别表示:请求方式,请求地址
// true表示异步请求
if(opts.type.toLowerCase() == "get"){
    // get请求直接通过?将请求参数拼接在url后面即可
    xhr.open(opts.type,opts.url + "?" + dataStr,true);
    xhr.send();
}
if(opts.type.toLowerCase() == "post"){
    xhr.open(opts.type,opts.url,true)
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    // post请求直接将请求参数写在send方法里
    xhr.send(dataStr);
  1. 确定好请求方式后,便会发送请求了,这时会触发一个onreadystatechange函数
xhr.onreadystatechange = function(){
    // xhr.readyState == 4  请求已完成(请求可能失败也可能成功)
    // xhr.status == 200  请求成功
    // xhr.status == 304  请求成功并且请求条件较上一次并没有改变
    if( xhr.readyState == 4 && ( xhr.status == 200 || xhr.status == 304 ) ){
        var json = JSON.parse(xhr.responseText)
        opts.success(json);
    }else if( xhr.readyState == 4 && xhr.status == 404 ){
        opts.error();
    }
}
  1. 封装好ajax之后,就可以使用啦
// 监听按钮的点击事件
more.addEventListener('click',function(){
    // 计算出开始项,传给服务器告诉他从第几条开始
    var start = (contents.children).length + 1;
    // 调用ajax函数
    ajax({
        url: "./loadmore.php",
        type: "get",
        data: {
            start:start,
            num: 3
        },
        success: function(ret){
            // 获取到返回的数据后拼接dom
            contents.innerHTML += ret.msg;
        },
        error: function(){
            console.log('error');
        }
    })
})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • // ajax操作 /*options = { type : "get|post", // 请求方式,默认 "ge...
    蓝色木头阅读 340评论 0 0
  • 需求分析前段(part 0)确定产品目标:明确需求上下文,针对哪些市场,哪些人群,哪些场景等 互联网产品更加注重人...
    张华_94d7阅读 271评论 0 0
  • 是誰 像晨曦的陽光般 給我帶來光亮 是誰 像烈日的太陽 把我曬傷 溫柔的力量 強大 足以喚醒 所有沉睡的黑暗 烈日...
    蔡振源阅读 183评论 0 2
  • RELATIONSHIP 人 际 关 系——一切烦恼都是人际关系的烦恼。 “一切烦恼都是人际关系的烦恼”,起初看到...
    唐果Candy阅读 369评论 1 2