HOME/Articles/

jQuery常用方法以及ajax

Article Outline

jQuery常用方法以及ajax

<!--more-->

##jQuery常用函数

####.each(function(index,Element)) 遍历一个jQuery对象,为每个匹配元素执行一个函数

    $('li').each(function (index,element) {
//        需要注意的是这里的element是原生DOM对象,其实这里的element就等价于这个this
        console.log(index + ':' + $(this).text());
    })

####.map(callback(index,domElement)) 通过一个函数匹配当前集合中的每个元素,产生一个包含新的jQuery对象

    var arrValue = $('li').map(function () {
        return $(this).text();
    })
    console.log(arrValue)

####jQuery.extend([deep,]target[,object1][,objectN])

  • 当我们提供两个或多个对象给$.extend(),对象的所有属性都添加到目标对象(target参数)。
  • 如果只有一个参数提供给$.extend()。这意味着目标参数被省略;在这种情况下,jquery对象本身被默认为目标对象。这样,我们可以在jQuery的命名空间下添加新的功能。这对于插件开发者希望向jquery中添加新函数时是很有用的

目标对象(第一个参数)将被修改,并且将通过$.extend()返回。然而,如果我们想保留原对象,我们可以通过传递一个空对象作为目标对象: var object = $.extend({},object1,oject2);

在默认情况下,通过$.extend()合并操作不是递归的。

如果第一个对象的属性本身是一个对象或者数组,那么它将完全用第二个对象相同的key重写一个属性。这些值不会被合并。如果将true作为该函数的第一个参数,那么会在对象上进行递归的合并。

使用范例:

    var obj1 = {a:1};
    var obj2 = {b:2,c:3};
    var obj3 = {b:3,d:5};
    $.extend(obj1,obj2); //把obj2扩展到obj1上去,作一个遍历,如果obj2里面有的属性obj1里面也有,会进行覆盖,如果obj1里面没有,会做一次新增
    // obj1 == {a:1,b:2,c:3}
    $.extend(obj1,obj2,obj3);//修改的还是obj1,此时obj1 == {a:1,b:3,c:3,d:5} 已经存在的属性进行覆盖,没有的进行新增


//    如果想得到三个属性扩展的值,但是又不想修改obj1的话
    var obj4 = {};
    $.extend(obj4,obj1,obj2,obj3);
    //也可以向下面这么写,直接写个空对象,将扩展完成的对象赋给新定义的对象就好
    var obj5 = $.extend({},obj1,obj2,obj3);

####.clone([withDataAndEvents]) .clone方法深度复制所有匹配的元素的集合,包括所有匹配元素,匹配元素的下级元素,文字节点 通常我们将页面上一个元素插入到DOM里一个地方,他会被从老地方带走,类似于剪切的效果。

<div class="ct">
    <div class="goodbye">

        <div class="hello">
            hello
        </div>
        goodbye
    </div>
</div>
<script>
    $('.hello').appendTo($('.goodbye')); // 进行了剪切
</script>

但是如果我们需要的是复制不是剪切,就可以写为: $('.hello').clone().appendTo('.goodbye');

####.index() /.index(selector)/.index(element) 从给定集合中查找特定元素index

<ul>
    <li></li>
    <li class="active"></li>
    <li></li>
    <li></li>
</ul>
<script>
    $('.active').index(); //1

.index()中也可以传入参数,selector或者是element,表示在特定选择器或者元素下的index是多少

####.ready(handler)

当DOM准备就绪的时候,指定一个函数执行 等价于下面这两种写法:

$.(document).ready(handler)
$(handler)

实例:

$(function () {
    console.log('ready');
})

##jQuery的ajaxAPI用法:

###jQuery.ajax([settings])

范例:

    $.ajax({
        url: 'xxx.php',
        method: 'GET',
        data: {
            name: 'bayon',
            age: 24,
            sex: 'male'
        }
    }).done(function(result) {
        console.log(result);
    }).fail(function (jqXHR,textStatus) {
        console.log(textStatus);
    })

关于settings中的具体一些参数参考jquery ajax文档,注意async,beforeSend,cache,complete,dataType

