淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章。在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识。

这篇文章主要探讨的是智能搜索框Ajax异步加载数据。jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件。我在相关的网站上找过想实现类似功能的插件,但是没有找到。于是乎,自己动手丰衣足食。自己来搭建智能搜索框下拉列表。当然,如果有类似功能并且常维护Bug的插件,望留言交流。

源码地址: 淘宝购物车页面--PC端和移动端项目实战

首先需要先给大家打一根预防针。本人实现的智能搜索框下拉列表只供学习参考使用。因为智能搜索和模糊匹配的实现没有那么简单,它需要自己的一套系统。如果想实现相同的功能,可以看看这个 智能搜索框制作 的视频。 视频中远人老师介绍了如何去获取微软必应搜索引擎的数据库然后实现智能搜索和模糊匹配的功能。

简单的介绍一下智能搜索框实现的一些功能:

  1.当输入特定字符(在JSON数据定义的是查询字符串(‘lan‘))时,会有一个下拉列表弹出,并且每一个li元素都有相应的数据(调用了search.json)。这里使用的是$.get方法获取JSON数据,然后动态加载HTML,最后插入到客户端的某个空容器中。

  2:在搜索框输入字符串‘lan‘,按下回车键,会有相应的商品被异步加载到页面中。这里也是使用了jQuery Ajax的$.get方法,调用了basketballShoes.json文件。

  3:当我想查询某个商品,比如李宁的音速3篮球鞋。在搜索框输入‘音速3‘,按下回车,相应的商品被异步加载到页面中。

  4:在搜索框中查询,并且被异步加载到页面中的商品,所有的事件都需要绑定到非动态加载HTML的元素上(此实战绑定在了body元素上),不能绑定在该元素上。否则,所有事件都会失效。这里涉及了事件代理和事件冒泡的原理。

 以下的分享会分为如下部分

  1.智能搜索下拉列表的实现

  2.ajax异步获取商品

  3.事件代理和事件冒泡

1.智能搜索下拉列表的实现

  首先,需要做的是定义想要查询的JSON数据。

[
    [
        {
            "Query":"lan",
            "Results":[
                {
                    "Type":"AS",
                    "Suggests":[
                        {
                            "Txt":"Nike 耐克官方 ZOOM KOBE 男子篮球鞋 "
                        },
                        {
                            "Txt":"adidas Regulate  篮球鞋 "
                        },
                        {
                            "Txt":"李宁2016新款男子音速3高帮反弹篮球鞋"
                        },
                        {
                            "Txt":"李宁2016新款男子减震CBA魅影篮球鞋"
                        },
                        {
                            "Txt":"李宁男子专业篮球鞋CBA球迷空袭"
                        },
                        {
                            "Txt":"adidas罗斯系列场上款篮球鞋"
                        },
                        {
                            "Txt":"adidas Boost 罗斯系列篮球鞋 JXO25 "
                        },
                        {
                            "Txt":"adidas场上款篮球鞋 D Rose 7 Primeknit"
                        }
                    ]
                }
            ]
        }
    ]
]

search.json

  JSON是指Javascript对象字面量表示法,是一种用于数据交换的文本格式。每一个JSON对象,都是一个值。要么是简单类型的值,要么是复合类型的值。JSON对值的类型和格式有着严格的规定,比如说对象的名称(键名)必须放在双引号内,数组或对象的最后一个成员的后面,不能加逗号等等。所以构建JSON时一定要放到网上去检查一下是否书写正确。否则,JSON一旦出错,浏览器也不会报错。这个查错的成本就很高了。

  以下是智能搜索的js代码。输入‘lan‘ ,就有相应的下拉框弹出。

