define("index", ["zepto","lazyload","swiper","mlellipsis","iscroll-probe","index"], function(require, exports, module){ var yohobuy; require("js/common"); require("js/passport/index"); require("js/guang/index"); require("js/home/index"); require("js/product/index"); require("js/index/index"); module.exports = yohobuy; }); define("js/common", ["zepto"], function(require, exports, module){ /** * 页面公共逻辑 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/21 */ var $ = require("zepto"); function cookie(name) { var cookies = document.cookie, cookieVal, offset; if (document.cookie && document.cookie !== '') { offset = cookies.indexOf(name + '='); if (offset > -1) { offset += name.length + 1; cookieVal = decodeURIComponent($.trim(cookies.substring(offset, cookies.indexOf(';', offset)))); } } return cookieVal; } function setCookie(name, value, options) { var expires = '', path, domain, secure, date; if (typeof value !== 'undefined') { options = options || {}; if (value === null) { value = ''; options.expires = -1; } if (options.expires && (typeof options.expires === 'number' || options.expires.toUTCString)) { if (typeof options.expires === 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); } path = options.path ? '; path=' + options.path : ''; domain = options.domain ? '; domain=' + options.domain : ''; secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } } function getUser() { var c = cookie('_UID'), user; if (typeof c === 'undefined') { return 0; } user = c.split('::'); if (typeof user === 'undefined' || user.length < 4) { return 0; } return user; } function getUid() { var user = getUser(); if (user === 0) { return 0; } return user[1]; } function getShoppingKey() { var c = cookie('_g'); if (typeof c === 'undefined') { return ''; } return JSON.parse(c).k; } //页面通用底部位置及status设置 (function () { var $footer = $('#yoho-footer'), $op = $footer.children('.op-row'); var user = getUser(); if ($('body').height() < $(window).height()) { $footer.addClass('bottom'); } if (user === 0) { //未登录 $op.prepend( '<a href="http://m.yohobuy.com/signin.html">登录</a>' + '<span class="sep-line">|</span>' + '<a href="http://m.yohobuy.com/reg.html">注册</a>' ); } else { //已登录 $op.prepend( 'Hi,' + '<a class="user-name" href="http://m.yohobuy.com/home?tmp=' + Math.random() + '">' + user[0] + '</a>' + '<a href="http://m.yohobuy.com/passport/signout/index?token=' + user[3] + '">退出</a>' ); } $footer.removeClass('hide'); }()); //暴露公共接口 window.cookie = cookie; window.setCookie = setCookie; window.getUser = getUser; window.getUid = getUid; window.getShoppingKey = getShoppingKey; }); define("js/passport/index", ["zepto"], function(require, exports, module){ /** * 注册、登录、密码找回打包入口 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ //注册 require("js/passport/register/register"); require("js/passport/register/code"); require("js/passport/register/password"); //登录 require("js/passport/login/login"); require("js/passport/login/international"); //密码找回 require("js/passport/back/mobile"); require("js/passport/back/code"); require("js/passport/back/email"); require("js/passport/back/email-success"); require("js/passport/back/new-password"); }); define("js/passport/register/register", ["zepto"], function(require, exports, module){ /** * 注册 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $phoneNum = $('#phone-num'), $countrySelect = $('#country-select'), $areaCode = $('#area-code'), $btnNext = $('#btn-next'); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; api.selectCssHack($('#country-select')); api.bindClearEvt(); $phoneNum.bind('input', function() { if (trim($phoneNum.val()) === '') { $btnNext.addClass('disable'); } else { $btnNext.removeClass('disable'); } }); $countrySelect.change(function() { $areaCode.text($countrySelect.val()); }); $btnNext.on('tap', function() { var pn = trim($phoneNum.val()), areaCode = $countrySelect.val(); if ($btnNext.hasClass('disable')) { return; } if (api.phoneRegx[areaCode].test(pn)) { $.ajax({ url: '/passport/reg/verifymobile', type: 'POST', data: { areaCode: areaCode.replace('+', ''), phoneNum: pn }, success: function(data) { if (data.code === 200) { location.href = data.data; } else { showErrTip(data.message); } } }); } else { showErrTip('手机号格式不正确,请重新输入'); } }); }); define("js/passport/api", ["zepto"], function(require, exports, module){ /** * 登录注册公用API * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var trim = $.trim; //邮箱验证规则 var emailRegx = /^([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; //手机号码验证规则 var phoneRegx = { '+86': /^1[35847]{1}[0-9]{9}$/, '+852': /^[965]{1}[0-9]{7}$/, '+853': /^[0-9]{8}$/, '+886': /^[0-9]{10}$/, '+65': /^[98]{1}[0-9]{7}$/, '+60': /^1[1234679]{1}[0-9]{8}$/, '+1': /^[0-9]{10}$/, '+82': /^01[0-9]{9}$/, '+44': /^7[789][0-9]{8}$/, '+81': /^0[9|8|7][0-9]{9}$/, '+61': /^[0-9]{11}$/ }; /** * 密码显示隐藏 * @params opt 初始化参数 */ function bindEyesEvt(opt) { var $hasEye = $('.has-eye'), $eye; if (opt && opt.status === 'open') { $hasEye.append('<div class="eye"></div>'); } else { $hasEye.append('<div class="eye close"></div>'); } $eye = $hasEye.children('.eye'); $eye.on('tap', function(e) { var $this = $(this), $pwd = $this.siblings('.pwd'); e.preventDefault(); $this.toggleClass('close'); //切换密码显示和文本显示 if ($this.hasClass('close')) { $pwd.attr('type', 'password'); } else { $pwd.attr('type', 'text'); } $pwd.focus(); }); } // 清空账号显示 function bindClearEvt() { var $hasClear = $('.has-clear'), $clear; $hasClear.append('<div class="clear-input"></div>'); $clear = $hasClear.children('.clear-input'); $clear.on('tap', function(e) { var $input = $clear.siblings('.input'); $input.val('').trigger('input').focus(); e.preventDefault(); }); //反向逻辑 $hasClear.children('.input').bind('input', function() { var $this = $(this), $thisClear = $this.siblings('.clear-input'), val = trim($this.val()); if (val === '') { $thisClear.hide(); } else { $thisClear.show(); } }); } // 密码长度验证 function pwdValidate(pwd) { if (pwd.length >= 6 && pwd.length <= 20) { return true; } return false; } // hack for resolving direction:rtl didn't work in android uc function selectCssHack($countrySelect) { var u = navigator.userAgent; function autoSelectWidth() { var wordCount = $countrySelect.find('option:selected').text().length; switch (wordCount) { //分别有2,3,4个汉字的情况 case 2: $countrySelect.outerWidth(90); break; case 3: $countrySelect.outerWidth(110); break; default: $countrySelect.outerWidth(130); } } if (u.match(/uc/i) && u.match(/android/i)) { $countrySelect.change(function() { autoSelectWidth(); }); } else { $countrySelect.removeClass('in-android-uc'); } } //Exports APIs module.exports = { emailRegx: emailRegx, phoneRegx: phoneRegx, bindEyesEvt: bindEyesEvt, bindClearEvt: bindClearEvt, pwdValidate: pwdValidate, selectCssHack: selectCssHack }; }); define("js/plugin/tip", ["zepto"], function(require, exports, module){ /** * 弹框提示 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"); var $tip, tipItime; /** * 初始化提示框 */ (function() { var tipHtml = '<div id="yoho-tip" class="yoho-tip"></div>'; //插入提示HTML $('.yoho-page').append(tipHtml); $tip = $('#yoho-tip'); $tip.on('tap', function() { $tip.hide(); //清除Timeout clearTimeout(tipItime); }); }()); /** * 显示提示 */ function show(con, dur) { var content, duration; if (typeof con === 'undefined') { return; } content = con.toString(); duration = (dur && dur > 0) ? dur : 2000; $tip.text(content).show(); tipItime = setTimeout(function() { if ($tip.css('display') === 'block') { $tip.hide(); } }, duration); } exports.show = show; }); define("js/passport/register/code", ["zepto"], function(require, exports, module){ /** * 注册-验证码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ require("js/passport/code")(true); }); define("js/passport/code", ["zepto"], function(require, exports, module){ /** * 注册/找回密码-验证码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); module.exports = function(useInRegister) { var $captcha = $('#captcha'), $btnNext = $('#btn-next'), $captchaTip = $('#captcha-tip'), phoneNum = $('#phone-num').val(), areaCode = $('#area-code').val().replace('+', ''); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; var urlMid = useInRegister ? 'reg' : 'back'; function countDown() { var count = 59, itime; itime = setInterval(function() { if (count === 0) { $captchaTip.text('重发验证码').removeClass('disable'); clearInterval(itime); } else { $captchaTip.text('重发验证码 (' + count-- + '秒)'); } }, 1000); } api.bindClearEvt(); $captcha.bind('input', function() { if (trim($captcha.val()) !== '') { $btnNext.removeClass('disable'); } else { $btnNext.addClass('disable'); } }); //重新发送验证码 $captchaTip.on('tap', function() { if ($captchaTip.hasClass('disable')) { return; } $.ajax({ type: 'POST', url: '/passport/' + urlMid + '/sendcode', data: { phoneNum: phoneNum, areaCode: areaCode }, success: function(data) { if (data.code === 200) { $captchaTip.text('重发验证码 (60秒)').addClass('disable'); countDown(); } else { //验证码不正确,显示提示 showErrTip(data.message); } } }); }); $btnNext.on('tap', function() { if ($btnNext.hasClass('disable')) { return; } $.ajax({ type: 'POST', url: '/passport/' + urlMid + '/verifycode', data: { phoneNum: phoneNum, areaCode: areaCode, code: trim($captcha.val()), token: $('#token').val() }, success: function(data) { if (data.code === 200) { location.href = data.data; } else { //验证码不正确,显示提示 showErrTip(data.message); } } }); }); countDown(); }; }); define("js/passport/register/password", ["zepto"], function(require, exports, module){ /** * 注册-密码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $pwd = $('#pwd'), $btnSure = $('#btn-sure'); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; api.bindEyesEvt({ status: 'open' //默认眼睛打开 }); $pwd.bind('input', function() { if (trim($pwd.val()) === '') { $btnSure.addClass('disable'); } else { $btnSure.removeClass('disable'); } }); $btnSure.on('tap', function() { var pwd = trim($pwd.val()); if ($btnSure.hasClass('disable')) { return; } if (api.pwdValidate(pwd) === false) { showErrTip('密码6-20位,请重新输入'); } else { $.ajax({ type: 'POST', url: '/passport/reg/setpassword', data: { password: pwd, phoneNum: $('#phone-num').val(), areaCode: $('#area-code').val(), token: $('#token').val() }, success: function(data) { if (data.code === 200) { showErrTip('注册成功'); //1000ms后跳转页面 setTimeout(function() { location.href = data.data; }, 1000); } else { if (data.code === 401 || data.code === 404 || data.code === 505) { showErrTip(data.message); } else { showErrTip(data.message); setTimeout(function() { location.href = data.data; }, 1000); } } } }); } }); }); define("js/passport/login/login", ["zepto"], function(require, exports, module){ /** * 登录 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/9/30 */ var $ = require("zepto"); var $account = $('#account'), $pwd = $('#pwd'), $loginBtn = $('#btn-login'), $mask = $('#retrive-pwd-mask'), $ways = $('#retrive-pwd-ways'), accPass = false, pwdPass = false; var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; //登录按钮状态切换 function switchLoginBtnStatus() { if (accPass && pwdPass) { $loginBtn.removeClass('disable'); } else { $loginBtn.addClass('disable'); } } //显示找回密码面板 function showRetrivePanel() { $mask.show(); $ways.show(); } //隐藏找回密码面板 function hideRetrivePanel() { $mask.hide(); $ways.hide(); } //密码显示与隐藏 api.bindEyesEvt(); //清空账号输入框 api.bindClearEvt(); $account.bind('input', function() { if (trim($account.val()) !== '') { accPass = true; } else { accPass = false; } switchLoginBtnStatus(); }); $pwd.bind('input', function() { if (trim($pwd.val()) === '') { pwdPass = false; } else { pwdPass = true; } switchLoginBtnStatus(); }); // Login $loginBtn.on('tap', function() { var acc = trim($account.val()), pwd = trim($pwd.val()); if ($loginBtn.hasClass('disable')) { return; } //验证账号(数字或者邮箱)和密码合理性 if ((/^[0-9]+$/.test(acc) || api.emailRegx.test(acc)) && api.pwdValidate(pwd)) { $.ajax({ type: 'POST', url: '/passport/login/auth', data: { account: acc, password: pwd }, success: function(data) { if (data.code === 200) { showErrTip('登录成功'); //1s后跳转页面 setTimeout(function() { location.href = data.data; }, 1000); } else { showErrTip(data.message); } }, error: function() { showErrTip('网络断开连接啦~'); } }); } else { showErrTip('账号或密码有错误,请重新输入'); } }); $('#forget-pwd').on('tap', function() { showRetrivePanel(); }); $mask.on('tap', function() { hideRetrivePanel(); }); $('#cancel-retrive').on('tap', function(e) { e.preventDefault(); hideRetrivePanel(); }); //对初始有默认值的情况去初始化登录按钮状态 $account.trigger('input'); $pwd.trigger('input'); }); define("js/passport/login/international", ["zepto"], function(require, exports, module){ /** * 国际账号登录 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $phoneNum = $('#phone-num'), $countrySelect = $('#country-select'), $areaCode = $('#area-code'), $pwd = $('#pwd'), $loginBtn = $('#btn-login'), pnPass = false, pwdPass = false; var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; //登录按钮状态切换 function switchLoginBtnStatus() { if (pnPass && pwdPass) { $loginBtn.removeClass('disable'); } else { $loginBtn.addClass('disable'); } } //Android-UC下显示select的direction:rtl无效的临时解决办法 api.selectCssHack($countrySelect); //显示隐藏密码 api.bindEyesEvt(); //清空手机号码 api.bindClearEvt(); $phoneNum.bind('input', function() { if (trim($phoneNum.val()) === '') { pnPass = false; } else { pnPass = true; } switchLoginBtnStatus(); }); $pwd.bind('input', function() { var pwd = trim($pwd.val()); if (pwd === '') { pwdPass = false; } else { pwdPass = true; } switchLoginBtnStatus(); }); $countrySelect.change(function() { $areaCode.text($countrySelect.val()); }); $loginBtn.on('tap', function() { var pn = trim($phoneNum.val()), areaCode = $countrySelect.val(), pwd = trim($pwd.val()); if ($loginBtn.hasClass('disable')) { return; } if (api.phoneRegx[areaCode].test(pn) && api.pwdValidate(pwd)) { $.ajax({ type: 'POST', url: '/passport/login/auth', data: { areaCode: areaCode.replace('+', ''), account: pn, password: pwd }, success: function(data) { if (data.code === 200) { showErrTip('登录成功'); //1000ms后跳转页面 setTimeout(function() { location.href = data.data; }, 1000); } else { showErrTip(data.message); } }, error: function() { showErrTip('网络断开连接啦~'); } }); } else { showErrTip('账号或密码有错误,请重新输入'); } }); //对初始有默认值的情况去初始化登录按钮状态 $phoneNum.trigger('input'); $pwd.trigger('input'); }); define("js/passport/back/mobile", ["zepto"], function(require, exports, module){ /** * 找回密码-手机 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $phoneNum = $('#phone-num'), $countrySelect = $('#country-select'), $areaCode = $('#area-code'), $btnNext = $('#btn-next'); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; api.selectCssHack($('#country-select')); api.bindClearEvt(); $phoneNum.bind('input', function() { if (trim($phoneNum.val()) === '') { $btnNext.addClass('disable'); } else { $btnNext.removeClass('disable'); } }); $countrySelect.change(function() { $areaCode.text($countrySelect.val()); }); $btnNext.on('tap', function() { var pn = trim($phoneNum.val()), area = $countrySelect.val(); if ($btnNext.hasClass('disable')) { return; } if (api.phoneRegx[area].test(pn)) { $.ajax({ url: '/passport/back/sendcode', type: 'POST', data: { areaCode: area.replace('+', ''), phoneNum: pn }, success: function(data) { if (data.code === 200) { location.href = data.data; } else { showErrTip(data.message); } } }); } else { showErrTip('手机号格式不正确,请重新输入'); } }); }); define("js/passport/back/code", ["zepto"], function(require, exports, module){ /** * 找回密码-验证码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ require("js/passport/code")(false); }); define("js/passport/back/email", ["zepto"], function(require, exports, module){ /** * 找回密码-邮箱找回 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $email = $('#email'), $btnSure = $('#btn-sure'); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; api.bindClearEvt(); $email.bind('input', function() { if (trim($email.val()) === '') { $btnSure.addClass('disable'); } else { $btnSure.removeClass('disable'); } }); $btnSure.on('tap', function() { var email = trim($email.val()); if ($btnSure.hasClass('disable')) { return; } if (api.emailRegx.test(email)) { $.ajax({ url: '/passport/back/sendemail', type: 'POST', data: { email: email }, success: function(data) { if (data.code === 200) { location.href = data.data; } else { showErrTip(data.message); } } }); } else { showErrTip('邮箱格式不正确,请重新输入'); } }); }); define("js/passport/back/email-success", ["zepto"], function(require, exports, module){ /** * 找回密码-邮箱找回成功 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $resend = $('#resend'); var tip = require("js/plugin/tip"), showErrTip = tip.show; $resend.on('tap', function(e) { e.preventDefault(); $.ajax({ url: $resend.data('url'), type: 'GET', success: function(data) { if (data.code === 200) { showErrTip(data.message); } else { showErrTip(data.message); } } }); }); }); define("js/passport/back/new-password", ["zepto"], function(require, exports, module){ /** * 密码找回-新密码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/8 */ var $ = require("zepto"); var $pwd = $('#pwd'), $btnOk = $('#btn-ok'); var api = require("js/passport/api"); var tip = require("js/plugin/tip"); var trim = $.trim; var showErrTip = tip.show; var $phoneNum = $('#phone-num'); api.bindEyesEvt(); $pwd.bind('input', function() { if (trim($pwd.val()) === '') { $btnOk.addClass('disable'); } else { $btnOk.removeClass('disable'); } }); $btnOk.on('tap', function() { var pwd = trim($pwd.val()), mobileBack = true, setting, url; if ($btnOk.hasClass('disable')) { return; } setting = { password: pwd }; if ($phoneNum.length === 0) { mobileBack = false; } if (mobileBack) { $.extend(setting, { phoneNum: $phoneNum.val(), areaCode: $('#areaCode').val(), token: $('#token').val() }); url = '/passport/back/passwordByMobile'; } else { $.extend(setting, { code: $('#email-code').val() }); url = '/passport/back/passwordByEmail'; } if (api.pwdValidate(pwd)) { $.ajax({ type: 'POST', url: url, data: setting, success: function(data) { if (data.code === 200) { showErrTip('密码修改成功'); //1000ms后跳转页面 setTimeout(function() { location.href = data.data; }, 1000); } else { showErrTip(data.message); } } }); } else { showErrTip('密码6-20位,请重新输入'); } }); }); define("js/guang/index", ["zepto","lazyload","swiper","mlellipsis","iscroll-probe","index"], function(require, exports, module){ /** * 逛打包入口 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/9 */ require("js/guang/plus-star/list"); require("js/guang/plus-star/detail"); require("js/guang/home"); require("js/guang/list"); require("js/guang/detail"); }); define("js/guang/plus-star/list", ["zepto","lazyload","swiper","index"], function(require, exports, module){ /** * PLUS+STAR列表页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"), lazyLoad = require("lazyload"), Swiper = require("swiper"); var $navs = $('#nav-tab > li'), $contents = $('#ps-content > .content'); var mySwiper; lazyLoad($('img.lazy')); mySwiper = new Swiper('.swiper-container', { lazyLoading: true, pagination: '.swiper-pagination' }); $('#nav-tab').delegate('li', 'tap', function() { if ($(this).hasClass('focus')) { return; } $navs.toggleClass('focus'); $contents.toggleClass('hide'); $(document).trigger('scroll'); //Trigger lazyLoad }); }); define("js/guang/plus-star/detail", ["zepto","mlellipsis","lazyload"], function(require, exports, module){ /** * PLUS+STAR详情页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"), ellipsis = require("mlellipsis"), lazyLoad = require("lazyload"); var $intro = $('#intro'), $imt = $('#intro-more-txt'), $infosContainer = $('#related-infos-container'); var info = require("js/guang/info"); var tip = require("js/plugin/tip"); var brandId = $('#brand-info').data('id'); var mIntro, aIntro; ellipsis.init(); //Init LazyLoad lazyLoad($('img.lazy')); //文字介绍文字截取 $intro[0].mlellipsis(3); //获取截取文字和完整文字 setTimeout(function() { mIntro = $intro.text(); aIntro = $intro.attr('title'); }); info.initInfosEvt($infosContainer); //文字介绍收起与展开 $('#more-intro').bind('tap', function() { var $this = $(this); $this.toggleClass('spread'); if ($this.hasClass('spread')) { //显示 $intro.text(aIntro); $imt.text('收起'); } else { //隐藏 $intro.text(mIntro); $imt.text('more'); } }); //品牌收藏 $('#brand-like').bind('tap', function(e) { var opt = 'ok', $this = $(this); e.preventDefault(); if ($this.hasClass('like')) { opt = 'cancel'; } $.ajax({ type: 'POST', url: '/product/opt/favoriteBrand', data: { id: brandId, opt: opt }, success: function(data) { if (data.code === 200) { $this.toggleClass('like'); } else if (data.code === 400) { tip.show('未登录'); } }, error: function() { tip.show('网络断开连接了~'); } }); }); }); define("js/guang/info", ["zepto","mlellipsis","lazyload"], function(require, exports, module){ /** * 资讯相关API * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"), ellipsis = require("mlellipsis"), lazyLoad = require("lazyload"); var tip = require("js/plugin/tip"); var $loadMoreInfo = $('#load-more-info'); var $loading = $(''), $noMore = $(''); var loading = false; ellipsis.init(); if ($loadMoreInfo.length > 0) { $loading = $loadMoreInfo.children('.loading'); $noMore = $loadMoreInfo.children('.no-more'); } /** * 设置指定资讯项的Lazyload和文字截取 * @params $infos 资讯项 */ function setLazyLoadAndMellipsis($infos) { lazyLoad($infos.find('img.lazy')); $infos.each(function() { var $this = $(this), $title = $this.find('.info-title'), $text = $this.find('.info-text'); $title[0].mlellipsis(2); $text[0].mlellipsis(2); }); } /** * 初始化资讯列表事件绑定 * @params $container 逛资讯列表容器 */ function initInfosEvt($container) { $container.delegate('.like-btn', 'tap', function(e) { var $likeBtn = $(e.currentTarget), $info = $likeBtn.closest('.guang-info'), opt = 'ok'; if ($likeBtn.hasClass('like')) { opt = 'cancel'; } $.ajax({ type: 'POST', url: '/guang/opt/praiseArticle', data: { id: $info.data('id'), opt: opt }, success: function(data) { var code = data.code; if (code === 200) { $likeBtn.next('.like-count').text(data.data); //切换点赞状态 $likeBtn.toggleClass('like'); } }, error: function() { tip.show('网络断开连接了~'); } }); }); setLazyLoadAndMellipsis($container.find('.guang-info')); } /** * 资讯LoadMore */ function loadMore($container, opt) { if (loading) { return; } if (opt.end) { return; } loading = true; $.ajax({ type: 'GET', url: ' /guang/index/page', data: opt, success: function(data) { if (data === ' ') { opt.end = true; loading = false; // $loading.addClass('hide'); $noMore.removeClass('hide'); return; } $container.append(data); setLazyLoadAndMellipsis($container.find('.guang-info')); opt.page++; loading = false; }, error: function() { tip.show('网络断开连接了~'); loading = false; } }); } exports.initInfosEvt = initInfosEvt; exports.setLazyLoadAndMellipsis = setLazyLoadAndMellipsis; exports.loadMore = loadMore; }); define("js/guang/home", ["zepto","swiper","mlellipsis","lazyload","index"], function(require, exports, module){ /** * 逛首页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"), Swiper = require("swiper"); var info = require("js/guang/info"), setLazyLoadAndMellipsis = info.setLazyLoadAndMellipsis, loadMore = info.loadMore; var $loadMoreInfo = $('#load-more-info'); var $loading = $(''), $noMore = $(''); var winH = $(window).height(), loadMoreH = $loadMoreInfo.height(); var $infoList = $('#info-list'), $infos = $infoList.children('.info-list'), $nav = $('#guang-nav'), $curNav = $nav.children('.focus'), curType = $curNav.data('type'); var state = {}; var mySwiper; if ($loadMoreInfo.length > 0) { $loading = $loadMoreInfo.children('.loading'); $noMore = $loadMoreInfo.children('.no-more'); } mySwiper = new Swiper('.swiper-container', { lazyLoading: true, pagination: '.swiper-pagination' }); info.initInfosEvt($infoList); //初始化各Nav下资讯加载的状态 (function() { var gender = $('#gender').val(); $nav.children('.guang-nav-item').each(function() { var type = $(this).data('type'); state[type] = { page: 1, gender: gender, type: type, end: false }; }); }()); $nav.delegate('.guang-nav-item', 'tap', function() { var $this = $(this), $content, index; if ($this.hasClass('focus')) { return; } index = $this.index(); $this.addClass('focus'); $curNav.removeClass('focus'); $infos.not('.hide').addClass('hide'); $content = $infos.eq(index); $content.removeClass('hide'); //lazyload & mellipsis setLazyLoadAndMellipsis($content.children('.guang-info')); $curNav = $this; curType = $this.data('type'); //重置当前Tab的load-more if (state[curType].end) { $loading.addClass('hide'); $noMore.removeClass('hide'); } else { $loading.removeClass('hide'); $noMore.addClass('hide'); } }); $(document).scroll(function() { if ($(window).scrollTop() + winH >= $(document).height() - loadMoreH) { loadMore($infos, state[curType]); } }); }); define("js/guang/list", ["zepto","mlellipsis","lazyload"], function(require, exports, module){ /** * 列表页,编辑页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/10 */ var $ = require("zepto"); var info = require("js/guang/info"), loadMore = info.loadMore; var winH = $(window).height(), loadMoreH = $('#load-more').height(); var $author = $('#author-infos'); var $tag = $('#tag'); var setting = { page: 1, end: false }; var $infos = $('#info-list'); info.initInfosEvt($infos); if ($author.length > 0) { $.extend(setting, { authorId: $author.data('id') }); } if ($tag.length > 0) { $.extend(setting, { tag: $tag.val() }); } $(document).scroll(function() { if ($(window).scrollTop() + winH >= $(document).height() - loadMoreH) { loadMore($infos, setting); } }); }); define("js/guang/detail", ["zepto","mlellipsis","lazyload","iscroll-probe"], function(require, exports, module){ /** * 逛详情页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/13 */ var $ = require("zepto"), ellipsis = require("mlellipsis"), lazyLoad = require("lazyload"), IScroll = require("iscroll-probe"); var $authorIntro = $('.author .intro'); var isIphone = navigator.userAgent.indexOf('iPhone') > 0 ? true : false; var hasCollocationBlock = $('.collocation-block').length > 0 ? true : false; //collocation block variable var thumbWidth = 0, $fixedThumbContainer = $(''), $coBlock, $thumbContainer, $thumbs, $prods, scrollToEl; var scrollToEl = document.querySelector('#wrapper .collocation-block'); var winW = $(window).width(); var myScroll; /** * 计算搭配的箭头的位置 * @param $curPos 当前focus的搭配项 */ function posCollocationArrow($curCo) { var left = $curCo.offset().left, bgPos = -winW + left + (thumbWidth / 2) + 'px'; $thumbContainer.css({ backgroundPosition: bgPos + ' bottom' }); if (isIphone) { $fixedThumbContainer.css({ backgroundPosition: bgPos + ' bottom' }); } } //搭配thumb的touch事件句柄 function thumbTouchEvt(e) { var $curCo = $(e.currentTarget), index = $curCo.index(), $brother, $brotherCo, $curProds; if ($curCo.hasClass('focus')) { return; } $thumbs.filter('.focus').removeClass('focus'); if (isIphone) { if ($curCo.closest('.fixed-thumb-container').length > 0) { $brother = $thumbContainer; } else { $brother = $fixedThumbContainer; } $brotherCo = $brother.find('.thumb').eq(index); $fixedThumbContainer.find('.thumb.focus').removeClass('focus'); $brotherCo.addClass('focus'); } $curCo.addClass('focus'); //定位arrow posCollocationArrow($curCo); $prods.not('.hide').addClass('hide'); $curProds = $prods.eq(index); $curProds.removeClass('hide'); // lazyLoad($curProds.find('.lazy')); if (isIphone) { if (myScroll) { myScroll.scrollToElement(scrollToEl, 400); } } else { $('body').animate({ scrollTop: $coBlock.offset().top }, 400); } } if (isIphone) { $('#wrapper').addClass('ios'); } ellipsis.init(); lazyLoad($('.lazy')); //title mlellipsis $('.info-list .title, .one-good .reco-name').each(function() { this.mlellipsis(2); }); //offset.left约等于marginLeft的值则表示介绍被换行,则清除intro的paddingTop让其更靠近头像和作者名 if (parseInt($authorIntro.offset().left, 10) === parseInt($authorIntro.css('margin-left'), 10)) { $authorIntro.css('padding-top', 0); } //有搭配模块,iphone使用iscroll初始化滚动并有固定的搭配栏,其他的没有 if (hasCollocationBlock) { $coBlock = $('.collocation-block'); $thumbContainer = $coBlock.children('.thumb-container'); $thumbs = $thumbContainer.find('li'); $prods = $coBlock.find('.prod'); thumbWidth = $thumbs.width(); if (isIphone) { $fixedThumbContainer = $('#wrapper') .after($thumbContainer.clone().addClass('fixed-thumb-container fixed-bottom')) .next('.thumb-container'); //load img of fixed thumb container lazyLoad($fixedThumbContainer.find('.lazy'), { event: 'sporty' }); } //Init Arrow Position posCollocationArrow($thumbs.filter('.focus')); $thumbContainer.delegate('.thumb', 'touchend', thumbTouchEvt); if (isIphone) { $fixedThumbContainer.delegate('.thumb', 'touchend', thumbTouchEvt); } } // 初始化iscroll window.onload = function() { var $scroller = $('#scroller'); var winH, tcH, cbH, cbTop, fixedThumbDom; if (!isIphone) { return; } myScroll = new IScroll('#wrapper', { probeType: 3, mouseWheel: true, click: true }); document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); if (!hasCollocationBlock) { myScroll.on('scroll', function() { $scroller.trigger('scroll'); }); return; } winH = $(window).height(); fixedThumbDom = $fixedThumbContainer[0]; tcH = $thumbContainer.height(); cbH = $coBlock.height(); cbTop = $coBlock.offset().top; myScroll.on('scroll', function() { var sTop = -this.y; var classList = fixedThumbDom.className; if (sTop <= cbTop - winH + tcH) { if (classList.indexOf('fixed-bottom') === -1) { $fixedThumbContainer .addClass('fixed-bottom') .removeClass('hide'); } } else if (sTop <= cbTop) { if (classList.indexOf('hide') === -1) { $fixedThumbContainer .addClass('hide') .removeClass('fixed-bottom fixed-top'); } } else if (sTop <= cbTop + cbH - tcH) { if (classList.indexOf('fixed-top') === -1) { $fixedThumbContainer .addClass('fixed-top') .removeClass('hide absolute') .css('top', ''); } } else if (sTop <= cbTop + cbH) { if (classList.indexOf('absolute') === -1) { $fixedThumbContainer .addClass('absolute') .removeClass('fixed-top hide'); } fixedThumbDom.style.top = cbTop + cbH - tcH - sTop + 'px'; } else if (sTop > cbTop + cbH) { if (classList.indexOf('hide') === -1) { $fixedThumbContainer .addClass('hide') .removeClass('absolute'); } } $scroller.trigger('scroll'); }); }; }); define("js/home/index", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 首页打包入口 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/12 */ require("js/home/home"); require("js/home/maybe-like"); }); define("js/home/home", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 首页 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/12 */ var $ = require("zepto"), Swiper = require("swiper"), lazyLoad = require("lazyload"), bannerSwiper, recommendSwiper, hotBrandsSwiper, trendTopicSwiper, goodsSwiper; var requestFrame, thisFunc, start = 0, i, swiperClass, supportCss3, $logotrans = $('.home-header .logo'), isen = true; require("js/home/maybe-like"); lazyLoad($('img.lazy')); //$('img:in-viewport').trigger('appear'); //点击首页汉堡menu图标,滑出侧栏导航 $('.nav-btn').on('tap', function (event) { if (!$(this).hasClass('menu-open')) { $('.mobile-wrap').addClass('menu-open'); $('.overlay').addClass('show'); $('.side-nav').addClass('on'); //设置boy高宽,页面不能上下滑动 $('body').css({ height: $(window).height(), width: '100%', overflow: 'hidden' }); } event.stopPropagation(); }); //点击页面主体,收起侧栏导航及二级导航 $('.mobile-wrap').on('tap', function () { if ($(this).hasClass('menu-open')) { $('.mobile-wrap').removeClass('menu-open'); $('.overlay').removeClass('show'); $('.sub-nav').removeClass('show'); $('.side-nav').removeClass('on'); $('body').css({ height: 'auto', overflow: 'auto' }); } }); //点击一级导航,弹出二级导航 $('.side-nav').on('tap', 'li', function () { if ($(this).find('.sub-nav').size() > 0) { $('.sub-nav').removeClass('show'); $(this).find('.sub-nav').addClass('show'); } }); //返回一级导航,收起二级导航 $('.sub-nav').each(function () { $(this).find('li').eq(0).on('tap', function (e) { $('.sub-nav').removeClass('show'); e.stopPropagation(); }); }); //二级导航样式控制 $('.sub-nav').on('mouseenter', 'li', function () { if ($(this).index() !== 0) { $(this).addClass('current').siblings().removeClass('current'); } }); //头部banner轮播 if ($('.banner-swiper').find('li').size() > 1) { bannerSwiper = new Swiper('.banner-swiper', { lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, autoplay: 3000, autoplayDisableOnInteraction: false, paginationClickable: true, slideElement: 'li', pagination: '.banner-top .pagination-inner' }); } //热门品牌滑动 hotBrandsSwiper = new Swiper('.brands-swiper', { grabCursor: true, slidesPerView: 'auto', wrapperClass: 'brands-list', slideElement: 'li' }); //推荐搭配滑动 recommendSwiper = new Swiper('.recommend-swiper', { grabCursor: true, slidesPerView: 'auto', wrapperClass: 'recommend-list', slideElement: 'li' }); //潮品话题轮播 if ($('.trend-topic-swiper').find('li').size() > 1) { trendTopicSwiper = new Swiper('.trend-topic-swiper', { loop: true, autoplay: 3000, autoplayDisableOnInteraction: false, paginationClickable: true, slideElement: 'li', pagination: '.trend-topic-content .pagination-inner' }); } //潮流上装/经典裤装等轮播 $('.category-swiper').each(function (i, index) { swiperClass = 'category-swiper' + i; $(this).addClass(swiperClass); if ($('.' + swiperClass).find('.swiper-slide').size() > 1) { goodsSwiper = new Swiper('.' + swiperClass, { loop: true, autoplay: 3000, autoplayDisableOnInteraction: false, paginationClickable: true, slideElement: 'li', pagination: '.' + swiperClass + ' .pagination-inner' }); } }); //关闭头部下载浮层 $('.header-download').on('tap', '.close-btn', function () { $(this).parent().remove(); }); //logo动画 requestFrame = (function () { var tempFunc = null, prefixList = ['webkit', 'moz', 'ms']; for (i = 0; i < prefixList.length; i++) { thisFunc = prefixList[i] + 'RequestAnimationFrame'; if (window[thisFunc]) { supportCss3 = true; tempFunc = thisFunc; } } if (supportCss3) { return function (callback) { window[tempFunc](callback); }; } return function (callback) { window.setTimeout(callback, 67); }; })(); function tsAnimate() { start = start + 10; $logotrans.css({ transform: 'rotateX(' + start + 'deg)', '-webkit-transform': 'rotateX(' + start + 'deg)', '-moz-transform': 'rotateX(' + start + 'deg)' }); if (start / 90 % 2 === 1) { if (isen) { $logotrans.addClass('animate'); isen = false; } else { $logotrans.removeClass('animate'); isen = true; } } if (start / 90 % 2 === 0 && start % 360 !== 0) { window.setTimeout(tsAnimate, 3000); } else { if (start % 360 === 0) { window.setTimeout(tsAnimate, 3 * 60 * 1000); } else { requestFrame(function () { tsAnimate(); }); } } } tsAnimate(); }); define("js/home/maybe-like", ["zepto","lazyload"], function(require, exports, module){ /** * “你可能喜欢”模块JS * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/12 */ var $ = require("zepto"), tip = require("js/plugin/tip"), lazyLoad = require("lazyload"); var winH = $(window).height(), loadMoreH = $('#load-more').height(), $goodList = $('#goods-list'), loading = false, page = 0, gender = $('.mobile-wrap').hasClass('boys-wrap') ? '1,3' : '2,3', kidsType = $('.mobile-wrap').hasClass('kids-wrap') ? true : false, lifestyleType = $('.mobile-wrap').hasClass('lifestyle-wrap') ? true : false, num, url; var $curNav, index, $navList = $('#maybe-like-nav'); //ajax url if (kidsType) { url = '/product/recom/maylikekids'; } else if (lifestyleType) { url = '/product/recom/maylikelife'; } else { url = '/product/recom/maylike?gender=' + gender; } $curNav = $navList.children('.focus'); $('#maybe-like-nav').delegate('li', 'tap', function() { var $this = $(this), $goods = $('.goods-list'), $content; if ($this.hasClass('focus')) { return; } index = $this.index(); $this.addClass('focus'); $curNav.removeClass('focus'); $goods.not('.hide').addClass('hide'); $content = $goods.eq(index); $content.removeClass('hide'); $curNav = $this; $(document).trigger('scroll'); //Trigger lazyLoad }); //srcoll to load more $(window).scroll(function () { if ($(window).scrollTop() + winH >= $(document).height() - loadMoreH) { if (loading) { return; } loading = true; num = $goodList.children('.good-info').length; $.ajax({ type: 'GET', url: url, data: { page: page + 1 }, success: function(data) { if (data === ' ') { loading = true; return; } $goodList.append(data); //lazyLoad //lazyLoad($goodList.children('.good-info:gt(' + (num - 1) + ')').find('img.lazy')); lazyLoad($('.good-info').find('img.lazy')); loading = false; page++; }, error: function() { tip.show('网络断开连接了~'); loading = false; } }); } }); }); define("js/product/index", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 产品打包入口 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/12 */ require("js/product/newsale/newarrival"); require("js/product/newsale/discount"); require("js/product/list"); require("js/product/detail/detail"); }); define("js/product/newsale/newarrival", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 新品到着 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/24 */ var $ = require("zepto"), Swiper = require("swiper"), lazyLoad = require("lazyload"); var swiper; var filter = require("js/plugin/filter"); var $goodsContainer = $('#goods-container'), $ngc = $($goodsContainer.children().get(0)), $pgc = $($goodsContainer.children().get(1)), $dgc = $($goodsContainer.children().get(2)); var winH = $(window).height(); //默认筛选条件 var defaultOpt = { gender: $('#gender').val(), brand: $('#brand').val(), sort: $('#sort').val(), color: $('#color').val(), size: $('#size').val(), price: $('#price').val(), discount: $('#discount').val(), limit: $('#limit').val(), channel: $('#channel').val(), p_d: $('#p_d').val() }; var now = new Date(), month = now.getMonth() + 1, date = now.getDate(); var $listNav = $('#list-nav'), //导航数据信息 navInfo = { today: { reload: true, page: 0, end: false }, week: { reload: true, page: 0, end: false }, sale: { reload: true, page: 0, end: false } }, $pre = $listNav.find('.active'), //纪录进入筛选前的active项,初始为选中项 searching; $pgc.addClass('hide'); $dgc.addClass('hide'); $('#today a').text(month + '月' + date + '号'); if ($('.swiper-container .swiper-slide').length > 1) { swiper = new Swiper('.swiper-container', { lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, autoplay: 3000, autoplayDisableOnInteraction: false, paginationClickable: true, pagination: '.swiper-pagination' }); } /** * 筛选注册的回调,筛选子项点击后逻辑 * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载 * @param opt {type, id} */ function search(opt) { var setting = {}, ext, att, nav, navType, dayLimit, page; if (opt) { //筛选项变更则重置reload为true for (att in navInfo) { if (navInfo.hasOwnProperty(att)) { navInfo[att].reload = true; } } //处理active状态 $listNav.children('.active').removeClass('active'); $pre.addClass('active'); switch (opt.type) { case 'gender': ext = { gender: opt.id }; break; case 'brand': ext = { brand: opt.id }; break; case 'sort': ext = { sort: opt.id }; break; case 'color': ext = { color: opt.id }; break; case 'size': ext = { size: opt.id }; break; case 'price': ext = { price: opt.id }; break; case 'discount': ext = { discount: opt.id }; break; case 'limit': ext = { limit: opt.id }; break; case 'channel': ext = { channel: opt.id }; break; case 'p_d': ext = { p_d: opt.id }; break; } $.extend(defaultOpt, ext); //扩展筛选项 } if (searching) { return; } //导航类别 if ($pre.hasClass('today')) { navType = 'today'; dayLimit = 1; } else if ($pre.hasClass('week')) { navType = 'week'; dayLimit = 2; } else if ($pre.hasClass('sale')) { navType = 'sale'; dayLimit = 3; } nav = navInfo[navType]; page = nav.page + 1; if (nav.reload) { page = 1; } else if (nav.end) { //不需要重新加载并且数据请求结束 return; } $.extend(setting, defaultOpt, { dayLimit: dayLimit, page: page }); searching = true; $.ajax({ type: 'GET', url: '/product/newsale/selectNewSale', data: setting, success: function(data) { var noResult = '<p class="no-result">未找到相关搜索结果</p>', $container; switch (navType) { case 'today': $container = $ngc; break; case 'week': $container = $pgc; break; case 'sale': $container = $dgc; break; } if (data === ' ') { nav.end = true; if (nav.reload) { $container.html(noResult); } } else { if (nav.reload) { $container.html(data); } else { $container.append(data); } lazyLoad($container.find('.lazy')); } nav.reload = false; nav.page = page; searching = false; } }); } lazyLoad($('.lazy')); filter.registerCbFn(search); //导航栏点击逻辑说明: //1.点击非active项时切换active状态 //2.价格和折扣active状态时继续点击切换排序 //3.筛选无active时点击展开筛选面板 //4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态 //5.当前active为筛选并且点击其他项时,隐藏筛选面板 $listNav.delegate('li', 'tap', function() { var $this = $(this), nav, navType, $active; if ($this.hasClass('filter')) { //筛选面板切换状态 if ($this.hasClass('active')) { filter.hideFilter(); //点击筛选钱的active项回复active $pre.addClass('active'); $this.removeClass('active'); } else { $pre = $this.siblings('.active'); $pre.removeClass('active'); $this.addClass('active'); filter.showFilter(); } } else { if ($this.hasClass('today')) { navType = 'today'; } else if ($this.hasClass('week')) { navType = 'week'; } else if ($this.hasClass('sale')) { navType = 'sale'; } nav = navInfo[navType]; if (!($this.hasClass('active'))) { $active = $this.siblings('.active'); $pre = $this; //$pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项 if ($active.hasClass('filter')) { //若之前active项为筛选,则隐藏筛选面板 filter.hideFilter(); } else { //切换container显示 $goodsContainer.children('.container:not(.hide)').addClass('hide'); switch (navType) { case 'today': $ngc.removeClass('hide'); break; case 'week': $pgc.removeClass('hide'); break; case 'sale': $dgc.removeClass('hide'); break; } } $active.removeClass('active'); $this.addClass('active'); } if (nav.reload) { search(); } } }); $(window).scroll(function() { //当scroll到1/4$goodsContainer高度后继续请求下一页数据 if ($(window).scrollTop() + winH > $(document).height() - 0.25 * $goodsContainer.height()) { if ($pre !== undefined) { search(); } } }); }); define("js/plugin/filter", ["zepto"], function(require, exports, module){ /** * 筛选JS * 暴露三个接口:注册回调、显示filter、隐藏filter * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/19 */ var $ = require("zepto"); var $filter = $('.filter-mask, .filter-body'); var $classify = $filter.find('.classify'), $subClassify = $filter.find('.sub-classify'); var cbFn; //隐藏筛选界面 function hideFilter() { $filter.addClass('hide'); } //显示筛选界面 function showFilter() { $filter.removeClass('hide'); } //注册sub-classify点击后的回调 function registerCbFn(cb) { cbFn = cb; } //设置完高度后显示sub并设置选中 $classify.children(':first-child').addClass('active'); //T:不在HTML中使用{{#if @first}}active{{/if}}来初始化active为避免sub设置高度时的闪烁 //classify switch $classify.delegate('.classify-item', 'tap', function() { var $this = $(this); if ($this.hasClass('active')) { return; } $this.siblings('.active').removeClass('active'); $this.addClass('active'); }); //点击Mask隐藏筛选界面 $filter.filter('.filter-mask').tap(function() { hideFilter(); }); $subClassify.delegate('li', 'tap', function(e) { var $this = $(this), id = $this.data('id'); var $sub = $this.closest('.sub-classify'); var $shower = $sub.siblings('.shower'); var html, shower; e.stopPropagation(); if ($this.hasClass('chosed')) { return; } $sub.children('.chosed').removeClass('chosed'); $this.addClass('chosed'); html = $.trim($this.html()); shower = $.trim($shower.html()); $shower.html( shower.substring(0, shower.indexOf('</span>') + 7) + //拆分出shower的title html.substring(0, html.indexOf('<i')) //拆分选中筛选值 ); if ($this.index() === 0) { $shower.addClass('default'); } else { $shower.removeClass('default'); } if (cbFn) { cbFn({ type: $sub.data('type'), id: id }); } hideFilter(); }); exports.showFilter = showFilter; exports.hideFilter = hideFilter; exports.registerCbFn = registerCbFn; }); define("js/product/newsale/discount", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 商品列表页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/20 */ var $ = require("zepto"), Swiper = require("swiper"), lazyLoad = require("lazyload"); var swiper; var filter = require("js/plugin/filter"); var $goodsContainer = $('#goods-container'), $ngc = $($goodsContainer.children().get(0)), $pgc = $($goodsContainer.children().get(1)), $dgc = $($goodsContainer.children().get(2)); var winH = $(window).height(); //默认筛选条件 var defaultOpt = { gender: $('#gender').val(), brand: $('#brand').val(), sort: $('#sort').val(), color: $('#color').val(), size: $('#size').val(), price: $('#price').val(), discount: $('#discount').val() }; var $listNav = $('#list-nav'), //导航数据信息 navInfo = { newest: { order: 1, reload: true, page: 0, end: false }, price: { order: 0, reload: true, page: 0, end: false }, discount: { order: 0, reload: true, page: 0, end: false } }, $pre = $listNav.find('.active'), //纪录进入筛选前的active项,初始为选中项 searching; if ($('.swiper-container .swiper-slide').length > 1) { swiper = new Swiper('.swiper-container', { lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, autoplay: 3000, autoplayDisableOnInteraction: false, paginationClickable: true, pagination: '.swiper-pagination' }); } /** * 筛选注册的回调,筛选子项点击后逻辑 * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载 * @param opt {type, id} */ function search(opt) { var setting = {}, ext, att, nav, navType, page; if (opt) { //筛选项变更则重置reload为true for (att in navInfo) { if (navInfo.hasOwnProperty(att)) { navInfo[att].reload = true; } } //处理active状态 $listNav.children('.active').removeClass('active'); $pre.addClass('active'); switch (opt.type) { case 'gender': ext = { gender: opt.id }; break; case 'brand': ext = { brand: opt.id }; break; case 'sort': ext = { sort: opt.id }; break; case 'color': ext = { color: opt.id }; break; case 'size': ext = { size: opt.id }; break; case 'price': ext = { price: opt.id }; break; case 'discount': ext = { discount: opt.id }; break; } $.extend(defaultOpt, ext); //扩展筛选项 } if (searching) { return; } //导航类别 if ($pre.hasClass('new')) { navType = 'newest'; } else if ($pre.hasClass('price')) { navType = 'price'; } else if ($pre.hasClass('discount')) { navType = 'discount'; } nav = navInfo[navType]; page = nav.page + 1; if (nav.reload) { page = 1; } else if (nav.end) { //不需要重新加载并且数据请求结束 return; } $.extend(setting, defaultOpt, { type: navType, order: nav.order, page: page }); searching = true; $.ajax({ type: 'GET', url: '/product/newsale/selectNewSale', data: setting, success: function(data) { var noResult = '<p class="no-result">未找到相关搜索结果</p>', $container; switch (navType) { case 'newest': $container = $ngc; break; case 'price': $container = $pgc; break; case 'discount': $container = $dgc; break; } if (data === ' ') { nav.end = true; if (nav.reload) { $container.html(noResult); } } else { if (nav.reload) { $container.html(data); } else { $container.append(data); } lazyLoad($container.find('.lazy')); } nav.reload = false; nav.page = page; searching = false; } }); } lazyLoad($('.lazy')); filter.registerCbFn(search); //导航栏点击逻辑说明: //1.点击非active项时切换active状态 //2.价格和折扣active状态时继续点击切换排序 //3.筛选无active时点击展开筛选面板 //4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态 //5.当前active为筛选并且点击其他项时,隐藏筛选面板 $listNav.delegate('li', 'tap', function() { var $this = $(this), nav, navType, $active; if ($this.hasClass('filter')) { //筛选面板切换状态 if ($this.hasClass('active')) { filter.hideFilter(); //点击筛选钱的active项回复active $pre.addClass('active'); $this.removeClass('active'); } else { $pre = $this.siblings('.active'); $pre.removeClass('active'); $this.addClass('active'); filter.showFilter(); } } else { if ($this.hasClass('new')) { navType = 'newest'; } else if ($this.hasClass('price')) { navType = 'price'; } else if ($this.hasClass('discount')) { navType = 'discount'; } nav = navInfo[navType]; if ($this.hasClass('active')) { //最新无排序切换 if ($this.hasClass('new')) { return; } if ($this.hasClass('price') || $this.hasClass('discount')) { // 价格/折扣切换排序状态 $this.find('.icon > .iconfont').toggleClass('cur'); $pre = $this; //更新pre为当前项 nav.reload = true; //重置reload,HTML会被替换为逆序的HTML nav.order = nav.order === 0 ? 1 : 0; //切换排序 } } else { $active = $this.siblings('.active'); $pre = $this; //$pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项 if ($active.hasClass('filter')) { //若之前active项为筛选,则隐藏筛选面板 filter.hideFilter(); } else { //切换container显示 $goodsContainer.children('.container:not(.hide)').addClass('hide'); switch (navType) { case 'newest': $ngc.removeClass('hide'); break; case 'price': $pgc.removeClass('hide'); break; case 'discount': $dgc.removeClass('hide'); break; } } $active.removeClass('active'); $this.addClass('active'); } if (nav.reload) { search(); } } }); $(window).scroll(function() { //当scroll到1/4$goodsContainer高度后继续请求下一页数据 if ($(window).scrollTop() + winH > $(document).height() - 0.25 * $goodsContainer.height()) { if ($pre !== undefined) { search(); } } }); }); define("js/product/list", ["zepto","lazyload"], function(require, exports, module){ /** * 商品列表页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/20 */ var $ = require("zepto"), lazyLoad = require("lazyload"); //品牌页参数 var $brandHeader = $('#brand-header'), $introBox = $('#intro-box'); var filter = require("js/plugin/filter"); var tip = require("js/plugin/tip"); var $goodsContainer = $('#goods-container'), $ngc = $goodsContainer.children('.new-goods'), $pgc = $goodsContainer.children('.price-goods'), $dgc = $goodsContainer.children('.discount-goods'); var winH = $(window).height(); //默认筛选条件 var defaultOpt = { gender: $('#gender').val(), brand: $('#brand').val(), sort: $('#sort').val(), color: $('#color').val(), size: $('#size').val(), price: $('#price').val(), discount: $('#discount').val(), query: $('#query').val() }; var $listNav = $('#list-nav'), //导航数据信息 navInfo = { newest: { order: 1, reload: false, page: 1, end: false }, price: { order: 0, reload: true, page: 0, end: false }, discount: { order: 0, reload: true, page: 0, end: false } }, $pre = $listNav.find('.active'), //纪录进入筛选前的active项,初始为选中项 searching; /** * 筛选注册的回调,筛选子项点击后逻辑 * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载 * @param opt {type, id} */ function search(opt) { var setting = {}, ext, att, nav, navType, page; if (opt) { //筛选项变更则重置reload为true for (att in navInfo) { if (navInfo.hasOwnProperty(att)) { navInfo[att].reload = true; } } //处理active状态 $listNav.children('.active').removeClass('active'); $pre.addClass('active'); switch (opt.type) { case 'gender': ext = { gender: opt.id }; break; case 'brand': ext = { brand: opt.id }; break; case 'sort': ext = { sort: opt.id }; break; case 'color': ext = { color: opt.id }; break; case 'size': ext = { size: opt.id }; break; case 'price': ext = { price: opt.id }; break; case 'discount': ext = { discount: opt.id }; break; } $.extend(defaultOpt, ext); //扩展筛选项 } if (searching) { return; } //导航类别 if ($pre.hasClass('new')) { navType = 'newest'; } else if ($pre.hasClass('price')) { navType = 'price'; } else if ($pre.hasClass('discount')) { navType = 'discount'; } nav = navInfo[navType]; page = nav.page + 1; if (nav.reload) { page = 1; } else if (nav.end) { //不需要重新加载并且数据请求结束 return; } $.extend(setting, defaultOpt, { type: navType, order: nav.order, page: page }); searching = true; $.ajax({ type: 'GET', url: '/index/search/search', data: setting, success: function(data) { var noResult = '<p class="no-result">未找到相关搜索结果</p>', $container; switch (navType) { case 'newest': $container = $ngc; break; case 'price': $container = $pgc; break; case 'discount': $container = $dgc; break; } if (data === ' ') { nav.end = true; if (nav.reload) { $container.html(noResult); } } else { if (nav.reload) { $container.html(data); } else { $container.append(data); } lazyLoad($container.find('.lazy')); } nav.reload = false; nav.page = page; searching = false; } }); } lazyLoad($('.lazy')); filter.registerCbFn(search); //导航栏点击逻辑说明: //1.点击非active项时切换active状态 //2.价格和折扣active状态时继续点击切换排序 //3.筛选无active时点击展开筛选面板 //4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态 //5.当前active为筛选并且点击其他项时,隐藏筛选面板 $listNav.delegate('li', 'tap', function() { var $this = $(this), nav, navType, $active; if ($this.hasClass('filter')) { //筛选面板切换状态 if ($this.hasClass('active')) { filter.hideFilter(); //点击筛选钱的active项回复active $pre.addClass('active'); $this.removeClass('active'); } else { $pre = $this.siblings('.active'); $pre.removeClass('active'); $this.addClass('active'); filter.showFilter(); } } else { if ($this.hasClass('new')) { navType = 'newest'; } else if ($this.hasClass('price')) { navType = 'price'; } else if ($this.hasClass('discount')) { navType = 'discount'; } nav = navInfo[navType]; if ($this.hasClass('active')) { //最新无排序切换 if ($this.hasClass('new')) { return; } if ($this.hasClass('price') || $this.hasClass('discount')) { // 价格/折扣切换排序状态 $this.find('.icon > .iconfont').toggleClass('cur'); $pre = $this; //更新pre为当前项 nav.reload = true; //重置reload,HTML会被替换为逆序的HTML nav.order = nav.order === 0 ? 1 : 0; //切换排序 } } else { $active = $this.siblings('.active'); $pre = $this; //$pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项 if ($active.hasClass('filter')) { //若之前active项为筛选,则隐藏筛选面板 filter.hideFilter(); } else { //切换container显示 $goodsContainer.children('.container:not(.hide)').addClass('hide'); switch (navType) { case 'newest': $ngc.removeClass('hide'); break; case 'price': $pgc.removeClass('hide'); break; case 'discount': $dgc.removeClass('hide'); break; } } $active.removeClass('active'); $this.addClass('active'); } if (nav.reload) { search(); } } }); $(window).scroll(function() { //当scroll到1/4$goodsContainer高度后继续请求下一页数据 if ($(window).scrollTop() + winH > $(document).height() - 0.25 * $goodsContainer.height()) { search(); } }); //品牌介绍 $brandHeader.children('.btn-intro').bind('tap', function() { $introBox.removeClass('hide'); }); $('.close-intro, .brand-intro-box').tap(function() { $introBox.addClass('hide'); }); $('#brand-intro').tap(function(e) { e.stopPropagation(); }); //品牌收藏 $brandHeader.children('.btn-col').bind('tap', function() { var $this = $(this); var id = $brandHeader.data('id'), opt; if ($this.hasClass('coled')) { opt = 'cancel'; } else { opt = 'ok'; } $.ajax({ type: 'POST', url: '/product/opt/favoriteBrand', data: { id: id, opt: opt }, success: function(data) { if (data.code === 200) { $this.toggleClass('coled'); } else if (data.code === 400) { tip.show('未登录'); } }, error: function() { tip.show('网络断开连接了~'); } }); }); }); define("js/product/detail/detail", ["zepto","swiper","lazyload","index"], function(require, exports, module){ /** * 产品打包入口 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/20 */ var $ = require("zepto"), Swiper = require("swiper"), lazyLoad = require("lazyload"), goodsSwiper; lazyLoad($('img.lazy')); goodsSwiper = new Swiper('.banner-swiper', { loop: true, pagination: '.banner-top .pagination-inner', slideElement: 'div', nextButton: '.swiper-button-next', prevButton: '.swiper-button-prev' }); }); define("js/index/index", ["zepto"], function(require, exports, module){ /** * Index打包入口 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/19 */ require("js/index/search"); require("js/index/channel"); require("js/index/footer"); }); define("js/index/search", ["zepto"], function(require, exports, module){ /** * 搜索JS * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/10/19 */ var $ = require("zepto"); var $input = $('#search-input input'); var $clear = $('#search-input .clear-input'); var $history = $('.history'); $('#clear-history').bind('tap', function() { $.ajax({ type: 'POST', url: '/search/clearHistory', success: function(data) { if (data.code === 200) { $history.html(''); //clear search history items } } }); }); $input.bind('input', function() { if ($input.val() === '') { $clear.addClass('hide'); } else { $clear.removeClass('hide'); } }); $clear.bind('tap', function() { $input.val('').trigger('input'); }); }); define("js/index/channel", [], function(require, exports, module){ /** * 频道选择 * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/12 */ }); define("js/index/footer", ["zepto"], function(require, exports, module){ /** * 底部JS * @author: liangzhifeng<zhifeng.liang@yoho.cn> * @date: 2015/10/26 */ var $ = require("zepto"); var $searchBox = $('.search-box'), $indexSearch = $('.index-search'), $indexLogo = $('.index-logo'); function downLoadApp() { var appUrl = 'http://a.app.qq.com/o/simple.jsp?pkgname=com.yoho&g_f=995445'; var clickedAt = new Date(); setTimeout(function () { if ((new Date()) - clickedAt < 2000) { window.location = appUrl; } }, 500); } $('#float-layer-close').bind('tap', function () { $('#float-layer-app').hide(); window.setCookie('_float-layer-app', 'id490655927', { domain: '.yohobuy.com' }); window.setCookie('_float-layer-app-close', 1, { domain: '.yohobuy.com', expires: 1 }); }); $('#float-layer-btn').tap(function () { downLoadApp('bottom'); }); if (!window.cookie('_float-layer-app')) { $('#float-layer-app').show(); } else { $('#float-layer-app').hide(); } /** * 频道选择页面顶部搜索 * @author: bikai<kai.bi@yoho.cn> * @date: 2015/10/28 */ $searchBox.find('input').on('focus', function () { $indexLogo.css({ width: 0, display: 'none' }); $searchBox.css({ width: '12.8rem' }); $indexSearch.css({ width: '15.5rem' }); $('.clear-text, .no-search').show(); }).on('blur', function () { $indexLogo.css({ width: '5.4rem', display: 'block' }); $searchBox.css({ width: '8.8rem' }); $indexSearch.css({ width: '9.6rem' }); $('.clear-text, .no-search').hide(); }); $searchBox.find('.clear-text').tap(function () { $searchBox.find('input').val('').trigger('focus'); }); $searchBox.find('.search-icon').tap(function () { $indexSearch.submit(); }); });