###对于jsonp的ajax写法

    $.ajax({
        url: 'deejay',
        dataType: 'jsonp', // dataType写成jsonp
        jsonp: 'callback', // 
        jsonpCallback: 'agfjkhahj',
    })

####jQuery.param(obj) 创建一个数组,一个普通的对象,或者一个jQuery对象的序列化表示形式,用于URL查询字符串或者Ajax请求。 使用解析:

    var myObject = {
        a: {
            one: 1,
            two: 2,
            three: 3,
        },
        b: [1,2,3]
    };
    $.param(myObject); //结果为"a%5Bone%5D=1&a%5Btwo%5D=2&a%5Bthree%5D=3&b%5B%5D=1&b%5B%5D=2&b%5B%5D=3"  序列化的对象
    decodeURIComponent($.param(myObject)); //"a[one]=1&a[two]=2&a[three]=3&b[]=1&b[]=2&b[]=3"

###.serialize() 用做将提交的表单元素的值编译成字符串,不接受任何参数

    $('form').on('submit',function (event) {
        event.preventDefault();
        console.log($(this).serialize());
    })

###jQuery ajax使用举例 实现新闻页面加载: 在进行ajax的书写过程中,要和后端约定好接口名称(如/getNews)请求方式(get/post),然后数据格式要根据实际需求来决定,比如说实现新闻页面,那么返回的应该是一个数组,数组中的每一项都是个对象,存放一些信息,应该是个json对象。 确定好返回数据的大致格式后,前端再看页面具体需要什么信息,即返回数组的每一项中的json中的信息应该包括哪些,在本例中,需要新闻页面的链接url,图片链接url,h2标题中的文字,新闻段落p中的文字,那么前端需要的数据应该是:

    [
        {
            link: '',
            img: '',
            h2: '',
            p: '',
        }
    ]

那么约定好这些之后,进行ajax的书写就不会出错了。 来具体实现新闻页面。 后端代码为:



app.get('/getNews',function(req,res) {
    var news = [
        {
            link: 'http://view.inews.qq.com/a/20160830A02SEB00',
            img: 'http://inews.gtimg.com/newsapp_match/0/530686980/0',
            h2: '中国轰6K研发险些被俄罗斯发动机厂商卡脖子',
            p: '近日,轰6K"战神"轰炸机首次公开亮相。在中国空军长春“追梦空天”活动中,轰6K轰炸机进行了公开展出,配套武器装备逐一亮相。殊不知轰-6K这一战略性的国产战机,险些也被外国供应商卡了脖子!',
        },
        {
            link: 'https://kuaibao.qq.com/s/ENT2017082601127604',
            img: 'http://inews.gtimg.com/newsapp_match/0/1963668798/0',
            h2: '凤凰传奇的玲花素颜长这样 认得出来吗',
            p: '视觉中国讯 8月25日,凤凰传奇玲花现身广州白云机场,素颜现身的她头戴棒球帽,黄色T恤上的老虎图案十分抢眼,下身着白色短裤,大秀美腿,等待保姆车时与助理热聊不断,看似心情相当好! (来自:视觉中国)',
        },
        {
            link: 'https://kuaibao.qq.com/s/20170826A00BDJ00',
            img: 'http://inews.gtimg.com/newsapp_match/0/1963495052/0',
            h2: '59岁冯小刚坦言人生三大遗憾:对不起前妻和徐帆,后悔捧红宝强',
            p: '今年已经59岁的冯小刚人生堪称完美,作为导演,冯小刚执导了《甲方乙方》《大腕》《不见不散》等经典,作为演员,冯小刚凭《老炮》问鼎金马影帝,然而这样完美的人生却也充满遗憾,最近冯小刚就爆出了自己人生中的三大憾事。',
        },
        {
            link: 'https://kuaibao.qq.com/s/20170825A05HUK00',
            img: 'http://inews.gtimg.com/newsapp_match/0/1960889798/0',
            h2: '叛逆17年,害谢霆锋抛弃张柏芝,如今37岁当爸爸过成这样',
            p: '在2000年,陈冠希首次出演电影《特警新人类2》,算是正式进入了娱乐圈,其实在年轻的时候,陈冠希的事业发展相当好,公司给了他不错的资源,无论是在电影还是音乐上,陈冠希都发展得不错。',
        },
        {
            link: 'https://kuaibao.qq.com/s/20170826A003L900',
            img: 'http://inews.gtimg.com/newsapp_match/0/1963334820/0',
            h2: '谢霆锋未婚妻瞬间秒变美食厨娘,做饭有模有样,谁说不如张柏芝?',
            p: '谢霆锋和王菲的早年故事,想必是人尽皆知,当年也是娱乐圈最看好的一对,但是因各种原因各自结婚。',
        },
        {
            link: 'https://view.inews.qq.com/a/SSH2017082605027004',
            img: 'http://inews.gtimg.com/newsapp_match/0/1964287533/0',
            h2: '三兄妹为减轻父母负担离家出走 草丛过夜后被找回',
            p: '8月24日,山西运城盐湖区东留村三兄妹为减轻父母负担离家出走,并在草丛里睡了一晚。26日,运城市公安局盐湖分局工作人经警民联合寻找,三人已被父母接回家。',
        },
        {
            link: 'https://view.inews.qq.com/a/SSH2017082604728808',
            img: 'http://inews.gtimg.com/newsapp_match/0/1964237194/0',
            h2: '女子开车撞上公交车 却爱上了公交司机',
            p: '今天咱们来讲一段爱情故事,故事的主人公是咱济南的一个公交司机小郭,今年在驾驶公交车的时候,被一辆私家车追尾了。',
        }
    ];

    var index = req.query.index;
    var length = req.query.length;

    var sliceNews = news.slice(index*length,(parseInt(index*length))+(parseInt(length)));

    res.send(
        {
            status: 0,
            data: sliceNews,
        }
    )
})