//搜索框下拉列表
    $(‘body‘).on(‘keyup‘,‘.header-search-input‘,function(event){
        //获取输入的值
        var $val = $(this).val();
        //使用$.get()方法,并且将查询的值放在URI后面
        $.get(‘search.json‘,{‘Query‘:$val}, function(data) {
            for (var i = 0; i < data.length; i++) {
                //如果值与json中的query字段匹配,动态加载html
                if ($val === data[i][0].Query) {
                    var $data = data[i][0].Results[0].Suggests;
                    var $html= ‘‘;
                    $html+=‘<ul>‘;
                    //全局函数$.each,也可以使用for循环
                    $.each($data, function(index, val) {
                        $html+=‘<li>‘+val.Txt+‘</li>‘;
                    });
                    $html+=‘</ul>‘;
                    //下列列表dispaly:none的,当符合条件后
                    //调用show()函数,然后设定css样式
                    $(‘.list‘).html($html).show().css({
                        ‘position‘:‘absolute‘,
                        ‘left‘:0,
                        ‘top‘:$(‘.header-search-input‘).height()+5
                    })
                }
            }

            //当点击每一条li数据时,会相应的将数据作为搜索框的值
            $(‘.list li‘).click(function(event) {
                var $liText = $(this).text();
                $(‘.header-search-input‘).val($liText);
            });
        });
        //如果值为空,则隐藏整个列表
        if ($(this).val() === ‘‘) {
            $(‘.list‘).hide();
        }
        //按下回车时,调用shoppingCart()函数。
        if (event.which === 13) {
            shoppingCart();
        }
    });

2.Ajax异步获取商品

  在输入相应的查询字符串(‘lan‘ 或者是 ‘音速3‘),按下回车键之后,会有相应的商品被动态加载到html结构当中,这里调用了baskedballShoes.json。

[
    [
        {
            "Query":"lan",
            "Results":[
                {
                    "Type":"AS",
                    "Suggests":[
                        {
                            "Txt":"李宁2016新款男子篮球鞋音速3高帮反弹篮球场地鞋ABAL031",
                            "num":339,
                            "max":764,
                            "label":"liningBas",
                            "shop":"李宁官方网店",
                            "image":"css/images/lining-bas.png",
                            "color":"颜色分类:荧光果粉/木梅红",
                            "size":"鞋码:42",
                            "nonDiscount":"¥539.00",
                            "bandCard":"css/images/bankCard.png",
                            "sevenDay":"css/images/sevenDay.png",
                            "guarantee":"css/images/guarantee.png"
                        },
                        {
                            "Txt":" adidas阿迪达斯篮球男子篮球鞋Regulate",
                            "num":419,
                            "max":18,
                            "label":"adidas",
                            "nonDiscount":"¥539.00",
                            "image":"css/images/adidas.png",
                            "color":"颜色分类:银金属/深藏青蓝",
                            "shop":"adidas官方旗舰店",
                            "size":"鞋码:43.5",
                            "bandCard":"css/images/bankCard.png",
                            "sevenDay":"css/images/sevenDay.png",
                            "guarantee":"css/images/guarantee.png"
                        }
                    ]
                }
            ]
        }
    ],
    [
        {
            "Query":"音速3",
            "Results":[
                {
                    "Type":"AS",
                    "Suggests":[
                        {
                            "Txt":"李宁2016新款男子篮球鞋音速3高帮反弹篮球场地鞋ABAL031",
                            "num":339,
                            "max":764,
                            "shop":"李宁官方网店",
                            "image":"css/images/lining-bas.png",
                            "color":"颜色分类:荧光果粉/木梅红",
                            "size":"鞋码:42",
                            "nonDiscount":"¥539.00",
                            "bandCard":"css/images/bankCard.png",
                            "sevenDay":"css/images/sevenDay.png",
                            "guarantee":"css/images/guarantee.png"
                        }
                    ]
                }
            ]
        }
    ]
]

