原生ajax和jQuery中的ajax使用

Ajax是一种能够向服务器请求额外的数据而不需刷新页面,会带来更好的用户体验。

Ajax技术的核心是XMLHttpRequest对象。IE7及现在浏览器中,使用原生XHR创建:

var xhr = new XMLHttpRequest();

ajax请求有两种,同步请求和异步请求,在open()中第三个参数设置是否异步(true代表该次请求异步,false代表同步)同步请求时,代码必须等待请求响应返回才能继续执行下面的代码

var xhr = new XMLHttpRequest();
xhr.open('get', 'example.php', false);
if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){
    alert(xhr.responseText);
}else{
    alert('Resquest was unsuccessful:' + xhr.status);
}

实际我们常用的是异步请求,这时我们通过检查XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段

0: 还没有调用open()方法

1:调用open()方法,但没有调用send()

2:调用send()方法,没有收到响应

3:已经收到部分响应

4:收到全部响应数据,可以在浏览器端使用

通过onreadystatechange事件来监听变化,我们主要监听变化到4这个阶段

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
            if ((xhr.status > 200 && xhr.status < 300) || xhr.status === 304) {
                // deal with xhr.responseText
                alert(xhr.responseText);
            } else {
                alert('Request was unsuccessful' + xhr.status);
            }
    }
}
xhr.open('get', 'example.php', true);
xhr.send(null);

注意,监听事件要写在open()之前

Ajax请求有两种,get和post

get请求属于查询请求,格式是在URL末尾添加名=值&名=值,且名称和值都必须经过encodeURIComponent()编码

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
            if ((xhr.status > 200 && xhr.status < 300) || xhr.status === 304) {
                // deal with xhr.responseText
                alert(xhr.responseText);
            } else {
                alert('Request was unsuccessful' + xhr.status);
            }
    }
}
var url = 'example.php';
var name = encodeURIComponent('name');
var value = encodeURIComponent('tom');
url = url + '?' + name + '=' + value
xhr.open('get', url, true);
xhr.send(null);

使用get方式发给example.php一个请求,带上了name = tom。由于一般服务器会对URL的长度做限制,减少处理URL的压力,所以对get请求发送的数据会有大小限制

post请求属于发送请求,请求的主体是数据,所以可以发送很多数据,且格式不限。

post请求最初是为了处理XML DOM文档,也可以发送字符串

贴一个post请求模拟web表单提交

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
            if ((xhr.status > 200 && xhr.status < 300) || xhr.status === 304) {
                // deal with xhr.responseText
                alert(xhr.responseText);
            } else {
                alert('Request was unsuccessful' + xhr.status);
            }
    }
}
xhr.open('post', 'example.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var form = document.getElementById('user-info');
xhr.send(serialize(form));

function serialize(form){
            var parts = [];
            for(let i = 0;i < form.elements.length;i++){
                var field = form.elements[i];
                switch(field.type){
                    case 'select-one':
                    case 'select-multiple':
                    if(field.name.length){
                        for(let j = 0;j < field.options.length;j++){
                            option = field.options[j];
                            if(option.selected){
                                var optValue = '';
                                if(option.hasAttribute){
                                    optValue = (option.hasAttribute('value')? option.value:option.text)
                                }else{
                                    optValue = (option.attributes['value'].specified?option.value:option.text);
                                }
                                parts.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(optValue));
                            }
                        }
                    }
                    break;
                    case undefined:
                    case 'file':
                    case 'submit':
                    case 'reset':
                    case 'button':
                    break;
                    case 'radio':
                    case 'checkbox':
                    if(!field.checked){
                        break;
                    }
                    default:
                    if(field.name.length){
                        parts.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value))
                    }
                }
            }
            return parts.join('&');
        }

jQuery中Ajax

jQuery中对Ajax操作进行了封装,$.ajax()方法属于最底层的方法,接收一个对象参数  $.ajax({options})

$.ajax({
    // 请求地址
    url: 'example.php',
    // 请求方式GET或者POST
    type: 'GET', 
    // 发送到服务器的数据
    data: 'name = tom',
    // 是否异步。默认true
    async: true,
    // 期待返回的数据类型
    dataType: 'json',
    // 返回成功时调用,参数data是经过dataType处理过的数据 textStatus描述状态的字符串
    success: function(data,textStatus){
                // some code              
                }
    // 返回失败时调用,参数xhr是XMLHttpRequest对象 textStatus描述状态的字符串
    error: function(xhr,textStatus){
                // some code
                }
})

另外,jQuery提供了表单序列化的接口:serialize(),表单对象调用该接口会返回一串字符串,也就是封装了上面原生js写的serialize()方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值