前端代码为:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
        list-style: none;
    }
    a {
        color: #333;
        text-decoration: none;
    }
    .container {
        max-width: 600px;
        margin: 0 auto;
    }
    .item {
        margin-top: 20px;
    }
    .clearfix:after {
        content: '';
        display: block;
        clear: both;
    }
    .item .thumb img {
        width: 50px;
        height: 50px;
    }
    .item .thumb {
        float: left;
    }
    .item h2 {
        margin-left: 60px;
        font-size: 14px;
    }
    .item p {
        margin-left: 60px;
        font-size: 14px;
        margin-top: 10px;
        color: #ccc;
    }
    .load-more {
        margin-top: 20px;
        padding: 8px 16px;
        border: none;
        outline: none;
        cursor: pointer;
    }
    .load-more:hover {
        background: #fe6629;
        border-radius: 5px;
        transition: all .5s;
    }
</style>
<body>
<div class="container">
    <ul class="news">
        <li class="item">
            <a href="#">
                <div class="thumb">
                    <img src="" alt="">
                </div>
                <h2></h2>
                <p></p>
            </a>
        </li>

    </ul>

    <button class="load-more">加载更多</button>
</div>

<script>
    var Pageindex = 0;
    var Pagelength = 2;
    $('.load-more').on('click',function () {
        $.ajax({
            url: '/getNews',
            method: 'get',
            data : {
                index: Pageindex,
                length: Pagelength,
            },
        }).done(function (ret) {
//          ret为接收到的后端返回的数据
            if (ret.status === 0) { //返回数据我们和后端约定好加个status值来确定是否正常
                render(ret.data); // 写一个渲染函数把后端拿到的数据append到html上
                Pageindex++;
            }
            else {
                alert('后端获取新闻出错');
            }
        }).fail(function () {
            alert('系统异常');
        })

        function render (arr) { // 设置渲染函数,把后端得到的数据拼接成html字符串然后放到页面上
            if (arr.length === 0) {
                $('.load-more').remove();
                $('.container').append($('<p>没有更多数据了</p>'));
            }
            var html = ''; //进行拼接html字符串
            $.each(arr, function () { // 遍历得到的数据
                html += '<li class="item">';
                html += '<a href="' + this.link + '">';
                html += '<div class="thumb"> ![]( ' + this.img + ' ) </div>';
                html += '<h2>' + this.h2 + '</h2>';
                html += '<p>' + this.p + '</p>';
                html += '</a></li>';
            })
            $('.news').append(html);
        }
    })



</script>
</body>
</html>