我想把购物车cart部分也像老师这样写,但是就是整不出来
来源:1-5 按需加载商品详情
10hours
2019-11-17 15:52:09
一直出现这样的问题,请老师解答
关键是index.js里面的132行-162行 我这样写一直报错 显示url undefined 为什么?
//index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="../css/base.css"> <link rel="stylesheet" href="../css/index.css"> <link rel="stylesheet" href="../css/common.css"> <link rel="stylesheet" href="../css/iconfont.css"> </head> <body> <div class="nav-site"> <div class="container"> <ul class="fl"> <li class="fl"> <a href="###" class="nav-site-login fl ">亲,请登录</a> </li> <li class="nav-site-signup fl link">免费注册</li> <li class="nav-site-mobile fl link">手机逛木桃</li> </ul> <ul class="fr"> <li class="menu dropdown fl" data-active='menu'> <a href="#" target="_blank" class="dropdown-toggle link transition">我的木桃<i class="dropdown-arrow"></i></a> <ul class="dropdown-layer dropdown-left transition"> <li><a href="#" target="_blank" class="menu-item">已买到的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">我的足迹</a></li> </ul> </li> <li class="menu dropdown fl" data-active='menu'> <a href="#" target="_blank" class="dropdown-toggle link ">收藏夹<i class="dropdown-arrow"></i></a> <ul class="dropdown-layer dropdown-left transition"> <li><a href="#" target="_blank" class="menu-item">收藏的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">收藏的店铺</a></li> </ul> </li> <li class="fl"> <a href="#" target="_blank" class="nav-site-category link">商品分类</a> </li> <div class="menu dropdown fl" data-active='menu' data-load="../js/sell.json"> <a href="#" target="_blank" class="dropdown-toggle link ">卖家中心<i class="dropdown-arrow"></i></a> <div class="dropdown-layer dropdown-left "> <li class="dropdown-loading"></li> <!-- <ul> <li><a href="#" target="_blank" class="menu-item">免费开店</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> <li><a href="#" target="_blank" class="menu-item">已卖出的宝贝</a></li> </ul> --> </div> </div> <li class="menu dropdown fl nav-site-service" data-active='menu'> <a href="#" target="_blank" class="dropdown-toggle link ">联系客服<i class="dropdown-arrow"></i></a> <ul class="dropdown-layer dropdown-right transition"> <li><a href="#" target="_blank" class="menu-item">消费者客服</a></li> <li><a href="#" target="_blank" class="menu-item">我的足迹</a></li> </ul> </li> </ul> </div> </div> <div class="header"> <div class="container"> <h1 class="fl"><a href="index.html" class="header-logo text-hidden">mutao</a></h1> <!-- h1标签的使用有助于seo优化,就是方便网络爬虫在我们网页上爬取到重要信息,h1标签权重高,会优先被爬虫爬取。所以logo、重要信息等优先用h、em等标签包裹,但是这些标签不能过多 --> <div id='header-search' class="header-search fl"> <form action="https://s.taobao.com/search" target="_blank" class='search-form'> <input type="text" name="q" class="search-inputbox fl" placeholder="mutaogouwu" autocomplete="off"> <input type="submit" value="搜索" class="search-btn fl"> </form> <ul class="search-layer"> <!-- <li class="search-layer-item text-ellipsis">东西很长要省略就用text-overflow: ellipsis;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;overflow: hidden;</li> <li class="search-layer-item">11</li> <li class="search-layer-item">11</li> --> </ul> </div> <div class="cart fr" id="cart" data-active='cart' data-load='../js/cart.json'> <div class="cart-btn"> <i class="cart-logo iconfont icon-cart"></i> <span class="cart-name">购物车</span> <span class="cart-num">18</span> <i class="cart-arrow iconfont icon-arrowdown"></i> </div> <ul class="dropdown-layer cart-layer" > <li class="dropdown-loading"></li> <!-- <li><a href="#" target="_blank" class="dropdown-layer-item">1111</a></li> <li><a href="#" target="_blank" class="dropdown-layer-item">2222</a></li> --> <!-- <li class="dropdown-layer-title cart-layer-title">新加入的商品</li> --> <!--<li class="drodown-layer-item cart-layer-item"> <img src="../img/cart/1.png" alt="#" class="fl"> <div class="item-detail fl"> <span class="item-detail-up">adidas 阿迪达斯训练 男子</span><br/> <span class="item-detail-down"><b>¥355X1</b></span> </div> <span class="item-close fr"><a href="#">×</a></span> </li> --> <!-- <li class="item-total"> <span class="total-price fl">共<b>0</b>件商品 共计<b>¥ 0.00</b></span> <div class="GoCartBtn fr">去购物车</div> </li> --> </ul> </div> </div> </div> </div> <div class="nav-main"> <div class="container"> <a href="#" class="link">团购</a ><a href="#" class="link">天黑黑</a ><a href="#" class="link">名品汇</a ><a href="#" class="link">发现</a ><a href="#" class="link">二手特价</a ><a href="#" class="link">数码城</a> </div> </div> <div class="focus"> <div class="container"> <div class="category fl"> <a href="#" target="_blank" class="category-title"><i class="iconfont"></i>商品分类</a> <ul class="category-list"> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-1.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class=" dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-2.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-3.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-4.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-5.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-6.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-7.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-8.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-9.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-10.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-11.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-12.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-13.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <dl class="category-details cf"><!-- 清除浮动避免高度塌陷 --> <dt class="category-details-title fl"><a href="#" target="_blank">手机通讯</a></dt> <dd class="category-details-item fl"> <a href="#" class="link">手机</a ><a href="#" class="link">对讲机</a ><a href="#" class="link">以旧换新</a> </dd> </dl> <dl class="category-details cf"> <dt class="category-details-title fl"><a href="#" target="_blank">手机通讯</a></dt> <dd class="category-details-item fl"> <a href="#" class="link">手机</a ><a href="#" class="link">对讲机</a ><a href="#" class="link">以旧换新</a> </dd> </dl> <dl class="category-details cf"> <dt class="category-details-title fl"><a href="#" target="_blank">手机通讯</a></dt> <dd class="category-details-item fl"> <a href="#" class="link">手机</a ><a href="#" class="link">对讲机</a ><a href="#" class="link">以旧换新</a> </dd> </dl> </div> </li> <li class="category-dropdown" data-active='category' data-load='../js/category.detail-json/category-detail-14.json'> <div class="category-dropdown-toggle"> <a href="#" target="_blank" class="dropdown-link">家用电器</a> <i class="category-dropdown-arrow">></i> </div> <div class="dropdown-layer"> <div class="dropdown-loading"></div> </div> </li> </ul> </div> <div class="carousel fl"></div> <div class="focus-right fr"></div> </div> </div> <script src="../js/jquery.js"></script> <script > window.jQuery || document.write('<script src="../js/jquery.js"><\/script>') </script> <!-- <script src="http://mat1.gtimg.com/libs/jquery/1.12.0/jquery.js"></script> --> <script src="../js/transition.js"></script> <script src="../js/showHide.js"></script> <script src="../js/dropdown.js"></script> <script src="../js/search.js"></script> <script src="../js/index.js"></script> </body> </html>
//index.css /* nav-site */ .nav-site{ width: 100%; background: #f3f5f7; } .nav-site .container{ border-bottom: 1px solid #cdd0d4; height: 44px; line-height: 44px; } .nav-site-login{ color: #f01414; margin-left: 15px; } .nav-site-signup{ margin-left: 10px; } .nav-site-mobile{ margin-left: 10px; } .nav-site-service{ margin-right: 15px; } .nav-site-category{ margin: 0 10px; } /* nav-main */ .nav-main{ width: 100%; background-color: #07111b; font-size: 13px; margin-top: 45px; height: 48px; } .nav-main a{ padding: 0 25px; color: #e9e9ea; line-height: 48px; } .nav-main a:nth-child(1){ margin-left: 208px; } /* header */ .header{ height: 124px; width: 100%; background: #f3f5f7; } .header-logo{ display: block; width: 136px; height: 48px; background: url(../img/header-logo.png) no-repeat; margin-left: 15px; } /* header-search */ .header-logo,.header-search,.cart{ margin-top: 36px; } .header-search { position: relative; border: 1px solid #cfd2d5; margin-left: 144px; } .search-inputbox { width: 585px; height: 40px; border: 0; padding: 0 10px; border: none; } .search-btn { width: 73px; height: 40px; background: #07111b; font-size: 12px; text-align: center; line-height: 40px; color: #fff; border: none; cursor: pointer; } .search-layer { position: absolute; top: 100%; width: 100%; left: -1px; background: #fff; border: 1px solid #cfd2d5; } .search-layer-item { padding: 0 10px; color: #333; height: 24px; line-height: 24px; cursor: pointer; } .search-layer-item:hover{ background-color: #f3f5f7; } /* cart */ .cart-name:after,.cart-logo,.cart-name,.cart-num{ color: #ffffff; } .cart{ margin-left: 49px; position: relative; color: #fff; } .cart-btn{ height: 14px; width: 159px; background-color: #f01414; padding: 13px 0 15px 0; cursor: pointer; z-index: 10; position: relative; margin-top: 2px; } .cart-name:after{ content: '|'!important; margin: 0 10px; font-size: 13px; } .cart-logo{ margin: 0 13px; font-size: 14px; } .icon-arrowdown:before { font-size: 12px; margin-left: 5px; } .cart-layer{ background: #fff; top: -10px; right: 0; position: absolute; width: 320px; padding-left: 15px; overflow: scroll!important; z-index: 2!important; } .cart-layer-item{ height:20px; width: 80px; background: #fff; } .cart-btn:hover{ background:#fff; } .cart:hover .cart-btn{ background:#fff; } .cart-active .cart-logo, .cart-active .cart-name:after, .cart-active .cart-name, .cart-active .cart-num, .cart-active .cart-arrow{ color: #f01414 } .cart-layer-title{ color: #07111b; font-size: 12px; height: 52px; line-height: 52px; padding-left: 24px; } .cart-layer-item,.cart .item-total{ height: 64px; width: 280px; margin: 0 12px; border-top: 1px solid #d9dde1; } .cart-layer-item img{ margin-top: 12px; } .cart .item-detail{ margin-left: 13px; padding-top: 16px; } .cart .item-close { color: #07111b; } .cart .item-detail span{ display: block; } .cart-layer-item .item-close{ font-size: 20px; } .cart .dropdown-loading{ margin:30px 50px 40px 140px; } .cart .item-total{ line-height: 64px; } .cart .item-total .total-price{ margin-left: 15px; } .cart .item-total .GoCartBtn{ height: 35px; width: 80px; background-color: #f01414; line-height: 35px; color: #fff; text-align: center; cursor: pointer; margin-top: 15px; border-radius: 3px; } /* dropdown */ .dropdown{ position: relative; } .dropdown-toggle{ display: block; height: 100%; padding: 0 16px 0 12px; /*top right bottom left*/ border-left: 1px solid #f3f5f7; border-right: 1px solid #f3f5f7; position: relative; z-index: 2; } .dropdown-arrow{ background: url(../img/dropdown-arrow.png) no-repeat left center; height: 6px; width: 8px; display: inline-block; margin-left: 8px; vertical-align: center; } .dropdown-left{ left: 0; right: auto; } .dropdown-right{ right: 0; left: auto; } .dropdown-layer{ position: absolute; display: none; top: 43px; background: #ffffff; border:1px solid #cdd0d4; z-index: 15; overflow:hidden; } .menu-item{ height: 30px; line-height: 30px; padding: 0 12px; white-space: nowrap; color: #8a8e93; display: block; } .menu-item:hover{ background: #f3f5f7; } .menu-active .dropdown-toggle{ background: #ffffff; border-color: #cdd0d4; } .menu-active .dropdown-arrow{ background: url(../img/dropdown-arrow-active.png) no-repeat; } /*showHide*/ .transition{ -o-transition:all 0.5s; -ms-transition:all 0.5s; -moz-transition:all 0.5s; -webkit-transition:all 0.5s; transition: all 0.5s; } .fadeOut{ opacity: 0!important; visibility: hidden!important; } .SlideUpDownCollapse{ height: 0!important;/* 设置更高优先级 */ padding-top: 0!important; padding-bottom:0!important; } .SlideLeftRightCollapse{ width: 0!important; padding-left: 0!important; padding-right: 0!important; } .dropdown-loading{ width: 32px; height: 32px; margin: 20px; background: url(../img/loading.gif) no-repeat; } /* focus */ .focus{ width: 100%; height: 504px; margin-top: 8px; background-color: #eee; }
//common.css /* 公共样式 */ .container{ width: 1200px; margin: 0 auto; } .link{ color: #4d555d; } .link:hover{ color: #f01414; } .text-hidden{ text-indent: -9999px; overflow: hidden; } .text-ellipsis{ text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } /* category */ .category{ margin-top: -62px; width: 208px; position: relative; } .category .dropdown{ position: static;/* 取消相对定位 */ } .category .iconfont{ margin-right: 10px; } .category .dropdown-loading{ margin: 220px auto; } .category-title{ display: block; padding: 0 20px; line-height: 54px; height: 54px; font-size: 14px; color: #fff; background-color: #f01414; } .category-list{ background-color: #f01414; height: 512px; } .category .dropdown-link{ padding: 0 15px; color: #fff; line-height: 36px; height: 36px; } .category-dropdown-arrow{ color: #fff; float: right; margin: 12px 12px 0 0; font-family: simsun; font-weight: bold; } .category-active .category-dropdown-toggle{ background-color: #fff; } .category-active .category-dropdown-arrow, .category-active .dropdown-link{ color: #f01414; } .category .dropdown-layer{ width: 744px; min-height: 473px; top:54px; left: 100%; padding: 8px 0 31px 0; background-color: #fff; box-shadow: 0 0 5px rgba(0,0,0,0.2); } .category-details{ line-height: 20px; margin-top: 24px !important; } .category-details-title{ width: 84px; padding-right: 16px; border-right: 1px solid #d9dde1; text-align: right; font-weight: bold; } .category-details-title a{ color: #07111b; } .category-details-item{ width: 592px; padding-left: 15px; } .category-details-item a{ margin-right: 15px; display: inline-block;/* 设置成内联块 这样换行就不会拆分a里面的内容 */ }
//transtion.js //transition 兼容性问题 (function(){ var transitionEndName = { transition:'transitionend', Moztransition:'transitionend', Webkittransition:'WebkitTransitionEnd', OTransition:'otransitionend' } var transitionEnd='', isSupport = false; ; for (name in transitionEndName){ if( document.body.style[name] !== undefined){ transitionEnd = transitionEndName[name]; isSupport = true; break; } } window.mt = window.mt || {}; window.mt.transition = { end:transitionEnd, isSupport:isSupport } })();
//showhide.js (function ($) { 'use strict'; var transition = window.mt.transition ; function init($elem,hiddenCallback){//init函数 给Box一个初始状态(status) hidden/show if($elem.is(':hidden')){//:hidden 是jquery中的选择器,选取隐藏的元素。经过测试 没有:shown $elem.data('status','hidden'); if(typeof hiddenCallback === 'function') hiddenCallback(); }else { $elem.data('status','shown'); } } function show($elem,callback){ if($elem.data('status') ==='show') return; if($elem.data('status') ==='shown') return; $elem.data('status','show').trigger('show'); callback(); } function hide($elem,callback){ if($elem.data('status') ==='hide') return; if($elem.data('status') ==='hidden') return; $elem.data('status','hide').trigger('hide'); callback(); } var slient ={ init:init, show:function($elem){ show($elem,function(){ $elem.show(); $elem.data('status','shown').trigger('shown'); }) }, hide:function($elem){ hide($elem,function(){ $elem.hide(); $elem.data('status','hidden').trigger('hidden'); }) } }; var css3 ={ fade:{ init:function($elem){ css3._init($elem,'fadeOut'); }, show:function($elem){ css3._show($elem,'fadeOut'); }, hide:function($elem){ css3._hide($elem,'fadeOut'); } }, slideUpDown:{ init:function($elem){ $elem.height($elem.height());//p标签撑开不会提供高度 height方法为box提供高度 css3._init($elem,'SlideUpDownCollapse'); }, show:function($elem){ css3._show($elem,'SlideUpDownCollapse'); }, hide:function($elem){ css3._hide($elem,'SlideUpDownCollapse'); } }, slideLeftRight:{ init:function($elem){ $elem.width($elem.width()); css3._init($elem,'SlideLeftRightCollapse'); }, show:function($elem){ css3._show($elem,'SlideLeftRightCollapse'); }, hide:function($elem){ css3._hide($elem,'SlideLeftRightCollapse'); } }, fadeSlideUpDown:{ init:function($elem){ $elem.height($elem.height());//p标签撑开不会提供高度 height方法为box提供高度 css3._init($elem,'fadeOut SlideUpDownCollapse'); }, show:function($elem){ css3._show($elem,'fadeOut SlideUpDownCollapse'); }, hide:function($elem){ css3._hide($elem,'fadeOut SlideUpDownCollapse'); } }, fadeSlideLeftRight:{ init:function($elem){ $elem.width($elem.width());//p标签撑开不会提供高度 height方法为box提供高度 css3._init($elem,'fadeOut SlideLeftRightCollapse'); }, show:function($elem){ css3._show($elem,'fadeOut SlideLeftRightCollapse'); }, hide:function($elem){ css3._hide($elem,'fadeOut SlideLeftRightCollapse'); } }, }; css3._init = function($elem,className){ $elem.addClass('transition'); init($elem,function(){ $elem.addClass(className); }) } css3._show = function($elem,className){ show($elem,function(){ $elem.off(transition.end).one(transition.end,function(){//one只绑定一次,避免多次绑定 $elem.data('status','shown').trigger('shown');//触发shown事件 }) $elem.show(); setTimeout(function(){ $elem.removeClass(className); },20) //异步处理 避免同时发生 }) } css3._hide=function($elem,className){ hide($elem,function(){ $elem.off(transition.end).one(transition.end,function(){//transistionend方法 等动画结束执行 $elem.hide(); $elem.data('status','hidden').trigger('hidden'); }) $elem.addClass(className); }) } var js = { fade:{ init:function($elem){ js._init($elem); }, show:function($elem){ js._show($elem,'fadeIn'); }, hide:function($elem){ js._hide($elem,'fadeOut'); } }, SlideUpDown:{ init:function($elem){ js._init($elem); }, show:function($elem){ js._show($elem,'slideDown'); }, hide:function($elem){ js._hide($elem,'slideUp'); } }, SlideLeftRight:{ init:function($elem){ js._customInit($elem,{ 'width':0, 'padding-left':0, 'padding-right':0 }) }, show:function($elem){ js._customerShow($elem); }, hide:function($elem){ hide($elem,function(){ $elem.stop().animate({ 'width':0, 'padding-left':0, 'padding-right':0 }, function(){ $elem.hide(); $elem.data('status','hidden').trigger('hidden'); }) //show() hide() 顺序问题 show()先撑开再推动 hide()先推动再关闭 }) } }, fadeSlideUpDown:{ init:function($elem){ js._customInit($elem,{ 'opacity' :0, 'height':0, 'padding-top':0, 'padding-bottom':0 }) }, show:function($elem){ js._customerShow($elem); }, hide:function($elem){ hide($elem,function(){ $elem.stop().animate({ 'opacity' :0, 'height':0, 'padding-top':0, 'padding-bottom':0 }, function(){ $elem.hide(); $elem.data('status','hidden').trigger('hidden'); }) //show() hide() 顺序问题 show()先撑开再推动 hide()先推动再关闭 }) } }, fadeSlideLeftRight:{ init:function($elem){ js._customInit($elem,{ 'opacity' :0, 'width':0, 'padding-left':0, 'padding-right':0 }) }, show:function($elem){ js._customerShow($elem); }, hide:function($elem){ js._customHide($elem,{ 'opacity' :0, 'width':0, 'padding-left':0, 'padding-right':0 }); } } }; js._init =function($elem,hiddenCallback){ $elem.removeClass('transition'); init($elem,hiddenCallback); } js._customInit =function($elem,options){ //自定义初始化函数 var styles={}; for(p in options){ styles[p]=$elem.css(p); } $elem.data('styles',styles);//用于存储最初box的sytles数据 js._init($elem,function(){ $elem.css(options); }) } js._show =function($elem,mode){ show($elem,function(){ $elem.stop()[mode](function(){//fadeIn结束后执行该函数 触发shown stop()方法是jquery封装的 用于停掉之前的动画 避免重叠 $elem.data('status','shown').trigger('shown'); }) }) }; js._customerShow=function($elem){ show($elem,function(){ $elem.show(); $elem.stop().animate($elem.data('styles'), function(){ $elem.data('status','shown').trigger('shown'); }) }) }; js._hide = function($elem,mode){ hide($elem,function(){ $elem.stop()[mode](function(){ $elem.data('status','hidden').trigger('hidden'); }) }) }; js._customHide=function($elem,options){ hide($elem,function(){ $elem.stop().animate(options, function(){ $elem.hide(); $elem.data('status','hidden').trigger('hidden'); }) //show() hide() 顺序问题 show()先撑开再推动 hide()先推动再关闭 }) }; var defaults ={ css3:false, js:false, animation:'fade' } /* function showHide($elem,options){ options = $.extend({},default,options); if(options.css3 && transistion.isSupport){//css3 transition css3[options.animation].init($elem); return{ show:css3[options.animation].show, hide:css3[options.animation].hide } }else if(options.js){//js animation js[options.animation].init($elem); return{ show:js[options.animation].show, hide:js[options.animation].hide } }else{ slient.init($elem); return{ show:slient.show, hide:slient.hide } } }*/ function showHide($elem,options){//修改版 var mode =null; if(options.css3 && transition.isSupport){//css3 transition mode=css3[options.animation];//css3.fade() }else if(options.js){//js animation mode=js[options.animation]; }else{ mode=slient; } mode.init($elem); return{//调用后返回对象 show:$.proxy(mode.show,this,$elem),//proxy方法用来改变this指向,这里仅用于传参 hide:$.proxy(mode.hide,this,$elem) } } /* window.mt = window.mt ||{}; window.mt.showHide =showHide;*/ $.fn.extend({//为JQuery添加插件 showHide showHide:function(option){ return this.each(function(){//$box可能是数组 所以需要each遍历 var $this =$(this), options = $.extend({},defaults,typeof option === 'object' && option), mode = $this.data('showHide')//如果option是对象 传入option 如果option不是对象 返回False if(!mode){//如果data为Null则为mode赋值 ,避免重复赋值 $this.data('showHide',mode =showHide($this,options));//mode 纸行showHide函数 return返回show hide } if(typeof mode[option] ==='function'){//如果传入字符串'show','hide' 则mode.hide() mode=showHide($this,options) mode[option]();//showHide.show() 使用[]是因为传入字符串'show' } }) } }) })(jQuery);
//dropdown.js (function($){ 'use strict'; function Dropdown(element,option){ this.$elem = $(element),//使用this指向dropdown 让Dropdown.prototype.show也能共用 如果用var 只能是局部变量 外部(Dropdown.prototype.show)无法访问 this.option = option, //外部也能调用 this.$layer=this.$elem.find('.dropdown-layer'), this.activeClass = option.active +'-active'; this._init(); } Dropdown.prototype._init =function(){ var self =this;//变量self 存储dropdown对象 避免下面this指向this.$elem(dom元素) this.$layer.showHide(this.option);//调用showhide 传入option this.$layer.on('show shown hide hidden',function(e){//showHide 117行触发shown 所以才能绑定! self.$elem.trigger('dropdown-'+e.type,function(){ self.$layer.height('auto') .height(self.$layer.height()-100); }); }) var DEFAULTS ={//默认参数 css3:false, js:false, animation:'fade', delay:0, active:'dropdown' } if(this.option.event === 'click'){ this.$elem.on('click',function(e){ console.log(e);//e保存事件类型 self.show(); //相当于Dropdown.show(); e.stopPropagation();//阻止该事件('click')冒泡 }); $(document).on('click',function(){ self.hide(); }) }else{ this.$elem.hover($.proxy(this.show,this),$.proxy(this.hide,this));//$.proxy方法改变this指向 } } Dropdown.prototype.show =function(){ var self = this; if(this.option.delay){ this.timer =setTimeout(function(){//里面的this需要改成self 否则指向window _show(); },this.option.delay) }else{ _show(); } function _show(){ self.$layer.showHide('show'); self.$elem.addClass(self.activeClass); } }; Dropdown.prototype.hide = function(){ if(this.option.delay){ clearTimeout(this.timer);//清除 否则还会触发setTimeout } this.$layer.showHide('hide'); this.$elem.removeClass(this.activeClass); }; /* var dropdown = new Dropdown();//不在函数内部创建对象 避免多次实例化造成性能浪费 所以采用原型 dropdown.show(); dropdown.hide(); */ /*function dropdown(element,option){ var $elem = $(element), $layer=$elem.find('.dropdown-layer'), activeClass = $elem.data('active')+'-active'; $layer.showHide(option); $elem.hover(function(){ $layer.showHide('show'); $elem.addClass(activeClass); },function(){ $layer.showHide('hide'); $elem.removeClass(activeClass); }) }*/ /*var defaults = {//默认参数 如果外部没有传 使用默认 css3:false, js:false, animation:'fade' }*/ $.fn.extend({ dropdown:function(option){//在html 传入的option有可能是对象object{} 也有可能是字符串'string' return this.each(function(){ var $this=$(this),//存储变量 避免重复调用 dropdown=$this.data('dropdown'),//创建data数据 options = $.extend({},Dropdown.DEFAULTS,$this.data(),typeof option === 'object' && option)//判断传入的是不是对象 如果是就进行覆盖 /*dropdown(this,options);*/ if(!dropdown){ //判断是不是空的 如果是就实例化 $this.data('dropdown',dropdown = new Dropdown(this,options))//xxx = new object 立即执行Dropdown)//use data to 存储dropdown 避免每次调用函数多次实例化 } if (typeof dropdown[option] === 'function'){//判断是不是函数 是就执行 dropdown[option]();// 因为传入option是字符串 所以用[option] } }) } }) })(jQuery)//$参数接收jquery 防止受外部影响 其实意义不大
//index.js (function($){ //menu $('.menu').on('dropdown-show',function(e){ loadOnce($(this),buildMenuItem) }).dropdown({ css3:true, js:false, delay:0, animation:'slideUpDown' }); function buildMenuItem($elem,data){ var html=''; if(data.length === 0) return; setTimeout(function(){ for(var i=0;i<data.length;i++){ html +='<li><img src="'+data[i].name+'"/><a href="'+data[i].url+'" target="_blank" class="menu-item">'+data[i].url+'</a></li>'; } $elem.find('.dropdown-layer').html(html); },1000); } //head-search var $headerSearch =$('#header-search'); var html='', maxNum=10; $headerSearch.on('search-getData',function(e,data,$layer){ var $this =$(this) /*$layer.html(html);*/ html= createHeaderSearchLayer(data,maxNum); $this.search('appendLayer',html) if(html){ $this.search('showlayer')//if (typeof search[option] === 'function') }else { $this.search('hidelayer') } }).on('search-noData',function(e,$layer){ var $this =$(this); $this.search('hidelayer'); $this.search('appendLayer','') }).on('click','.search-layer-item',function(){//事件代理 用layer代理 search-layer-item 避免每次点击都绑定一次click $headerSearch.search('setVal',$(this).html()); $headerSearch.search('submit',$(this).html()); }) $headerSearch.search({ autocomplete:true, css3:false, js:false, animation : 'slideUpDown', getDataInterval:200 }) function createHeaderSearchLayer(data,maxNum){ var html='', dataNum=data['result'].length, maxNum=10; if(dataNum === 0){ return '' } for(var i=0;i<dataNum;i++){ if(i>=maxNum) break; html+='<li class="search-layer-item">'+data['result'][i][0]+'</li>'; } return html; } //cart 购物车 /*$('.cart').dropdown({ css3:true, js:false, delay:0, animation:'slideUpDown', active:'cart' }).on('dropdown-show',function(e,updataLayer){ var html='', $this=$(this), $layer=$this.find('.dropdown-layer'), Dataload=$this.data('load'), maxNum =5; if(!Dataload) return; $.getJSON(Dataload,function(data){ if(!$this.data('loaded')){ setTimeout(function(){ createCartLayer(data); //调用 updataLayer(); },1000) $this.data('loaded',true) }else{ createCartLayer(data); } }) function createCartLayer (data){ for(var i=0;i<maxNum;i++){ html+= '<li class="drodown-layer-item cart-layer-item">'+ '<img src="'+data[i].url+'" alt="#" class="fl">'+ '<div class="item-detail fl">'+ '<span class="item-detail-up">'+data[i].name+'</span><br/>'+ '<span class="item-detail-down"><b>'+data[i].price+'</b></span>'+ '</div>'+ '<span class="fr"><a class="item-close" href="#">×</a></span>'+ '</li>' } $layer.html('<li class="dropdown-layer-title cart-layer-title">新加入的商品</li>'+html+ '<li class="item-total">'+ '<span class="total-price fl">共<b>0</b>件商品 共计<b>¥ 0.00</b></span>'+ '<div class="GoCartBtn fr">去购物车</div>'+ '</li>'); } })*/ $('.cart').on('dropdown-show',function(e,updataLayer){ loadOnce($(this),createCartLayer,updataLayer) }); $('.cart').dropdown({ css3:true, js:false, delay:0, animation:'slideUpDown', active:'cart' }) function createCartLayer ($elem,data){ console.log(data) for(var i=0;i<maxNum;i++){ html+= '<li class="drodown-layer-item cart-layer-item">'+ '<img src="'+ data[i].url +'" alt="#" class="fl">'+ '<div class="item-detail fl">'+ '<span class="item-detail-up">'+data[i].name+'</span><br/>'+ '<span class="item-detail-down"><b>'+data[i].price+'</b></span>'+ '</div>'+ '<span class="fr"><a class="item-close" href="#">×</a></span>'+ '</li>' } $layer.html('<li class="dropdown-layer-title cart-layer-title">新加入的商品</li>'+html+ '<li class="item-total">'+ '<span class="total-price fl">共<b>0</b>件商品 共计<b>¥ 0.00</b></span>'+ '<div class="GoCartBtn fr">去购物车</div>'+ '</li>'); } //focus $('.category-dropdown').on('dropdown-show',function(e){ loadOnce($(this),buildCateItem); }).dropdown({ css3:true, js:false, delay:0, animation:'slideLeftRight', active:'category' }) function buildCateItem($elem,data){ var html=''; if(data.length === 0) return; console.log(2) setTimeout(function(){ for(var i=0;i<data.length;i++){ html +='<dl class="category-details cf"><dt class="category-details-title fl"><a href="#" target="_blank">'+data[i].title+'</a></dt><dd class="category-details-item fl">' for(var j=0;j<data[i].items.length;j++){ html += '<a href="#" class="link">'+data[i].items[j]+'</a>' } html +='</dd></dl>' } $elem.find('.dropdown-layer').html(html); },1000); } /* function loadOnce($elem,success){ Dataload=$elem.data('load'); if(!Dataload) return ; if(!$elem.data('loaded')){ var html = ''; $elem.data('loaded',true); $.getJSON(Dataload).done(function(data){ if(typeof success ==='function') success($elem,data); }).fail(function(){ $elem.data('loaded',false); }) } }*/ function loadOnce($elem,success,updataLayer){ Dataload=$elem.data('load'); if(!Dataload) return ; if(!$elem.data('loaded')){ var html = ''; $elem.data('loaded',true); $.getJSON(Dataload).done(function(data){ if(typeof success ==='function') success($elem,data); if(typeof updataLayer ==='function') success($elem,data); }).fail(function(){ $elem.data('loaded',false); }) } } })(jQuery)
//cart.json [ { "name":"adidas 阿迪达斯训练 男子", "url":"../img/cart/1.png", "price":"¥355X1" }, { "name":"玉兰油多效修护三部曲套装", "url":"../img/cart/2.png", "price":"¥199X1" }, { "name":"Apple iPhone 7(A1666)", "url":"../img/cart/3.png", "price":"¥6188X1" }, { "name":"飞利浦面条机 HR2356/31", "url":"../img/cart/4.png", "price":"¥659X4" }, { "name":"罗技G29", "url":"../img/cart/5.png", "price":"¥2999X1" } ]
2回答
同学你好,这是因为maxNum的值大于data.length的值,当循环变量i超过data.length值的时候,data[i].url不存在,所以会报undefined 。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
好帮手慕星星
2019-11-17
同学你好,问题解答如下:
1、要对获取当前数据长度进行循环遍历,不是定义的maxNum变量值。
2、填充的是下拉层,但是$layer是个变量,不能直接使用,可以当前元素找到子元素下拉层。
针对上面两个问题修改如下:
3、获取数据是异步的,可以在更新下拉层高度的时候添加定时器,也变成异步,否则数据还没有加载进来,就会更新高度,没有内容。参考修改:
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
相似问题