basketballShoes.json

  这里需要注意一点的是,因为是使用Ajax 异步加载商品,动态创建html然后返回客户端,所以需要把某件商品的信息全部写到JSON中,比如商品图片,商品信息,单价,数量,金额等。然后再循环遍历每一个数组中的元素,通过点操作将数据写入浏览器中。

  以下是Ajax异步获取商品的js代码。输入‘lan‘回车或者输入‘音速3‘回车。当然,可以在JSON中自行修改字符串的匹配。需要注意的是,因为是按下回车之后的查询,所以当event.which===13的时候,调用了shoppingCart()函数。

  1     //购物车存放产品--- 通用function
  2     function shoppingCart(){
  3         //获取输入框的值,用于字符串匹配
  4         var $val = $(‘.header-search-input‘).val();
  5         $.get(‘basketballShoes.json‘,{‘Query‘:$val}, function(data) {
  6             for (var i = 0; i < data.length; i++) {
  7                 if ($val === data[i][0].Query) {
  8                     //字符串匹配
  9                     //当输入‘lan‘时,会匹配第一个数组
 10                     //当输入‘音速3‘时,会匹配第二个数组。
 11                     //也可以自行修改字符串匹配规则。
 12                     var $data = data[i][0].Results[0].Suggests;
 13                     var $html = ‘‘;
 14                     //使用$.each()方法循环每一个$data,
 15                     //然后动态加载html,
 16                     //把相应的商品信息放到指定的.commodityContainer容器中
 17                     $.each($data, function(index, val) {
 18                         $html+=‘<div class="mainCommodity">‘;
 19                         $html+=‘<div class="shopInfo">‘;
 20                             $html+=‘<div class="shopMsg">‘;
 21                                 //$.each()中回调函数中的第二个参数指定的是每一个值,
 22                                 //通过点操作来获取每个字段。
 23                                 //比如val.label 就为 ‘李宁2016新款男子篮球鞋音速3高帮反弹篮球场地鞋ABAL031‘。
 24                                 //下面的操作相同。
 25                                 $html+=‘<input type="checkbox" name="shopMsg" id="‘+val.label+‘" class="shopMsg-input" autocomplete="off">‘;
 26                                 $html+=‘<label for="‘+val.label+‘">‘;
 27                                 $html+=‘店铺:‘;
 28                                 $html+=‘</label>‘;
 29                                 $html+=‘<a href="#">‘+val.shop+‘‘;
 30                                 $html+=‘</a>‘
 31                                 $html+=‘</div>‘;
 32                         $html+=‘</div>‘;
 33                         $html+=‘<div class="commodityInfo">‘;
 34                         $html+=‘<ul>‘;
 35                             $html+=‘<li class="td-chk">‘;
 36                                 $html+=‘<div class="td-inner">‘;
 37                                 $html+=‘<input type="checkbox" name="checkbox" autocomplete="off">‘;
 38                                 $html+=‘</div>‘;
 39                             $html+=‘</li>‘;
 40                             $html+=‘<li class="td-item">‘;
 41                                 $html+=‘<div class="td-inner">‘;
 42                                     $html+=‘<a class="desImg" href="#">‘;
 43                                     $html+=‘<img alt="‘+val.Txt+‘" src="‘+val.image+‘">‘;
 44                                     $html+=‘</a>‘;
 45                                     $html+=‘<div class="item-info">‘;
 46                                         $html+=‘<div class="item-basis-info">‘;
 47                                             $html+=‘<a href="#">‘+val.Txt+‘‘;
 48                                             $html+=‘</a>‘;
 49                                         $html+=‘</div>‘;
 50                                         $html+=‘<div class="item-other-info">‘;
 51                                             $html+=‘<div class="item-other-space"></div>‘;
 52                                             $html+=‘<div class="item-other-list">‘;
 53                                                 $html+=‘<a href="#" title="支持信用卡支付">‘;
 54                                                     $html+=‘<img alt="支持信用卡支付" src="‘+val.bandCard+‘">‘;
 55                                                 $html+=‘</a>‘;
 56                                                 $html+=‘<a href="#" title="7天无理由" class="sevenDay">‘;
 57                                                     $html+=‘<img alt="7天无理由" src="‘+val.sevenDay+‘">‘;
 58                                                 $html+=‘</a>‘;
 59                                                 $html+=‘<a href="#" title="消费者保障服务">‘;
 60                                                     $html+=‘<img alt="消费者保障服务" src="‘+val.guarantee+‘">‘;
 61                                                 $html+=‘</a>‘;
 62                                             $html+=‘</div>‘;
 63                                         $html+=‘</div>‘;
 64                                     $html+=‘</div>‘;
 65                                 $html+‘</div>‘;
 66                             $html+=‘</li>‘;
 67                             $html+=‘<li class="td-info">‘;
 68                                 $html+=‘<div class="td-info-msg">‘;
 69                                     $html+=‘<p>‘+val.color+‘</p>‘;
 70                                     $html+=‘<p>‘+val.size+‘</p>‘;
 71                                 $html+=‘</div>‘;
 72                             $html+=‘</li>‘;
 73                             $html+=‘<li class="td-price">‘;
 74                                 $html+=‘<div class="td-inner">‘;
 75                                     $html+=‘<p class="non-discount">‘+val.nonDiscount+‘</p>‘;
 76                                     $html+=‘<p class="discount">¥‘;
 77                                         $html+=‘<span>‘+val.num+‘.00</span>‘;
 78                                     $html+=‘</p>‘;
 79                                     $html+=‘<div class="promotion">卖家促销‘;
 80                                         $html+=‘<i class="promotionIcon"></i>‘;
 81                                     $html+=‘</div>‘;
 82                                     $html+=‘<div class="proSlidedown">‘;
 83                                         $html+=‘<p class="newPro">卖家促销:秋季特惠</p>‘;
 84                                         $html+=‘<p>优惠:¥200.00</p>‘;
 85                                     $html+=‘</div>‘;
 86                                 $html+=‘</div>‘;
 87                             $html+=‘</li>‘;
 88                             $html+=‘<li class="td-amount">‘;
 89                                 $html+=‘<div class="item-amount">‘;
 90                                     $html+=‘<a href="#" class="amount-left amount-color">-</a>‘;
 91                                     $html+=‘<input type="text" name="amountNum" value="1" autocomplete="off" />‘;
 92                                     $html+=‘<a href="#" class="amount-right">+</a>‘;
 93                                 $html+=‘</div>‘;
 94                                 $html+=‘<div class="stock">‘+val.max+‘</div>‘;
 95                                 $html+=‘<div class="outNum">‘;
 96                                     $html+=‘<span class="instr">最多只能购买</span>‘;
 97                                     $html+=‘<span class="stockNum"></span>‘;
 98                                     $html+=‘<em>件</em>‘;
 99                                 $html+=‘</div>‘;
100                             $html+=‘</li>‘;
101                             $html+=‘<li class="td-sum">‘;
102                                 $html+=‘<em>¥</em>‘
103                                 $html+=‘<span>‘+val.num+‘.00</span>‘;
104                             $html+=‘</li>‘;
105                             $html+=‘<li class="td-operation">‘;
106                                 $html+=‘<p>‘;
107                                     $html+=‘<a href="#" class="delete">删除</a>‘;
108                                 $html+=‘</p>‘;
109                             $html+=‘</li>‘;
110                         $html+=‘</ul>‘;
111                         $html+=‘</div>‘;
112                         $html+=‘</div>‘;
113                         //将动态加载的html放到指定的容器中,
114                         //这里首先应该在html中放上一个空容器
115                         //<div className="commidityContainer"></div>
116                         $(‘.commodityContainer‘).html($html);
117                     });
118                 }
119             }
120         });
121     }

