美文网首页web前端 pc h5 浏览器
大厂都在看的购物车

大厂都在看的购物车

作者: 前端菜鸡儿126 | 来源:发表于2019-11-26 17:27 被阅读0次

    jquery

    jQuery对象是一个类数组的对象,含有连续的整形属性以及一系列的jQuery方法。它把所有的操作都包装在一个jQuery()函数中,形成了统一(也是惟一)的操作入口。

    其中我们用的非常频繁的一个函数是$()或者说是jQuery(),当我们调用他的时候会根据传入的参数的不同而达到不同的效果。

    1.$()或者是jQuery()

        1.1

            jQuery(selector,context):

            接收一个css选择器表达式(selector)和可选的选择器上下文(context),返回一个包含了匹配的DOM元素的jQuery对象。

            默认情况下,对匹配元素的查找都是从根元素ducument对象开始,也就是说查找范围是整棵文档树。但是如果给定了上下文context,则在指定上下文中查找.

            ps.

            <span>body span</span>

            <span>body span</span>

            <span>body span</span>

            <div class="wrap">

                <span>wrap span</span>

                <span>wrap span</span>

                <span>wrap span</span>

            </div>

            $('span').css('background-color','red');//所有的span都会变红

            $('span','.wrap').css('background-color','red');//只有.wrap中的span会变红

        1.2

            jQuery(html,ownerDocument) 、jQuery(html,props):

            用所提供的html创建dom元素。

            html参数是要创建的标签,可以是单标签也可以是多标签。

            第二个参数用于创建新DOM元素的文档对象,如果不传入则默认为当前的文档对象。

            //单标签  两种方式都可以往body中插入div

            $('<div>').appendTo('body');

            $('<div></div>').appendTo('body'); 

            // 多标签嵌套

            $('<div><span>dfsg</span></div>').appendTo('body')

            appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容。

            同样也有其他方法在被选元素的头部,以及头部外部,尾部外部添加元素。

        1.3

            jQuery(element or elementsArray):

            如果传入一个DOM元素或者是DOM元素的数组,则把DOM元素封装到jQuery对象中并返回。

            <ul>

                <li>1</li>

                <li>2</li>

                <li>3</li>

                <li>4</li>

                <li>5</li>

            </ul>

            // 传入DOM元素

            $('li').each(function(index,ele){

                    $(ele).on('click',function(){

                        $(this).css('background','red');//这里的DOM元素就是this

                    })

            })

            //传入DOM数组

            var aLi=document.getElementsByTagName('li');

                aLi=[].slice.call(aLi);//集合转数组

                var $aLi=$(aLi);

                $aLi.html('我是jQuery对象');//所有的li的内容都变成'我是jQuery对象'

        1.4

            jQuery(object):

            如果传入的是一个object对象,则把该对象封装到jQuery对象中并返回。

            var obj={name:'谦龙'};

            var $obj=$(obj);//封装成jQuery对象

            //绑定自定义事件

            $obj.on('say',function(){

                console.log(this.name)//输出谦龙

            });

            $obj.trigger('say')

        1.5

            jQuery(callback):

            当传进去的参数是函数的时候,则在document对象上绑定一个ready事件监听函数,当DOM结构加载完成的时候执行。

            $(function(){

            })

            //以上代码和下面的效果是一样的

            $(document).ready(function(){

                ...//代码

            })

        1.6

            jQuery(jQuery object):

            当传进去的参数是一个jQuery对象的时候,则创建该jQuery对象的一个副本并返回。副本与传入的jQuery对象引用完全相同的元素。

            var aLi=$('li');

            var copyLi=$(aLi);//创建一个aLi的副本

            console.log(aLi);

            console.log(copyLi);

            console.log(copyLi===aLi);

        1.7

            jQuery():

            如果不传入任何的参数,则返回一个空的jQuery对象,属性length为0。

            注意这个功能可以用来复用jQuery对象,例如可以创建一个空的jQuery对象,然后在需要的时候先手动修改其中的元素,然后在调用jQuery方法。从而避免重复创建jQuery对象。

    2. :gt()

        :gt 选择器选取 index 值高于指定数的元素。

        ps.

            $('tr:gt(0)'):选取下表为0 之后所有的tr元素。

        扩展:

            :lt 选择器来选取 index 值小于指定数的元素。

    3. each()

        each() 方法规定为每个匹配元素规定运行的函数。

        通俗来讲就是循环便利,相当于是for,foreach.

        $('tr:gt(0)').each(function () {

            console.log(this);

            这里的this指向的是循环遍历的每一个tr 下的 td;

                ps.

                    输出结果:

                            <td width="150px">31</td>

                <td width="150px">iphhone</td>

                <td width="300px">

                <button>-</button>

                <input type="text" value="0">

                <button>+</button>

                </td>

                <td width="150px">$4000</td>

                <td width="150px">0</td>

                <td width="150px"><a class="a">移除</a></td>

            可以说是指向当前调用者;

        })

    4. find()

            find() 方法返回被选元素的后代元素。

            $(this).find('td:eq(2)')

        4.1

            eq():

            :eq() 选择器选取带有指定 index 值的元素。

        在 第3部 $(this) 拿到每一个tr下面的所有td之后

        .find('td:eq(2)') 去查找第三个td

    5. children()

            children() 方法返回返回被选元素的所有直接子元素,也就是说第一代子级

        5.1

            children()和find()的区别

            children():只返回儿子一级的子元素

            find():返回所有后代

    6. first()  last()

        first():返回第一个匹配到的元素

        last():返回最后一个匹配到的元素

    7. 拿到加减号给加减号添加点击事件

        7.1

            $(this).find('td:eq(2)').children().first()

            拿到tr下的第三个td找到里边的子元素获取到第一个元素 减号 添加点击事件

            <td width="300px">

        <button>-</button>

        <input type="text" value="0">

        <button>+</button>

        </td>

        7.2

            $(this).find('td:eq(2)').children().last()

            拿到tr下的第三个td找到里边的子元素获取到最后一个元素 加号 添加点击事件

            <td width="300px">

        <button>-</button>

        <input type="text" value="0">

        <button>+</button>

        </td>

    8. next()  prev()

        8.1

            next(): 方法返回被选元素的后一个同级元素

            prev(): 获得匹配元素集合中每个元素紧邻的前一个同胞元素,通过选择器进行筛选是可选的。

        8.2

            $(this).next().val(); $(this).next().prev();

            在加号减号分别拿到input里商品数量,进行商品数量操作。

    9. val()  text()

        9.1

            val()

                方法返回或设置被选元素的值。

                元素的值是通过 value 属性设置的。该方法大多用于 input 元素。

        9.2

            text()

                方法设置或返回被选元素的文本内容。

                当该方法用于返回内容时,则返回所有匹配元素的文本内容(会删除 HTML 标记)。

                当该方法用于设置内容时,则重写所有匹配元素的内容。

        9.3

            html():补充

                方法设置或返回被选元素的内容(innerHTML)。

                当该方法用于返回内容时,则返回第一个匹配元素的内容。

                当该方法用于设置内容时,则重写所有匹配元素的内容。

        9.4

            text() html() 区别:

            一个是操作文本内容,一个是操作元素内容。

    10. 加减事件

        10.1

            加号事件

                10.1.1

                    通过$(this).prev().val();拿到加号上一个元素,也就是input商品数量的值,进行 加1

                    然后商品数量加了之后,

                    要给input重新赋值,

                    要重新计算商品的总价以及购物车的总金额

                    jia.click(function () {

            var num = $(this).prev().val();

            num++;

            $(this).prev().val(num);//给input重新赋值

            total($(this));//调用购物车总金额函数

            allmoney();//调用购买商品总价函数

            })

        10.2

            减号事件

                10.2.1

                    通过$(this).next().val();拿到加号下一个元素,也就是input商品数量的值,进行 加1

                    然后商品数量加了之后,

                    要给input重新赋值,

                    要重新计算商品的总价以及购物车的总金额

                    jian.click(function () {

            var num = $(this).next().val();

            num--;

            if (num < 0) {

            num = 0;

            if (confirm("已经是0件了你确定要删除这件商品吗") == true) {

            $(this).parent().parent().remove();

            }

            }

            $(this).next().val(num);

            total($(this));

            allmoney();

            })

                10.2.2

                    confirm()

                        方法用于显示一个带有指定消息和确认及取消按钮的对话框。

                        如果访问者点击"确定",此方法返回true,否则返回false。

    11. parent()

            方法返回被选元素的直接父元素。该方法只沿着 DOM 树向上遍历单一层级。

            11.1

                parents():方法返回被选元素的所有祖先元素。

                祖先是父、祖父、曾祖父,依此类推。

                该方法从父元素向上遍历 DOM 元素的祖先,直至文档根元素的所有路径(<html>)。

            注意:

                如果 filter 参数为空,该方法将从直接父元素直至 <body> 和 <html> 的所有路径中选取元素集合中的所有祖先。因此传递一个缩小搜索结果范围的选择器表达式是非常有用的。

            11.2

                closest(): 方法返回被选元素的第一个祖先元素。

                祖先是父、祖父、曾祖父,依此类推。

                该方法从当前元素向上遍历,直至文档根元素的所有路径(<html>),来查找 DOM 元素的第一个祖先元素。

            11.2.1

                parents() 与 closest() 的不同

                parents()

                    从父元素开始

                    沿 DOM 树向上遍历,并返回匹配所传递的表达式的所有祖先

                    返回包含零个、一个或多个元素的 jQuery 对象

                closest()

                    从当前元素开始

                    沿 DOM 树向上遍历,并返回匹配所传递的表达式的第一个祖先

                    返回包含零个或一个元素的 jQuery 对象

            11.3

                parentsUntil():方法返回介于 selector 与 stop 之间的所有祖先元素。

                该方法从父元素向上遍历 DOM 元素的祖先,直至文档根元素的所有路径,直到到达指定的元素为止。

                注意:

                如果两个参数都为空,该方法将返回所有祖先元素(与 parents() 方法相同)。

                .parentsUntil(stop,filter)

    12. substr()

            方法可在字符串中抽取从 start 下标开始的指定数目的字符。

            返回值:

            一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。

    13. remove()

            方法移除被选元素,包括所有的文本和子节点。

            该方法也会移除被选元素的数据和事件。

            13.1

                detach()

                    方法移除被选元素,包括所有的文本和子节点。然后它会保留数据和事件。

                    该方法会保留移除元素的副本,允许它们在以后被重新插入。

            13.2

                empty()

                    方法移除被选元素的所有子节点和内容。

                    该方法不会移除元素本身,或它的属性。

    14. :not()

            方法返回不符合一定条件的元素。

            该方法让您规定一个条件。不符合条件的元素将从选择中返回,符合条件的元素将被移除。

            该方法通常用于从被选元素组合中移除一个或多个元素。

            14.1

                filter()

                    方法返回符合一定条件的元素。

                    该方法让您规定一个条件。不符合条件的元素将从选择中移除,符合条件的元素将被返回。

                    该方法通常用于缩小在被选元素组合中搜索元素的范围。

        tr:not(:first):not(:last):

        返回除了第一个和最后一个的tr元素集合。

    15. 计算单个商品总价  计算总购买价

        15.1

            单个商品总价

            //商品单个总价

        function total(o) {

                // 参数o 加减调用时所传的当前的元素集合

        var n = o.parent().children().first().next().val();

                // n 代表的是找到o,也就是说找到加号或者是减号的  parent父级元素 的 children儿子元素 的 first第一个元素的 next下一个元素 的 val值

                // 也就是说拿到input框里的商品数量

        var money = Number(o.parent().next().text().substr(1));

                // money 代表的是 o 父级的下一个元素的text文本 然后通过substr拿到商品单个价格  也就是¥2000

        o.parent().next().next().text(n * money);

                //最后找到 展示总价的td,计算出总价之后赋值。

        }

        15.2

            计算所有商品的总价

            //总购买价

            function allmoney() {

            var num = 0;

            $('tr:not(:first):not(:last)').each(function () {

                        // tr:not(:first):not(:last) 这里的意思就是除了第一个tr 和 最后一个tr 去循环

                        //因为这里的第一个tr和最后一个tr是表头和表尾

            num += Number($(this).find('td:eq(4)').text());

                        //最后就是把所有的tr里面第五个td的文本 也就是单个商品的总价 相加计算出 所有总价

            })

            $('tr:last').children().first().next().text(num);

                    // 最后找到最后一个tr里的儿子元素的第二个元素 设置文本内容  也就是总价。

            }

    16. 删除商品

        16.1

            拿到当前要删除商品的总价

            $(this).parent().prev().text();

        16.2

            拿到购物车总价

            $('tr:last').children().first().next().text();

        16.3

            最后用购物车总价减去单个商品的总价,重新给购物车总价赋值

            $('tr:last').children().first().next().text(b-a);

            然后删除整条元素

            $(this).parent().parent().remove();

    17. 清除购物车

        17.1

            删除所有商品

            $('tr:not(:first):not(:last)').remove();

            这里是除了第一个tr和最后一个tr,其余的tr元素全部删除,

            操作dom,来改变购物车展示的内容。

        17.2

            清空总价数据为0

            $('tr:last').children().first().next().text('0');

    总结:

        1.jquery 实际操作dom

        2.涉及原生方法

        3.购物车逻辑

            3.1 添加商品,增加商品数量,增加单个商品总价,同时增加总金额

            3.2 减少商品,减少商品数量,减少单个商品总价,同时减少总金额

                当商品数量小于0时移除商品

            3.3 删除商品,减少商品总价

            3.4 清空购物车,总金额变为0

        4.this指向

            方法中的所有this均指向当前调用者

        5.最后总结一下子,基础其实很重要。

    附上源码:

    <!DOCTYPE html>

    <html>

    <head>

        <meta charset="UTF-8">

        <title></title>

    </head>

    <style type="text/css">

        td {

            text-align: center;

            height: 50px;

            border-bottom: 1px solid gray;

        }

        a {

            padding: 5px 10px;

            background: red;

            color: #fff;

            font-weight: bold;

            border-radius: 5px;

            text-align: center;

        }

        tr:last-child td {

            border: none;

        }

    </style>

    <body>

        <table cellspacing="0" cellpadding="0">

            <tr>

                <td width="150px">产品编号</td>

                <td width="150px">产品名字</td>

                <td width="300px">产品数量</td>

                <td width="150px">单价</td>

                <td width="150px">总价</td>

            </tr>

            <tr>

                <td width="150px">31</td>

                <td width="150px">iphhone</td>

                <td width="300px">

                    <button>-</button>

                    <input type="text" value="0">

                    <button>+</button>

                </td>

                <td width="150px">$4000</td>

                <td width="150px">0</td>

                <td width="150px"><a class="a">移除</a></td>

            </tr>

            <tr>

                <td width="150px">52</td>

                <td width="150px">NOKIA</td>

                <td width="300px">

                    <button>-</button>

                    <input type="text" value="0">

                    <button>+</button>

                </td>

                <td width="150px">$2000</td>

                <td width="150px">0</td>

                <td width="150px"><a class="a">移除</a></td>

            </tr>

            <tr>

                <td width="150px">77</td>

                <td width="150px">Samng</td>

                <td width="300px">

                    <button>-</button>

                    <input type="text" value="0">

                    <button>+</button>

                </td>

                <td width="150px">$1000</td>

                <td width="150px">0</td>

                <td width="150px"><a class="a">移除</a></td>

            </tr>

            <tr>

                <td width="150px">23</td>

                <td width="150px">qq</td>

                <td width="300px">

                    <button>-</button>

                    <input type="text" value="0">

                    <button>+</button>

                </td>

                <td width="150px">$3000</td>

                <td width="150px">0</td>

                <td width="0px"><a class="a">移除</a></td>

            </tr>

            <tr>

                <td width="150px">总购买价</td>

                <td width="150px">0</td>

                <td width="300px"></td>

                <td width="150px"></td>

                <td width="0px"><a id="qingchu">清空购物车</a></td>

                <td width="150px"></td>

            </tr>

        </table>

    </body>

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

    <script type="text/javascript">

        $('tr:gt(0)').each(function () {

            var jian = $(this).find('td:eq(2)').children().first()

            var jia = $(this).find('td:eq(2)').children().last()

            //          减点击事件

            jian.click(function () {

                var num = $(this).next().val();

                num--;

                if (num < 0) {

                    num = 0;

                    if (confirm("已经是0件了你确定要删除这件商品吗") == true) {

                        $(this).parent().parent().remove();

                    }

                }

                $(this).next().val(num);

                total($(this));

                allmoney();

            })

            //加点击事件

            jia.click(function () {

                var num = $(this).prev().val();

                num++;

                $(this).prev().val(num);

                total($(this));

                allmoney();

            })

        })

        //商品单个总价

        function total(o) {

            var n = o.parent().children().first().next().val();

            var money = Number(o.parent().next().text().substr(1));

            o.parent().next().next().text(n * money);

        }

        //总购买价 

        function allmoney() {

            var num = 0;

            $('tr:not(:first):not(:last)').each(function () {

                num += Number($(this).find('td:eq(4)').text());

            })

            $('tr:last').children().first().next().text(num);

        }

        //删除

        $('.a').click(function () {

            let a=$(this).parent().prev().text();//当前商品的总价

            let b=$('tr:last').children().first().next().text();//购物车的总价

            $('tr:last').children().first().next().text(b-a);

            $(this).parent().parent().remove();

        })

        //清除购物车

        $('#qingchu').click(function () {

            $('tr:not(:first):not(:last)').remove();

            $('tr:last').children().first().next().text('0');

        })

    </script>

    </html>

    相关文章

      网友评论

        本文标题:大厂都在看的购物车

        本文链接:https://www.haomeiwen.com/subject/xldywctx.html