3.事件代理和事件冒泡

  简单的介绍一下这两个概念吧。

  事件传播模型会经历两个阶段。一是事件捕获,二是事件冒泡。事件捕获是指事件首先会交给最外层的元素,接着再交给更具体的元素。而事件冒泡是指当事件发生时,会首先发送给最具体的元素,在这个元素获得响应机会之后,事件会向上冒泡到更一般的元素。

  在jQuery中,默认情况下始终会在模型的冒泡阶段注册事件处理程序。因此,可以假定最具体的元素首先获得响应事件的机会。

  事件代理,也叫事件委托。事件委托就是利用事件冒泡的一项高级技术。通过事件委托,可以借助一个元素上的事件处理程序完成很多工作。

  有时候我们需要给没有被渲染到浏览器的 (可能将来会被渲染)一段DOM元素绑定事件,比如说给一段通过Ajax请求完成后渲染的DOM节点绑定事件。一般绑定的逻辑会在渲染前执行,绑定的时候找不到元素所以事件会失效,使用事件代理/委托可以解决这种动态加载HTML元素的事件绑定问题。并且,事件代理的性能比单独绑定事件要好的多。

  在这个实战中,

  事件冒泡主要应用在扩大全选按钮和商品选择按钮的点击范围。

  事件代理主要应用在通过Ajax异步加载的商品。

  在这个例子中,把商品数量的输入框的keypress,keyup,blur事件全部代理到body元素中,这样就能确保每个事件都能够生效。而不会因为HTML元素未被浏览器渲染而导致事件失效的情况。当然商品数量增加和商品数量减少也是同样的原理。具体事件的代码会在下次分享中谈及。

  源码地址: 淘宝购物车页面--PC端和移动端项目实战

  完。

  感谢大家的阅读。

时间: 2024-10-23 01:51:20

淘宝购物车页面 智能搜索框Ajax异步加载数据的相关文章

使用ajax异步加载数据

使用ajax异步加载数据 controller为User赋值 @RequestMapping("/a2") public List<User> a2() { List<User> userlist = new ArrayList<User>(); userlist.add(new User("大头儿子", 6, "男")); userlist.add(new User("小头爸爸", 30,

Ajax异步加载数据及Redis缓存

针对网页分类条目的动态加载,图为页面的Head部分. //categoryListServlet准备分类数据 ProductService service = new ProductService(); List<Category> categoryList = service.findAllCategoryList(); response.setContentType("text/html; charset=utf-8"); Gson gson = new Gson();

ajax异步加载问题

使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.

淘宝购物车页面 -- PC端和移动端实战

最近花了半个月的时间,做了一个淘宝购物车页面的demo.当然,为了能够更加深入的学习,不仅仅有PC端的固定宽度的布局,还实现了移动端在media query为768px以下(也就是实现了ipad,iphone 6 plus,iphone6,S5等)的flexbox弹性布局. 还要再说的是,pc端和移动端淘宝购物车页面的bug基本修复完毕,完全适合一个对html,css,css3 ,html5和js有基础,并且熟悉jquery,scss,熟悉json数据交换格式,jquery ajax的人进行学习

jQuery的AJax异步加载片段

主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何内容: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>AJax异步加载</title> <scri

向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)

/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name ajax异步的URL中的页码参数名 如pageno page_no 初始加载页码,默认1 [如2,则与前面两参数结合为data.php?pageno=2] is_lazyload 是否开启懒加载 page_count 总页数 empty_msg 没有数据的时候提示(可传输图片) ending_msg

SpringMVC+Jquery -页面异步加载数据

背景: 做项目时涉及到页面,当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新,这都是几百年前使用的技术了.你用post实现异步加载数据.然后就...... ResultUtil.java 工具类: package com.sgcc.uds.fs.config.web.util; import java.util.HashMap; import java.util.Map; import net.sf.json.JSO

Ajax异步加载后台数据(换页面,加强用户体验所用)

主页面代码,转向需要显示数据的页面 <a href="user/index">用户维护</a>  基于ssm框架的后端控制器代码,接收前端请求,转向预定的页面 @RequestMapping("/index") public String index() { return "user/index"; } 这个时候就要在index.jsp中使用Ajax加载数据,使用Ajax向后端控制器发出要求,需要在index中定义一个方法

使用Ajax异步加载页面时,怎样调试该页面的Js

前言-本人不是干前端的,所以有的名词不专业 在前端中,有时候会遇到这样的框架,http://172.17.11.151:8060/frontend/backend.html#1.html (通过解析URL,把1.html异步加载到指定位置),不知道这样的框架叫什么名字. 那我们就会遇到一个问题,调试1.html的时候怎么办,通过浏览器掉出控制台找不到1.Html页面,无法加断点啊. 解决办法 在1.html 你所要调试位置加上一句代码  debugger;  就可以了,就是这么爽 可以调试了,可