define("index", ["jquery","handlebars","source-map","index","lazyload","dot","jquery.placeholder"], function(require, exports, module){ var webYohobuy; //通用 require("js/common"); //头部 require("js/header"); //简化头部 require("js/simple-header"); //商品(列表、搜索、商品详情) require("js/product/entry"); //频道页 require("js/index/index"); //品牌一览 require("js/brand/index"); //登录注册找回密码 require("js/passport/entry"); //购物车 require("js/cart/cart"); //个人中心 require("js/home/entry"); //订单确认 require("js/order/ensure"); module.exports = webYohobuy; }); define("js/common", ["jquery"], function(require, exports, module){ /** * 页面公共逻辑和接口 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/11/23 */ var $ = require("jquery"); var $body = $('body'); require("js/footer"); function cookie(name) { var re = new RegExp(name + '=([^;$]*)', 'i'), matchPattern = '$1'; return re.test(decodeURIComponent(document.cookie)) ? RegExp[matchPattern] : ''; } 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; } //YAS统计代码 (function(w, d, s, j, f) { var a = d.createElement(s); var m = d.getElementsByTagName(s)[0]; w.YohoAcquisitionObject = f; w[f] = function() { w[f].p = arguments; }; a.async = 1; a.src = j; m.parentNode.insertBefore(a, m); })(window, document, 'script', 'http://cdn.yoho.cn/yas-jssdk/1.0.14/yas.js', '_yas'); (function() { var uid = getUid(); uid = uid === 0 ? '' : uid; window._ozuid = uid; //暴露ozuid if (window._yas) { window._yas(1 * new Date(), '1.0.14', 'yohobuy_web', uid, '', ''); } }()); //window.resize在width<1180时适配成990 $(window).on('resize', function() { var w = $(this).width(); //return top if (w < 1360) { $('.return-top').addClass('min'); } else { $('.return-top').removeClass('min'); } //body if (w < 1180) { $body.addClass('min-screen'); } else { $body.removeClass('min-screen'); } }).trigger('resize'); function queryString() { var vars = {}, hash, i, search = window.location.search, hashes = search ? decodeURIComponent(search).slice(1).split('&') : []; for (i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars[hash[0]] = hash[1]; } return vars; } //个人中心左侧栏头像加载失败后,显示默认头像 (function() { $(window).load(function() { var thumb = document.getElementById('user-thumb'); var img; if (!thumb) { return; } img = new Image(); img.src = thumb.src; img.onerror = function() { $(thumb).parent().append('<div class="default-user-thumb"></div>').end().remove(); }; }); }()); window.cookie = cookie; window.setCookie = setCookie; window.getUser = getUser; window.getUid = getUid; window.getShoppingKey = getShoppingKey; window.queryString = queryString; }); define("js/footer", ["jquery"], function(require, exports, module){ /** * 尾部 * @author: wangqing<robin.wang@yoho.cn> * @date: 2015/12/01 */ var $ = require("jquery"); var $returnTop = $('.return-top'); /** * 订阅 * @return {[type]} [description] */ function actionSubscription() { var $subscriberBox = $('#subscriber-box'), $subscriberBtn = $('#subscriber-btn'), emailReg = /^[.\-_a-zA-Z0-9]+@[\-_a-zA-Z0-9]+\.[a-zA-Z0-9]/; var iconCode = { mail: '', tick: '' }; $subscriberBox.focus(function() { $(this).val('').css('color', ''); $subscriberBtn.removeClass('done').html(iconCode.mail); }); $subscriberBtn.click(function() { var email = $.trim($subscriberBox.val()); if (email !== '' && emailReg.test(email)) { try { $.ajax({ url: 'http://new.yohobuy.com/common/emailsubscriber', dataType: 'jsonp', data: { email: email, tmp: Math.random(), uid: window.getUid() }, success: function(data) { if (data.data.result === 1) { $subscriberBox.val('已订阅到:' + email); $subscriberBtn.addClass('done').html(iconCode.tick); } else { $subscriberBox.css('color', 'red'); } } }); } catch (e) { console.log(e.message); } } else { $subscriberBox.css('color', 'red'); } }); } function actionhomeFootChange() { var $vote = $('.vote'), $feedBackPage = $('#feed-back-page'), count = $vote.children('li').length; //意见反馈 $feedBackPage.on('click', 'span', function() { var $this = $(this); if ($this.hasClass('cur')) { return; } $this.siblings('.cur').removeClass('cur'); $this.addClass('cur'); $vote.children().not('.hide').addClass('hide') .end() .eq($this.index()).removeClass('hide'); }); $vote.on('click', '.feed-back-btn', function() { var $this = $(this), $li = $this.closest('li'), index = $li.index(), _solution = []; var _answer = $li.find('.feedback-answer').val(), _feedback = $li.find('.feedback-id').val(), _question = $li.find('.question-id').val(); $li.find(':checked').each(function() { _solution.push($(this).val()); }); $.ajax({ url: 'http://new.yohobuy.com/common/suggestfeedback', dataType: 'jsonp', data: { feedback_id: _feedback || 0, question_id: _question || 0, answer: _answer || '', solution: _solution.join(',') }, success: function(data) { var next = index + 1; if (~~data.data.result === 1) { if (index === count - 1) { alert('感谢您的参与!'); return; } $li.addClass('hide'); $vote.children(':eq(' + (index + 1) + ')').removeClass('hide'); $feedBackPage.children('.cur').removeClass('cur'); $feedBackPage.children(':eq(' + next + ')').addClass('cur'); } } }); }); } function rePosReturn() { if ($(window).height() > $(document).height()) { $returnTop.addClass('hide'); } // 只在窗口高度大于文档高度的时候,隐藏返回顶部 // else { // $returnTop.removeClass('hide'); // } } //返回顶部 $returnTop.click(function() { $('html,body').animate({ scrollTop: 0 }, 500); }); $(window).scroll(function() { if ($(window).scrollTop() === 0) { $returnTop.addClass('hide'); } else { $returnTop.removeClass('hide'); } }); //如果初始是隐藏的,监听图片加载,重新确定return-top的高度 if ($returnTop.hasClass('hide')) { $('img').load(rePosReturn); } //初始化 actionSubscription(); actionhomeFootChange(); //暴露给有可能通AJAX改变内容的页面去用 window.rePosReturnTop = rePosReturn; }); define("js/header", ["jquery","handlebars","source-map","index"], function(require, exports, module){ /** * 头部 * @author: wangqing<robin.wang@yoho.cn> * @date: 2015/12/01 */ var $ = require("jquery"); var handlebars = require("handlebars"); var json2 = require("index"); var vipInfoCombine = null; //用户信息编译模板 var loginInfoCombine = null; //登录信息编译模板 var apiDomain = $('#api-domain').val(); //获取数据的地址 var cartTpl = ''; //购物车模板 /** * 搜寻的时候过滤非法字符(+-/:等非法字符单独出现) * @type {RegExp} */ var reg = /^[\^\!\+\-\(\)\:\[\]\\\{\}\~\*\?\|\&\;\/]{0,}$/g; var keyword = ''; var link = ''; var dataLayer = []; var requestFrame = null; var logoanimationstart = 0; var $logotrans = $('.icon-logo'); var isen = true; var loopdurationtime = 500; var globaltimeout; var onetimeoout; /** * banner和地址的映射 * @type {Object} */ var bannerMap = { listboys: '4f78b0f418fc42314d8b6e791cfb7fa8', listgirls: '00c1f025a51b6b597dc37925951ea27d', listkids: 'b02df11184727701ade1b6de9737d08c', listlifestyle: 'fd35c52dced0c880976ba858346d1fc5', searchboys: '9fb8986ea700cc27a8057361c3924394', searchgirls: 'e3e207a1443ca60c8037fe52a5560c18', searchkids: '620fc77f479da8feaeb06f2324e5d0bb', searchlifestyle: 'a3c93301c6ffaf3ed0f36a4a451be36d', uniquebrandboys: '2ebb0810c0d1a67e5229149c9c3aba7d', uniquebrandgirls: '99e23385f4ba4b65f406b7e2968ac821', uniquebrandkids: 'a74ebc9b17840c91b9ea46568111fe6b', uniquebrandlifestyle: '0e8c81ead53f56302baa4d0ad967f527', brandsboys: '77b352db07129c76a9d532acad149f9f', brandsgirls: 'bf047f16e52ebc38be5ce9c7623831e6', brandskids: 'e3ae1ce9b5e13c6d271ef3eccb831652', brandslifestyle: 'e4ac8029c30f65d7f1af030980d140fe', newboys: '869d3c5f3b450fb52101d00a61ce87cb', newgirls: 'd953b6dfdac02483d1dcce8d96055954', newkids: '0874cb6d75df8e0e78f2d475e53ecc08', newlifestyle: '43e8fc8e178115c262bbce2bd0012db7', saleboys: 'c846e3165c994769b4201d8c32f3ae9b', salegirls: '52b1d389edcbc62d65de71b80c4d6ad0', salekids: 'ad8b1703c761ba00973868ab5199cc27', salelifestyle: '7acc64905c70ac91846f43fb2cec4bbd', homeboys: 'b0856a771ef1b59ab1234c74688fa42d', homegirls: '2bd61fa12e4933211518f70fe5ce3c48', homekids: '895c59e8c64b40399c9533509507320c', homelifestyle: '2e037d4e25d2767352ca3e0a4627f7bd', indexboys: '0c911d3000f52e8ca7cffb74f5864c29', indexgirls: 'b645b8980c423ab30485e0a9d08c2ef7', indexkids: '17f6d5d5d454d2c507bc5fcbc90f7756', indexlifestyle: '735cd393e841762af8793c346abbbc36' }; var cookieMap = {}; var bannerApi = 'http://new.yohobuy.com/common/getbanner?content_code='; $('#api-domain').remove(); //删除信息表单 function getSource(column, postition, event) { try { dataLayer.push({ louceng: column, weizhi: postition, event: event }); } catch (e) {} } window.submitSearch = function() { var $keywordinput = $('#query_key').val(); var $defaultsearch = $('#defaultsearch').val(); var column = 'Search'; var postition = 'Head Search'; var event = 'Search'; var $formatkeyword, $formatkeywordinput; $formatkeyword = $.trim(keyword.toLowerCase()); $formatkeywordinput = $.trim($keywordinput.toLowerCase()); getSource(column, postition, event); if (link !== '' && keyword !== '' && $formatkeyword === $formatkeywordinput) { location.href = link.replace('\'', ''); } else { if (reg.test($keywordinput) && $keywordinput !== '') { location.href = 'http://search.yohobuy.com/error?query=' + $keywordinput + '&result=error'; } else { if ($keywordinput === '') { $('#query_key').val($defaultsearch); } $('#searchForm').submit(); return false; } } }; /** * 增加关键字 * @return {[type]} [description] */ function actionAddKeyWords() { var $keywords = $('#nav_keyword').text(); var defaultsearch = 'vans'; var $querykey = $('#query_key'); if ($keywords !== '') { $querykey.css({ color: '#000' }); $querykey.val($keywords); } else { $querykey.css({ color: '#e0e0e0' }); $querykey.val(defaultsearch); $querykey.on('focus', function(e) { $querykey.css({ color: '#000' }); $querykey.val(''); }); } } /** * 定义购物车扩展 */ function actionGoodsCart() { var defaults = { cookie: '_g', cartNum: '' }; var params = ''; var cartInfo = ''; var queryNum = 0; var listIndex = 0; var tmpList = 0; var totalNum = 0; var text = ''; $.fn.miniCart = function(options) { params = $.extend(defaults, options); if (typeof window.cookie(params.cookie) === 'undefined') { cartInfo = null; } else { if (params.cookie) { try { cartInfo = json2.parse(window.cookie(params.cookie)); } catch (e) { } } } if (cartInfo !== null && cartInfo !== '') { totalNum = parseInt(cartInfo._nac) + parseInt(cartInfo._ac); if (totalNum === 0) { $('#icart-num').attr('class', 'icart-num icart-none'); } else { $('#icart-num').attr('class', 'icart-num'); } $(params.cartNum).html(totalNum); } }; $.fn.search = function(searchDomain) { function getKeywords(obj) { var key = $.trim($(obj).val()); key = key.replace(new RegExp('\'', 'gm'), ''); //去掉特殊字符 if (key === '') { $('.search-list').hide(); return false; } key = encodeURI(key); $.get(searchDomain + '?query=' + key, function(htmlData) { $('.search-list').html(htmlData.data); queryNum = $('.search-list').children('li').length; listIndex = -1; if (queryNum > 0) { $('.search-list').show(); } else { $('.search-list').hide(); } $('.search-list').find('a').hover(function() { $(this).css('background-color', '#eee'); }, function() { $(this).css('background-color', '#fff'); }); }, 'jsonp'); } function getText(obj) { $('.search-list li:eq(' + tmpList + ')').children('a').css('background-color', '#fff'); $('.search-list li:eq(' + listIndex + ')').children('a').css('background-color', '#eee'); text = $('.search-list li:eq(' + listIndex + ')').children('a').attr('title'); $('#query_key').val(text); } return this.each(function() { $(this).keyup(function(event) { if (event.which === 38) { if (queryNum === 0) { return false; } if (listIndex === -1) { listIndex = 0; } tmpList = listIndex; listIndex = (listIndex - 1 + queryNum) % queryNum; getText(this); } else if (event.which === 40) { if (queryNum === 0) { return false; } tmpList = listIndex; listIndex = (listIndex + 1) % queryNum; getText(this); } else if (event.which === 13) { window.submitSearch(); } else { getKeywords(this); } }); }); }; $.extend({ getData: function(domain, options, onSuccess) { var defaults = { page: 1, method: '', v: 1, return_type: 'jsonp', open_key: '12345', tmp: Math.random() }; var params = ''; if (typeof (domain) === undefined || domain === '') { return false; } params = $.extend(defaults, options); params.page = params.page || 1; if (params.method === '') { return false; } try { $.getJSON(domain + '/?callback=?', params, function(_data) { if (onSuccess !== '') { if (typeof onSuccess(_data.data) !== 'undefined') { json2.parse(onSuccess(_data.data)); } return false; } }); } catch (e) { console.log(e.message); } }, getShoppingKey: function() { var shoppingInfo = window.cookie('_g'); var shoppingData = json2.parse(shoppingInfo); var spk; if (typeof shoppingInfo === 'undefined' || shoppingInfo === null) { spk = window.cookie('_SPK'); return spk ? spk : ''; } return shoppingData._k; } }); } /** * 时间戳 * @param {[type]} v1 [description] * @param {[type]} options) { if (v1 [description] * @return {[type]} [description] */ handlebars.registerHelper('timestamp', function() { return new Date().getTime(); }); /** * 头像 * @param {[type]} v1 [description] * @param {[type]} options) { if (v1 [description] * @return {[type]} [description] */ handlebars.registerHelper('headerimg', function(headerimg) { if (headerimg === '') { return 'http://img10.static.yhbimg.com/headimg/2013/11/28/09/01cae078abe5fe320c88cdf4c220212688.gif' + '?imageView/2/w/100/h/100'; } else { return headerimg; } }); /** * 判断等级为3的helper * @param {[type]} v1 [description] * @param {[type]} options) { if (v1 [description] * @return {[type]} [description] */ handlebars.registerHelper('equallevelthree', function(v1, options) { if (v1 === '3') { return options.fn(this); } else { return options.inverse(this); } }); /** * 判断不为'0'的helper * @param {[type]} v1 [description] * @param {[type]} options) { if (v1 [description] * @return {[type]} [description] */ handlebars.registerHelper('notzero', function(v1, options) { if (v1 !== '0') { return options.fn(this); } else { return options.inverse(this); } }); /** * 获取头部banner的回调函数 * @param {[type]} data [description] */ function JsonPCallBack(data) { var topbanner; if (+data.code === 200) { if (typeof data.data === 'object') { if (data.data.url !== '') { topbanner = '<a target="_blank" href="' + data.data.url + '" class="page-top-banner"' + 'style="height:36px;border:none;background-image:url(' + window.unescape(data.data.src) + ');' + 'background-position: center;display:block;"> </a>'; } else { topbanner = '<div class="noticewrapper">' + '<div class="noticecontainer">' + '<h1 class="noticetitle">关于系统升级的公告</h1>' + '<div class="noticecontent">' + '<p class="tips">尊敬的顾客:</p>' + '<p class="detail">您好!为了向您提供更优质的服务,目前系统正在升级,请耐心等待。</p>' + '<p class="detail">' + '系统升级期间,部分地区用户体验会有暂时中断,如遇紧急事宜,欢迎垂询客服热线:400-889-9646 09:00-22:30(周一至周日)。稍后系统将恢复正常' + '</p>' + '<p class="detail">使用,欢迎您继续光顾YOHO!BUY有货!带来不便之处深表歉意,请您谅解!</p>' + '</div>' + '</div>' + '</div>'; } $('body').prepend(topbanner); } } } window.JsonPCallBack = JsonPCallBack; /** * 获得banner数据 * @param {[string]} code [banner对应的编码] * @return {[type]} [description] */ function getBannerData(code) { var script = document.createElement('script'); script.src = bannerApi + code + '&client_type=web&callback=JsonPCallBack'; document.getElementsByTagName('head')[0].appendChild(script); } /** * 显示和隐藏 * @param {[type]} sourceClass [description] * @param {[type]} targetClass [description] * @return {[type]} [description] */ function toggleDisplay(sourceClass, targetClass) { var $that, targetobj; $(sourceClass).hover(function(e) { e.preventDefault(); $that = $(this); targetobj = $(targetClass)[0]; if (targetobj.style.display === '') { $that.addClass('acttags'); targetobj.style.display = 'block'; } else { $that.removeClass('acttags'); targetobj.style.display = ''; } }); } /** * 执行顶部显示和隐藏 * @return {[type]} [description] */ function actionTopTagToggle() { var tags = [{ sourceClass: '.myyoho', targetClass: '.myyoho-info' }, { sourceClass: '.phone', targetClass: '.qr' }], obj, i; for (i = 0; i < tags.length; i++) { obj = tags[i]; toggleDisplay(obj.sourceClass, obj.targetClass); } } /** * 执行顶部群组鼠标交互 * @return {[type]} [description] */ function actionYoHoGroup() { var $this; $('.yohogroup').mouseenter(function() { $this = $(this); $this.text($this.attr('cn')); }); $('.yohogroup').mouseleave(function() { $this = $(this); $this.text($this.attr('en')); }); } /** * 检测是否支持css3的动画 * @return {Boolean} [description] */ function isSupportCss3Animation() { var thisFunc, prefixList = ['webkit', 'moz', 'ms'], i; for (i = 0; i < prefixList.length; i++) { thisFunc = prefixList[i] + 'RequestAnimationFrame'; if (window[thisFunc]) { return true; } else { return false; } } } /** * css3动画 * @param {Array} ) { var thisFunc, prefixList [description] * @return {[type]} [description] */ function requestFrameAct() { var prefixList = ['webkit', 'moz', 'ms']; var func1 = prefixList[0] + 'RequestAnimationFrame'; var func2 = prefixList[1] + 'RequestAnimationFrame'; var func3 = prefixList[2] + 'RequestAnimationFrame'; if (window[func1]) { return function(callback) { requestAnimationFrame(callback); }; } if (window[func2]) { return function(callback) { window[func2](callback); }; } if (window[func3]) { return function(callback) { window[func3](callback); }; } return function(callback) { window.setTimeout(callback, 67); }; } /** * css3动画 * @return {[type]} [description] */ function tsAnimate() { logoanimationstart += 10; $logotrans.css({ transform: 'rotateX(' + logoanimationstart + 'deg)', '-webkit-transform': 'rotateX(' + logoanimationstart + 'deg)', '-moz-transform': 'rotateX(' + logoanimationstart + 'deg)' }); if (logoanimationstart / 90 % 2 === 1) { if (isen) { $logotrans.css('background-image', 'url(http://static.yohobuy.com/newheader/img/logo1.png)'); isen = false; } else { $logotrans.css('background-image', 'url(http://static.yohobuy.com/newheader/img/logo_e.png)'); isen = true; } } if (logoanimationstart / 90 % 2 === 0 && logoanimationstart % 360 !== 0) { window.setTimeout(tsAnimate, 3000); } else { if (logoanimationstart % 360 === 0) { window.setTimeout(tsAnimate, 1 * 60 * 1000); } else { requestFrame(function() { tsAnimate(); }); } } } /** * 淡出 * @return {[type]} [description] */ function fadeAnimate() { if (globaltimeout) { window.clearTimeout(globaltimeout); } $logotrans.fadeOut(loopdurationtime, function() { isen = false; $logotrans.css('background-image', 'url(http://static.yohobuy.com/newheader/img/logo.png)'); $logotrans.fadeIn(loopdurationtime, function() { onetimeoout = window.setTimeout(function() { $logotrans.fadeOut(loopdurationtime, function() { window.clearTimeout(onetimeoout); isen = true; $logotrans.css('background-image', 'url(http://static.yohobuy.com/newheader/img/logo_e.png)'); $logotrans.fadeIn(loopdurationtime, function() { globaltimeout = window.setTimeout(fadeAnimate, 1 * 60 * 1000); }); }); }, 3000); }); }); } /** * 执行头部logo动画 * @return {[type]} [description] */ function actionTopLogoAnimate() { if (isSupportCss3Animation()) { requestFrame = requestFrameAct(); window.setTimeout(tsAnimate, 3000); } else { window.setTimeout(fadeAnimate, 3000); } } window.newArr = []; window.wrapperindex = 0; window.gindex = 0; window.targetArr1 = []; window.targetArr2 = []; window.targetArr3 = []; window.oh1 = 0; window.oh2 = 0; window.oh3 = 0; window.valueIndex = 0; window.nowIndex = 0; window.inner1 = ''; window.inner2 = ''; window.inner3 = ''; window.finalresult = ''; function createNewArray(obj) { var $thirdnavpanel = $(obj); $thirdnavpanel.find('.thirdnavbar').each(function() { var $that = $(this); var $alink = $that.find('a'); var _href = $alink.attr('href'); var hottag = $alink.attr('hot') === 'hot' ? true : false; var objt = {}; if ($that.hasClass('category-title')) { objt = { type: 'title', height: 49, content: $that.text(), index: window.valueIndex, href: _href, hot: false }; } else { objt = { type: 'catlist', height: 36, content: $alink.text(), index: window.valueIndex, href: _href, hot: hottag }; } window.valueIndex++; window.newArr.push(objt); }); } function createWrapper() { var arrlength = window.newArr.length; var i = 0; var objnew = []; var aobj = []; var bobj = []; var cobj = []; var final1 = '', final2 = '', final3 = ''; var a = 0; var b = 0; var c = 0; for (i; i < arrlength; i++) { objnew = window.newArr[i]; if (window.gindex === 0) { window.oh1 = (window.oh1 + objnew.height); if (window.oh1 >= 340 && i !== (arrlength - 1)) { window.targetArr1 = window.newArr.slice(0, objnew.index + 1); window.nowIndex = objnew.index + 1; window.gindex++; } if (i === (arrlength - 1)) { window.targetArr1 = window.newArr.slice(0, arrlength + 1); break; } } if (window.gindex === 1) { window.oh2 = (window.oh2 + objnew.height); if (window.oh2 >= 340 && i !== (arrlength - 1)) { window.targetArr2 = window.newArr.slice(window.nowIndex, objnew.index + 1); window.nowIndex = objnew.index + 1; window.gindex++; } if (i === (arrlength - 1)) { window.targetArr2 = window.newArr.slice(window.nowIndex, arrlength + 1); break; } } if (window.gindex === 2) { window.oh3 = (window.oh3 + objnew.height); if (window.oh3 >= 340 && i !== (arrlength - 1)) { window.targetArr3 = window.newArr.slice(window.nowIndex, objnew.index + 1); window.nowIndex = objnew.index + 1; window.gindex++; break; } if (i === (arrlength - 1)) { window.targetArr3 = window.newArr.slice(window.nowIndex, arrlength + 1); break; } } } for (a; a < window.targetArr1.length; a++) { aobj = window.targetArr1[a] || {}; if (aobj.type === 'title') { window.inner1 = window.inner1 + '<li class="cattitle"><h3><a href="' + aobj.href + '">' + aobj.content + '</a></h3></li>'; } else { if (aobj.hot === true) { window.inner1 = window.inner1 + '<li class="catdetail"><a class="thirdcatelink hot" href="' + aobj.href + '">' + aobj.content + '</a></li>'; } else { window.inner1 = window.inner1 + '<li class="catdetail"><a class="thirdcatelink" href="' + aobj.href + '">' + aobj.content + '</a></li>'; } } } for (b; b < window.targetArr2.length; b++) { bobj = window.targetArr2[b] || {}; if (bobj.type === 'title') { window.inner2 = (window.inner2 + '<li class="cattitle"><h3><a href="' + bobj.href + '">' + bobj.content + '</a></h3></li>'); } else { if (bobj.hot === true) { window.inner2 = (window.inner2 + '<li class="catdetail"><a class="thirdcatelink hot" href="' + bobj.href + '">' + bobj.content + '</a></li>'); } else { window.inner2 = (window.inner2 + '<li class="catdetail"><a class="thirdcatelink" href="' + bobj.href + '">' + bobj.content + '</a></li>'); } } } for (c; c < window.targetArr3.length; c++) { cobj = window.targetArr3[c] || {}; if (cobj.type === 'title') { window.inner3 = (window.inner3 + '<li class="cattitle"><h3><a href="' + cobj.href + '">' + cobj.content + '</a></h3></li>'); } else { if (cobj.hot === true) { window.inner3 = (window.inner3 + '<li class="catdetail"><a class="thirdcatelink hot" href="' + cobj.href + '">' + cobj.content + '</a></li>'); } else { window.inner3 = (window.inner3 + '<li class="catdetail"><a class="thirdcatelink" href="' + cobj.href + '">' + cobj.content + '</a></li>'); } } } if (window.inner1 !== '') { final1 = '<ul class="cate_row1 cate_row">' + window.inner1 + '</ul>'; } if (window.inner2 !== '') { final2 = '<ul class="cate_row2 cate_row">' + window.inner2 + '</ul>'; } if (window.inner3 !== '') { final3 = '<ul class="cate_row3 cate_row">' + window.inner3 + '</ul>'; } window.finalresult = final1 + final2 + final3; $('#' + window.wrapperindex).empty().append(window.finalresult); } function actionNav() { $('.categorywrapper').each(function(index) { window.wrapperindex = $(this).attr('id'); window.newArr = []; window.gindex = 0; window.targetArr1 = []; window.targetArr2 = []; window.targetArr3 = []; window.oh1 = 0; window.oh2 = 0; window.oh3 = 0; window.valueIndex = 0; window.nowIndex = 0; window.inner1 = ''; window.inner2 = ''; window.inner3 = ''; createNewArray($(this).find('.category')); createWrapper(); }); } /** * 获取三级导航的tip图标 * @return {[type]} [description] */ function actionTipPic() { var tipscode = {}; var $contentcode = ''; var $img = ''; var $title = ''; var $link = ''; var logolink = ''; $(document).on('mouseenter', '.sub-nav-item', function() { $contentcode = $(this).find('.showdetail').attr('data-code'); if ($contentcode) { if (!tipscode[$contentcode]) { tipscode[$contentcode] = $contentcode; $img = $(this).find('.showdetail').find('img'); $title = $(this).find('.showdetail').find('.title'); $link = $(this).find('.showdetail').find('a'); $.get(bannerApi + $contentcode + '&width=337&height=250&client_type=web', function(rsdata) { $img.attr('src', rsdata.data.src); $link.attr('href', rsdata.data.url); $title.text(rsdata.data.title); }, 'jsonp'); } } }); logolink = $('.cure').find('.name-cn').find('a').attr('href'); $('.main-link').attr('href', logolink); } function closeCover() { var $cover = $('#cover'); $cover.remove(); } /** * 首次进入有弹窗 * @return {[type]} [description] */ function actionCover() { var gender = window.cookie('_Gender'); var newMask = ''; var windowheight = ''; var selfheight = ''; var containertop; var length = ''; if (window.location.href === 'http://www.yohobuy.com/' && (typeof gender === 'undefined' || gender === '' || gender === null)) { $.get('http://www.yohobuy.com/index/guide', function(data) { newMask = document.createElement('div'); newMask.id = 'cover'; newMask.innerHTML = data; document.body.appendChild(newMask); windowheight = $(window).height(); selfheight = $('.guide-box').height(); containertop = windowheight / 2 - selfheight / 2; length = $('.guide-box .clear').find('li').length; $('.guide-box').css({ width: (200 * length) + 'px', top: containertop + 'px' }); $('#cover').bind('click', function(event) { window.setCookie('_Gender', '1,3', { path: '/', domain: '.yohobuy.com', expires: 90 }); window.setCookie('_Channel', 'boys', { path: '/', domain: '.yohobuy.com', expires: 7 }); closeCover(); }); $('#cover .guide-box .close').bind('click', function(event) { getSource('弹窗', 'CLOSE', 'homepage_man'); window.setCookie('_Gender', '1,3', { path: '/', domain: '.yohobuy.com', expires: 90 }); window.setCookie('_Channel', 'boys', { path: '/', domain: '.yohobuy.com', expires: 7 }); closeCover(); }); $('.boys img , .boys .go').bind('click', function(event) { getSource('弹窗', 'BOYS', 'homepage_man'); window.setCookie('_Gender', '1,3', { path: '/', domain: '.yohobuy.com', expires: 90 }); window.setCookie('_Channel', 'boys', { path: '/', domain: '.yohobuy.com', expires: 7 }); closeCover(); }); $('.girls img, .girls .go').bind('click', function(event) { getSource('弹窗', 'GIRLS', 'homepage_woman'); window.setCookie('_Gender', '2,3', { path: '/', domain: '.yohobuy.com', expires: 90 }); window.setCookie('_Channel', 'girls', { path: '/', domain: '.yohobuy.com', expires: 7 }); }); $('.lifestyle img, .lifestyle .go').bind('click', function(event) { window.setCookie('_Channel', 'lifestyle', { path: '/', domain: '.yohobuy.com', expires: 7 }); getSource('弹窗', 'LIEFSTYLE', 'homepage_lifestyle'); }); $('#cover .guide-box').bind('click', function(event) { event.stopPropagation(); }); }); } } /** * 查询跳转后保留关键字 * @return {[type]} [description] */ function actionAddKeyWords() { var $keywords = $('#nav_keyword').text(); var defaultsearch = $('#defaultsearch').val(); var $querykey = $('#query_key'); if ($keywords !== '') { $querykey.css({ color: '#000' }); $querykey.val($keywords); } else { $querykey.css({ color: '#e0e0e0' }); $querykey.val(defaultsearch); $querykey.on('focus', function(e) { $querykey.css({ color: '#000' }); $querykey.val(''); }); } } /** * cookie 初始化 * @return {[type]} [description] */ function actionInitCookie() { var $cookieGender = window.cookie('_Gender'); var $target = $('.cure'); if (typeof $cookieGender !== 'undefined' && $cookieGender !== '') { window.setCookie('_Gender', 1, { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($target.find('.name-cn a').text() === '男生') { window.setCookie('_Gender', '1,3', { path: '/', domain: '.yohobuy.com', expires: 7 }); window.setCookie('_Channel', 'boys', { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($target.find('.name-cn a').text() === '女生') { window.setCookie('_Gender', '2,3', { path: '/', domain: '.yohobuy.com', expires: 7 }); // window.setCookie('_Channel', 'girls', { // path: '/', // domain: '.yohobuy.com', // expires: 7 // }); } if ($target.find('.name-cn a').text() === '创意生活') { window.setCookie('_Channel', 'lifestyle', { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($target.find('.name-cn a').text() === '潮童') { window.setCookie('_Channel', 'kids', { path: '/', domain: '.yohobuy.com', expires: 7 }); } } /** * 提前设置好频道的cookie */ function setChannelCookie() { $('.first-nav-item').click(function() { var _cookieGender = window.cookie('_Gender'); if (typeof _cookieGender !== 'undefined' && _cookieGender !== '') { window.setCookie('_Gender', 1, { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($(this).find('.name-cn a').text() === '男生') { window.setCookie('_Gender', '1,3', { path: '/', domain: '.yohobuy.com', expires: 7 }); window.setCookie('_Channel', 'boys', { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($(this).find('.name-cn a').text() === '女生') { window.setCookie('_Gender', '2,3', { path: '/', domain: '.yohobuy.com', expires: 7 }); window.setCookie('_Channel', 'girls', { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($(this).find('.name-cn a').text() === '创意生活') { window.setCookie('_Channel', 'lifestyle', { path: '/', domain: '.yohobuy.com', expires: 7 }); } if ($(this).find('.name-cn a').text() === '潮童') { window.setCookie('_Channel', 'kids', { path: '/', domain: '.yohobuy.com', expires: 7 }); } }); } /** * cookie集合 * @type {Object} */ function actionExeCookieMap() { var cookies = document.cookie; var cookiearr = cookies.split(';'); var i; var temparr; var key; for (i = 0; i < cookiearr.length; i++) { temparr = cookiearr[i].split('='); if (typeof temparr[0] !== 'undefined') { key = temparr[0].replace(/\s/g, ''); cookieMap[key] = temparr[1]; } } } /** * 购物车商品数量 * @return {[type]} [description] */ function actionUpdateCartNum() { $('#miniCartBox').miniCart({ cartNum: '.ic-infomation' }); } /** * 加载购物车数据 * @return {[type]} [description] */ function loadCartData() { var shoppingInfo, shoppingData, strK; $.getData(apiDomain, { method: 'open.Shoppingcart.getCartData', shopping_key: $.getShoppingKey() }, function(jsonData) { if (cartTpl === '') { cartTpl = handlebars.compile($('#mini-cart-tpl').html()); } $('#miniCartBox').children('.gobuy-wrapper').html(cartTpl({ carData: jsonData })); if (parseInt($('.ic-infomation').html()) === 0) { $('#miniCartBox .gobuy-wrapper').html('<div class="gobuy-empty">' + '<h3 class="information">您的购物车暂无商品</h3></div>'); } if ($('#miniCartBox .goods-list li').length < 1) { shoppingInfo = window.cookie('_g'); shoppingData = json2.parse(shoppingInfo); if (shoppingData !== null) { strK = '{"_k":"' + shoppingData._k + '","_nac":0' + ',"_ac":0,"_r":0}'; window.setCookie('_g', strK, { path: '/', domain: '.yohobuy.com' }); } $('.ic-infomation').html(0); $('#miniCartBox .gobuy-wrapper').html('<div class="gobuy-empty">' + '<h3 class="information">您的购物车暂无商品</h3></div>'); } }); } /** * 删除购物车数据 * @param {[type]} id [description] * @param {Boolean} isreduce [description] * @return {[type]} [description] */ function delCartGoods(id, isreduce) { $.getData(apiDomain, { method: 'open.Shoppingcart.delone', shopping_key: $.getShoppingKey(), id: id, isreduce: isreduce }, function(jsonData) { var shoppingInfo = window.cookie('_g'); var shoppingData = json2.parse(shoppingInfo); var strK = '{"_k":"' + shoppingData._k + '","_nac":' + jsonData.total_goods_num + ',"_ac":0,"_r":0}'; window.setCookie('_g', strK, { path: '/', domain: '.yohobuy.com' }); loadCartData(); actionUpdateCartNum(); }); } /** * 监听购物车删除 * @return {[type]} [description] */ function actionListenDelCarGoods() { var $delcargoods; var goodsid, cheapest; $(document).on('click', '.goodscardelete', function(e) { $delcargoods = $(this); goodsid = $delcargoods.attr('goodsid'); cheapest = $delcargoods.attr('cheapest'); delCartGoods(goodsid, cheapest); }); } /** * 监听点击更多打折商品 * @return {[type]} [description] */ function actionListenCartMore() { var $morecart; $(document).on('click', '.mycart_i_down', function(e) { $morecart = $(this); $morecart.toggleClass('mycart_i_up'); $('#mycartmore').slideToggle(300); }); } /** * 点击购物车 * @return {[type]} [description] */ function actionClickMiniCartBox() { var $target; var shopcarurl = 'http://www.yohobuy.com/shopping/cart'; $('#miniCartBox').on('click', function(e) { $target = $(e.target); if ($target.hasClass('gobuy')) { window.location.href = shopcarurl; } }); } /** * 显示购物车效果 * @param {Boolean} isShow [description] * @return {[type]} [description] */ function showMiniCart(isShow) { if (isShow === 1) { $('#miniCartBox').addClass('list-cur'); $('.gobuy-wrapper').show(); if (parseInt($('.ic-infomation').html()) !== 0) { $('#miniCartBox .gobuy-wrapper').html('<div class="gobuy-loading">' + '<h3 class="information">加载中,请稍后</h3></div>'); loadCartData(); } else { $('#miniCartBox .gobuy-wrapper').html('<div class="gobuy-empty">' + '<h3 class="information">您的购物车暂无商品</h3></div>'); } } else { $('#miniCartBox').removeClass('list-cur'); $('.gobuy-wrapper').hide(); } } /** * 鼠标购物车的滑入滑出效果 * @return {[type]} [description] */ function actionGoodsCarMouseEffect() { var $target; $('#miniCartBox').mouseenter(function(e) { $target = $(e.target); if ($target.attr('id') === 'miniCartBox' || $target.attr('class') === 'ic-infomation') { showMiniCart(1); } }); $('#miniCartBox').mouseleave(function(e) { showMiniCart(0); }); } /** * 获得banner & 异常通知 * @return {[type]} [description] */ function actionGetBannerAndNotice() { var INDEXKIDS = 'indexkids', INDEXLIFESTYLE = 'indexlifestyle', INDEXBOYS = 'indexboys', INDEXWOMAN = 'indexgirls', UNIQUEBRAND = 'uniquebrand'; var url = window.location.href; var host = window.location.host; var code = ''; var firstarea; if (url.indexOf('search') !== -1) { code = bannerMap['search' + cookieMap._Channel]; } if (url.indexOf('list') !== -1) { code = bannerMap['list' + cookieMap._Channel]; } if (url.indexOf('brands') !== -1) { code = bannerMap['brands' + cookieMap._Channel]; } if (url.indexOf('new') !== -1) { code = bannerMap['new' + cookieMap._Channel]; } if (url.indexOf('sale') !== -1) { code = bannerMap['sale' + cookieMap._Channel]; } if (url.indexOf('home') !== -1) { code = bannerMap['home' + cookieMap._Channel]; } if (url.indexOf('kids') !== -1) { code = bannerMap[INDEXKIDS]; } if (url.indexOf('woman') !== -1 || url.indexOf('girls') !== -1) { code = bannerMap[INDEXWOMAN]; } if (url.indexOf('lifestyle') !== -1) { code = bannerMap[INDEXLIFESTYLE]; } if (url.indexOf('www.yohobuy.com') !== -1 && window.location.pathname === '/') { code = bannerMap[INDEXBOYS]; } firstarea = host.split('.')[0]; if (firstarea !== 'list' && firstarea !== 'search' && firstarea !== 'www' && firstarea !== 'new' && firstarea !== 'item' && firstarea !== 'guang') { code = bannerMap[UNIQUEBRAND + cookieMap._Channel]; } getBannerData(code); //获得banner信息 } function brandSwitch(index) { $('.hot-brands').find('ul').stop().animate({ opacity: 0, 'z-index': 1 }, 200).eq(index).animate({ opacity: 1, 'z-index': 2 }, 200); } /** * 品牌左右切换 * @return {[type]} [description] */ function actionBrandChange() { var activeIndex = 0, swiperLen; if ($('.hot-brands').size() > 0) { swiperLen = $('.hot-brands').find('ul').size(); $('.hot-brands').find('ul').eq(0).css({ opacity: 1, 'z-index': 2 }); $('.brands-control').on('click', '.next', function() { if (activeIndex === swiperLen - 1) { activeIndex = 0; } else { activeIndex++; } brandSwitch(activeIndex); }); $('.brands-control').on('click', '.prev', function() { if (activeIndex === 0) { activeIndex = swiperLen - 1; } else { activeIndex--; } brandSwitch(activeIndex); }); } } /** * 循环检测购物车数量 * @return {[type]} [description] */ function actionLoopUpdCartNum() { setInterval(actionUpdateCartNum, 2000); } /** * 处理模板 * @return {[type]} [description] */ function actionExeTemplate() { var $goodcartempwarpper = $('#goodcartempwarpper'); var resulthtml = ''; if ($goodcartempwarpper) { if ($goodcartempwarpper.html()) { resulthtml = $('#goodcartempwarpper').html().replace(/\\/g, ''); $('#goodcartempwarpper').html(resulthtml); vipInfoCombine = handlebars.compile($('#tmpl-my-login-new').html()); } } } /** * 执行搜索 * @return {[type]} [description] */ function actionSearch() { var searchDomain = 'http://search.yohobuy.com/api/suggest'; $('#query_key').search(searchDomain); } /** * 获取登录状态 * @return {[type]} [description] */ function actionLoginState(_data) { var timestamp = new Date().getTime(); var noLoginHtml = '<span>Hi~</span>[<a href="http://www.yohobuy.com/signin.html" class="list-a login-out ">' + '请登录</a>] ' + '[<a href="http://www.yohobuy.com/reg.html" class="list-a login-out" onclick="">免费注册</a>]'; var loginHtml = '<span>Hi~<a href="http://www.yohobuy.com/home?t=' + timestamp + '">{{user_name}}</a></span> ' + '{{#if islogin}}' + '[<a href="{{logout}}" class="list-a login-out">退出</a>]' + '{{/if}}{{#unless islogin}}' + '[<a href="http://www.yohobuy.com/signin.html" class="list-a login-out">请登录</a>] ' + '[<a href="http://www.yohobuy.com/reg.html" onclick="" class="list-a login-out">免费注册</a>]' + '{{/unless}}'; var $boxObj = $('#loginBox'); var info = window.cookie('_UID'); var name = _data.data.profile_name; var _length = 0; var t = 0; var char = ''; var user = info.split('::'); var userName = user[0] || ' '; var _logout = 'http://www.yohobuy.com/logout_'; var islogin = '1'; var _num = 0; var data = { user_name: name, logout: _logout + _data.data.token + '.html', random: Math.random() }; loginInfoCombine = handlebars.compile(loginHtml); if (typeof info === 'undefined' || info === null) { $boxObj.html(noLoginHtml); return false; } if (typeof user === 'undefined' || user.length < 4) { $boxObj.html(noLoginHtml); return false; } for (t; t < userName.length; t++) { char = userName.substr(t, 1); if (/.*[\u4e00-\u9fa5]+.*$/.test(char)) { _length += 2; } else { _length += 1; } } if (_length <= 10) { name = userName; } else { _num = 0; for (t; t < userName.length; t++) { if (_num < 10) { char = userName.substr(t, 1); if (char !== '*') { if (/.*[\u4e00-\u9fa5]+.*$/.test(char)) { _num += 2; } else { _num += 1; } } name += char; } } if (name.length < userName.length) { name += '...'; } } if (/http:\/\//.test(user[3])) { _logout = user[3].replace('www.yohobuy.com', 'www.yohobuy.com'); } else { _logout = 'http://www.yohobuy.com/logout_' + user[3] + '.html'; } if (_data.result === -1) { islogin = '-1'; } data.islogin = islogin; $boxObj.html(loginInfoCombine(data)); } /** * 获得vip用户信息 * @return {[type]} [description] */ function actionVipInfo(_data) { var vipInfo = _data.data; var headUrl = ''; if (_data.result === 1) { if (typeof vipInfo === undefined || vipInfo.length < 1) { return false; } if (vipInfo.vip.curVipInfo.curLevel === '3') { vipInfo.vip3 = true; } $('#myYohoBox').mouseenter(function() { $(this).addClass('acttags'); $('#myYohoBox .myyoho-info').show().html(vipInfoCombine(vipInfo)); headUrl = $('.myyoho-photo img').attr('data-url'); if ($._checkUrlState === 1) { $('.myyoho-photo').show().find('img').attr('src', headUrl); return; } if (headUrl === '' || $._checkUrl !== '') { return; } $.ajax({ url: headUrl, type: 'GET', complete: function(response) { if (response.status === 200 || response.status === 0) { $('.myyoho-photo').show().find('img').attr('src', headUrl); $._checkUrlState = 1; } $._checkUrl = headUrl; } }); }); $('#myYohoBox').mouseleave(function() { $(this).removeClass('acttags'); $('#myYohoBox .myyoho-info').hide(); }); } } /** * 获取登录信息 * @return {[type]} [description] */ function actionLoginInfo() { var param = { method: 'open.passport.get' }; $.getData(apiDomain, param, function(_data) { if (_data.result !== -1) { actionLoginState(_data); // 更改登录状态 actionVipInfo(_data); //获得vip; } else { window.setCookie('_UID', '', { domain: '.yohobuy.com', expires: -1 }); } }); } /** * 初始化函数 * @return {[type]} [description] */ function init() { actionNav(); //处理导航 actionTipPic(); //鼠标移入后查询 actionExeTemplate(); //处理模板 actionCover(); //初次登录弹框 actionInitCookie(); //初始化cookie setChannelCookie(); //设置频道缓存 actionExeCookieMap(); //格式化cookie actionGoodsCart(); //初始化购物车插件 actionYoHoGroup(); // yoho集团鼠标效果 actionTopTagToggle(); // yoho上部分开关 actionTopLogoAnimate(); //yoho logo动画 actionGetBannerAndNotice(); // 获取banner和服务器维护提示 actionBrandChange(); //切换品牌 actionAddKeyWords(); //跳转后增加关键字 actionGoodsCarMouseEffect(); //鼠标滑入滑出效果 actionUpdateCartNum(); //更新购物车数量 actionLoopUpdCartNum(); //循环检测购物车数量 actionSearch(); //搜索执行 actionClickMiniCartBox(); //点击购物车跳转 actionListenDelCarGoods(); //监听购物车删除 actionListenCartMore(); // actionLoginInfo(); //获取登录信息 actionAddKeyWords(); //增加关键字 } init(); }); define("js/simple-header", ["jquery"], function(require, exports, module){ var $ = require("jquery"); var $apiDom = $('#api-domain'); var apiDomain = $apiDom.val(); //获取数据的地址 $apiDom.remove(); //删除API信息 if ($('.simple-header').size() > 0) { $('.tool-options').on('mouseenter', function() { $(this).find('.tool-select').fadeIn(); }).on('mouseleave', function() { $(this).find('.tool-select').fadeOut(); }); } /** * 格式化用户名 * @return {[type]} [description] */ function formatUsernName(userName) { var name, char, _num = 0, _length = 0, t; for (t = 0; t < userName.length; t++) { char = userName.substr(t, 1); if (/.*[\u4e00-\u9fa5]+.*$/.test(char)) { _length += 2; } else { _length += 1; } } if (_length <= 10) { name = userName; } else { _num = 0; name = ''; for (t = 0; t < userName.length; t++) { if (_num < 10) { char = userName.substr(t, 1); if (char !== '*') { if (/.*[\u4e00-\u9fa5]+.*$/.test(char)) { _num += 2; } else { _num += 1; } } name += char; } } if (name.length < userName.length) { name += '...'; } } return name; } /** * 设置简单头部登陆状态 * @return {[type]} [description] */ function setLoginStatus(data) { var info = data.data, loginHtml, name; if (data.result !== -1) { name = formatUsernName(info.profile_name); loginHtml = '<span>Hi~</span>' + '<a href="http://www.yohobuy.com/home?t=' + info.random + '">' + name + '</a> ' + '<a href="http://www.yohobuy.com/logout_' + info.token + '.html">[退出]</a>'; } else { loginHtml = '<span>Hi~</span> ' + '<a href="http://www.yohobuy.com/signin.html">[请登录]</a> ' + '<a href="http://www.yohobuy.com/reg.html">[免费注册]</a>'; } $('.header-tool li').eq(0).html(loginHtml); } /** * 获取登录信息 * @return {[type]} [description] */ function actionLoginInfo() { var param = { return_type: 'jsonp', method: 'open.passport.get' }; $.getJSON(apiDomain + '/?callback=?', param, function(_data) { if (_data && _data.data) { setLoginStatus(_data.data); } }); } actionLoginInfo(); //获取登录信息 }); define("js/product/entry", ["jquery","handlebars","source-map","lazyload","index"], function(require, exports, module){ /** * 商品页面打包入口文件 * @auhtor: xuqi<qi.xu@yoho.cn> * @date: 2015/12/28 */ require("js/product/list"); require("js/product/brand"); require("js/product/hotrank"); require("js/product/item"); }); define("js/product/list", ["jquery","handlebars","source-map","lazyload"], function(require, exports, module){ /** * 商品列表页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/11/23 */ require("js/product/filter"); require("js/product/sort-pager"); require("js/product/latest-walk"); require("js/product/product"); }); define("js/product/filter", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 商品筛选逻辑 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/4 */ var $ = require("jquery"), Handlebars = require("handlebars"); var checkUnicode = { unchecked: '', checked: '' }, moreUnicode = { up: '', down: '' }; //品牌相关变量 var $brandDefault = $('.brand .default'), $brandInput = $('#brand-search-input'), $brandPanel = $('.brand .brand-panel'), $brandAttrs = $brandPanel.find('.attr'), $brandMore = $('#brand-more'), $brandMulti = $('#brand-multi'), $brandsIndex = $('.brands-index'); var $brandMoreTxt, $brandMoreIcon; //价格相关变量 var $udPrice = $('.ud-price-range'), interReg = /^\d+$/, $limit, $min, $max, $btn; //分类相关变量 var $sortSub = $('.sort-sub-wrap'); //高级选项相关变量 var $seniorSubWrap = $('.senior-sub-wrap'), $seniorAttrWrap = $('.senior-attr-wrap'); var seniorHoverTime, hoveredIndex; // 尺寸 handlebars 模板 var sizeTmpl = '{{# size}}<a class="attr {{#if checked}}checked{{/if}}" href="{{href}}">{{name}}</a>{{/ size}}', sizeCache = {}, // 缓存一下尺寸信息 $sizeWrap = $('.filter-box .size'); sizeTmpl = Handlebars.compile(sizeTmpl); //清除checkbox选中状态[页面默认checked不清空] function clearChecked($checkbox, $checked) { $checkbox.each(function() { if ($(this).closest('.attr').hasClass('checked')) { return; } $(this).removeClass('checked').html(checkUnicode.unchecked); }); $checked.find('.checkbox').addClass('checked').html(checkUnicode.checked); } //显示更多品牌面板 function brandShowMore() { $brandDefault.addClass('hide'); $brandPanel.removeClass('hide'); } //隐藏更多品牌面板 function brandHideMore() { $brandPanel.addClass('hide'); $brandDefault.removeClass('hide'); //清除索引状态 $brandsIndex.children('span').removeClass('hover'); } //url构造&跳转 function uriLoc(attr, val) { var qs = window.queryString(), newHref; qs[attr] = val; newHref = '?' + decodeURIComponent($.param(qs)); window.location.href = newHref; } //隐藏高级选项面板 function hideSeniorPanel(index) { $seniorSubWrap.children('.senior-sub:eq(' + hoveredIndex + ')').addClass('hide'); $seniorAttrWrap.children('.attr:eq(' + hoveredIndex + ')').removeClass('hover'); hoveredIndex = -1; } //屏蔽筛选项双击文字选中 $('.filter-box').on('selectstart', '.attr, .brands-index span', function() { return false; }); //【分类】 $('.sort-pre').on('click', 'li', function() { var $this = $(this), index = $this.index(), id = $this.data('id'); if ($this.hasClass('active')) { // 选中时,再次点击取消选中 $this.removeClass('active'); $sortSub.children(':eq(' + index + ')').addClass('hide'); $sizeWrap.addClass('hide'); return; } $this.siblings('.active').removeClass('active'); $this.addClass('active'); $sortSub.children(':not(.hide)').addClass('hide'); $sortSub.children(':eq(' + index + ')').removeClass('hide'); if (!$sizeWrap.data('load')) { if (sizeCache[id]) { $sizeWrap.find('.attr-content').html(sizeCache[id]); $sizeWrap.removeClass('hide'); } else { $.ajax({ url: '/product/search/sortSize', data: { msort: id } }).then(function(res) { if ($.type(res) === 'array' && res.length) { sizeCache[id] = sizeTmpl({ size: res }); $sizeWrap.find('.attr-content').html(sizeCache[id]); $sizeWrap.removeClass('hide'); } else { $sizeWrap.addClass('hide'); } }); } } }); //【品牌】 if ($brandMore.length > 0) { $brandMoreTxt = $brandMore.children('em'); $brandMoreIcon = $brandMore.children('.iconfont'); } //【品牌】多选 $brandMulti.click(function() { if ($brandPanel.css('display') === 'none') { //显示品牌面板 $brandMore.trigger('click'); } brandShowMore(); $brandPanel.removeClass('hide').addClass('multi'); //显示出checkbox $(this).addClass('hide'); //隐藏更多按钮 $brandMore.addClass('hide'); }); //【品牌】更多 $brandMore.click(function() { var $this = $(this); if ($this.hasClass('more')) { brandHideMore(); $brandMoreTxt.text('更多'); $brandMoreIcon.html(moreUnicode.down); //清空搜索框和搜索结果 $brandInput.val('').trigger('keyup'); } else { brandShowMore(); $brandMoreTxt.text('收起'); $brandMoreIcon.html(moreUnicode.up); } $(this).toggleClass('more'); }); //【品牌】索引 $brandsIndex.on('mouseenter', 'span', function() { var $this = $(this), index = $this.data('index'); if ($this.hasClass('hover')) { return; } setTimeout(function() { $this.siblings('span.hover').removeClass('hover'); $this.addClass('hover'); if ($this.index() === 0) { //全部 $brandAttrs.removeClass('hide'); } else { $brandAttrs.addClass('hide').filter('[data-index=' + index + ']').removeClass('hide'); } }, 120); }); //【品牌】搜索 $brandInput.keyup(function() { var val = $(this).val().toLowerCase(); if (val === '') { $brandAttrs.removeClass('hide'); } else { $brandAttrs.addClass('hide').filter('[data-key*="' + val + '"]').removeClass('hide'); } }); //【品牌】多选确定 $('#brand-multi-ok').click(function() { var val = []; if ($(this).hasClass('dis')) { return; } $brandPanel.find('span.checked').each(function() { val.push($(this).data('id')); }); uriLoc('brand', val.join(',')); }); //【品牌/高级选项】多选取消 $('.multi-select-cancel').click(function() { var $panel = $(this).closest('.multi'); if ($panel.hasClass('brand-panel')) { $brandMulti.removeClass('hide'); //显示多选按钮 $brandMore.trigger('click'); //显示出更多按钮 $brandMore.removeClass('hide'); //清空搜索框和搜索结果 $brandInput.val('').trigger('keyup'); brandHideMore(); } $panel.addClass('hide').removeClass('multi'); clearChecked($panel.find('.checkbox.checked'), $panel.find('.attr.checked')); //清除选中状态 //确定按钮状态恢复dis $(this).siblings('.multi-select-ok').addClass('dis'); }); //【品牌/高级选项】checkbox $('.check-container').on('click', '.attr', function() { var $this = $(this), $check = $this.find('.checkbox'), $btnOk = $this.closest('.brand-panel, .senior-sub').find('.multi-select-ok'); $check.toggleClass('checked'); if ($check.hasClass('checked')) { $check.html(checkUnicode.checked); } else { $check.html(checkUnicode.unchecked); } //更新按钮状态 if ($check.hasClass('checked') || $this.siblings('.attr').find('.checked').length > 0) { $btnOk.removeClass('dis'); } else { $btnOk.addClass('dis'); } }); //【品牌/高级选项】当多选时阻止链接默认跳转 $('.brand, .senior').on('click', '.attr > a', function(e) { if ($(this).closest('.multi').length > 0) { e.preventDefault(); } }); // 已选中的条件,点击不刷新 $('.filter-box').on('click', 'li.checked, a.checked', function(e) { e.preventDefault(); }); //【价格】用户定义价格处理 if ($udPrice.length > 0) { $limit = $udPrice.find('.limit'); $min = $limit.filter('.min'); $max = $limit.filter('.max'); $btn = $udPrice.find('.price-sure'); //【价格】输入 $limit.keyup(function() { var thisPrice = $.trim($(this).val()), isPriInt = interReg.test(thisPrice), intPrice, min, max; if (!isPriInt) { intPrice = parseInt(thisPrice, 10); $(this).val(isNaN(intPrice) ? '' : intPrice); } min = $.trim($min.val()); max = $.trim($max.val()); if (min !== '' || max !== '') { $btn.removeClass('hide'); } else { $btn.addClass('hide'); } }); //【价格】多项查询 $btn.click(function() { var min = $.trim($min.val()), max = $.trim($max.val()), tmp; //对于min大于max的情况,交换位置 if (min !== '' && max !== '' && +min > +max) { tmp = max; max = min; min = tmp; } uriLoc('price', min + ',' + max); }); } //【高级选项】鼠标移入显示子项 $seniorAttrWrap.on('mouseenter', '.attr', function() { var $this = $(this); var index = $this.index(); if ($this.hasClass('no-sub')) { return; } $this.addClass('hover').siblings().removeClass('hover'); $seniorSubWrap.children('.senior-sub:eq(' + index + ')').removeClass('hide').siblings().addClass('hide'); }).on('mouseleave', '.attr', function() { var $this = $(this), index = $this.index(); if ($this.hasClass('no-sub')) { return; } hoveredIndex = index; seniorHoverTime = setTimeout(function() { hideSeniorPanel(); }, 100); }); //【高级选项】多选 $('.senior-sub').on('click', '.multi-select', function() { $(this).closest('.senior-sub').addClass('multi'); }).on('click', '.multi-select-ok', function() { var $btn = $(this), $sub = $btn.closest('.senior-sub'), val = []; if ($btn.hasClass('dis')) { return; } $sub.find('span.checked').each(function() { val.push($(this).data('id')); }); uriLoc($sub.data('attr'), val.join(',')); }).on('mouseenter', function() { clearTimeout(seniorHoverTime); }).on('mouseleave', function() { hideSeniorPanel(); }); }); define("js/product/sort-pager", ["jquery"], function(require, exports, module){ /** * 筛选页和列表页操作banner中的每页N个商品选择逻辑 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/4 */ var $ = require("jquery"); var $countPerPage = $('#count-per-page'), $countChose = $countPerPage.next('ul'); var SLIDETIME = 200; $(document).click(function(e) { if ($(e.target).closest('.page-count').length > 0) { return; } $countChose && $countChose.slideUp(SLIDETIME); }); $countPerPage.click(function() { if ($countChose.css('display') === 'none') { $countChose.slideDown(SLIDETIME); } else { $countChose.slideUp(SLIDETIME); } }); }); define("js/product/latest-walk", ["jquery","handlebars","source-map","lazyload"], function(require, exports, module){ /** * 最近浏览取接口渲染模板 * @author: xuqi<qi.xu@yoho.cn> 8 @date: 2016/1/20 */ var $ = require("jquery"); var Handlebars = require("handlebars"); var lazyLoad = require("lazyload"); var $latestWalkCount = $('#latest-walk-count'); (function() { var tpl; if ($latestWalkCount.length === 0) { return; } tpl = Handlebars.compile($('#latest-walk-tpl').html()); $.ajax({ url: 'http://itemapi.yohobuy.com/item/item/recentreview', dataType: 'jsonp', data: { limit: $latestWalkCount.val() }, success: function(data) { var latestWalk = [], res, i, cur; if (data.code === 200) { res = data.data; //若无最近浏览,请隐藏容器 if (res.length === 0) { $('.latest-walk').addClass('hide'); return; } for (i = 0; i < res.length; i++) { cur = res[i]; latestWalk.push({ href: cur.url, img: cur.pic_url, name: cur.product_name, salePrice: cur.price, marketPrice: cur.market_price }); } if (latestWalk.length > 0) { $('#latest-walk-goods').html(tpl({ latestWalk: latestWalk })); lazyLoad($('#latest-walk-goods .lazy')); } } } }); }()); }); define("js/product/product", ["jquery","lazyload"], function(require, exports, module){ /** *Description: 商品列表页 *Author: chenglong.wang@yoho.cn *Date: 2015/12/2 */ var $ = require("jquery"), lazyLoad = require("lazyload"), productEvent = require("js/common/product-event"); var $goodsContainer = $('.goods-container'), $goodItem = $goodsContainer.find('.good-info'), $goodItemWrapper = $goodsContainer.find('.good-item-wrapper'), $goodInfoMain = $goodsContainer.find('.good-info-main'), $goodSelectColor = $goodsContainer.find('.good-select-color'), $productListNav = $('.product-list-nav'), productList; lazyLoad($('img.lazy')); /** * @description 初始化鼠标移入商品列表弹层效果 * @num 每列存放商品的个数 */ exports.init = function(num) { productList = null; $goodItem.unbind(); productList = productEvent($goodItem, num); /** * @description 构造商品颜色列表的html结构 * @param data 商品颜色的数组,[url: '',src: ''] * @return json {'colorListStr': '', 'ulNum': ''} * */ function createColorList(data, _from) { var colorListStr = '', len = data.length, row = 4, //每列ul放4个li col = Math.ceil(len / row), //需要几**列**ul i, j, index, ulNum = 0; for (i = 0; i < col; i++) { colorListStr += '<ul>'; for (j = 0; j < row; j++) { index = i * row + j; if (index === len) { break; } colorListStr += '<li>' + '<a target="_blank" href="' + data[i * row + j].url + _from + '">' + '<img src="' + data[i * row + j].src + '" data-cover="' + data[i * row + j].coverImg + '" />' + '</a>' + '</li>'; if (j === row - 1) { colorListStr += '</ul>'; ulNum++; } } } if (ulNum < col) { colorListStr += '</ul>'; } return { colorListStr: colorListStr, ulNum: col }; } function removeHtmlFn() { $goodInfoMain.html(''); $goodSelectColor.html(''); $goodItemWrapper.css({ display: 'none' }); } productList.addHandler('MouseEnter', function(event) { var itemMr = 10, //list的右边距 itemMb = 35, //list的下边距 ulStr = '', ulNum, wrapperWidth, diffWidth, wrapperX, wrapperY, wrapperPl, //鼠标移入时弹层的左内边距 wrapperPt, //鼠标移入时弹层的上内边距 containerPt, //商品列表容器的上内边距 _from = event.target.attr('data-from') || ''; $.ajax({ type: 'POST', url: '/product/list/getProductPic', dataType: 'jsonp', jsonp: 'callback', data: { skn: event.target.attr('data-skn') } }).then(function(res) { var data = res.data, colorList = createColorList(data.pics, _from); removeHtmlFn(); ulStr = colorList.colorListStr; //ajax请求的颜色列表 ulNum = colorList.ulNum;//ajax请求的颜色的数量 $goodInfoMain.append(event.targetDuplicate); $goodSelectColor.append($(ulStr)); // 点击收藏商品不需要了 // if (data.isFavorite) { // $goodInfoMain.find('.col-btn').addClass('coled'); // } else { // $goodInfoMain.find('.col-btn').removeClass('coled'); // } wrapperPl = $goodItemWrapper.css('paddingLeft'); wrapperPt = $goodItemWrapper.css('paddingTop'); containerPt = $goodsContainer.css('paddingTop'); wrapperWidth = 10 + (15 + 50) * ulNum + event.targetWidth; //wrapperWidth = $goodItemWrapper.width(); wrapperX = (event.targetX - 1) * (event.targetWidth + itemMr) - (parseInt(wrapperPl) + 1); wrapperY = (event.targetY - 1) * (event.targetHeight + itemMb) + parseInt(containerPt) - (parseInt(wrapperPt) + 1); //todo //event.offsetR表示当前列表距离浏览器右侧边缘的距离 diffWidth = event.offsetR - ((15 + 50) * ulNum + 25); if (diffWidth <= 0) { wrapperX = wrapperX + diffWidth - 25; } $goodItemWrapper.css({ width: wrapperWidth, left: wrapperX, top: wrapperY, display: 'inline-block' }); // 鼠标悬浮获取到商品信息后显示第一张图片 if (data.pics[0] && data.pics[0].src) { $goodInfoMain.find('.good-thumb img').attr('src', data.pics[0].src); } }); }); $goodItemWrapper.mouseleave(function() { removeHtmlFn(); }); }; //鼠标放在颜色列表上效果 $(document).on('hover', '.good-select-color li', function() { var coverImg = $(this).find('img').attr('data-cover'), $coverImg = $(this).closest('.good-item-wrapper').find('.good-detail-img').find('img'); $coverImg.attr('src', coverImg); }); // 后端不做接口,杨阳和产品确认过,点击收藏商品不需要了。2016.2.23 // $goodInfoMain.on('click', '.col-btn', function() { // var $this = $(this); // // $.ajax({ // type: 'POST', // url: '/product/list/changeFavorite', // dataType: 'jsonp', // data: { // skn: $this.closest('.good-info').data('skn'), // isFavorite: $this.hasClass('coled') // } // }).then(function(res) { // if (res.code === 200) { // $this.toggleClass('coled'); // } else if (res.code === 403) { // location.href = 'http://www.yohobuy.com/signin.html?refer=' + encodeURIComponent(location.href); // } // }); // }); // 左侧导航 $productListNav.find('h3').click(function(event) { var $this = $(this).closest('.product-list-nav'); if ($this.hasClass('active')) { $this.find('.sort-child-list').stop(true, true).slideUp(); } else { $this.find('.sort-child-list').stop(true, true).slideDown(); } $this.toggleClass('active'); }); }); define("js/common/product-event", ["jquery"], function(require, exports, module){ /** *Description: 商品自定义事件 *Author: chenglong.wang@yoho.cn *Date: 2015/12/3 */ var $ = require("jquery"); function ProductEvent() { this.handlers = {}; } ProductEvent.prototype = { constructor: ProductEvent, addHandler: function(type, handler) { if (typeof this.handlers[type] === 'undefined') { this.handlers[type] = []; } this.handlers[type].push(handler); }, fire: function(event) { var handlers, i; if (!event.target) { event.target = this; } if (this.handlers[event.type] instanceof Array) { handlers = this.handlers[event.type]; for (i = 0; i < handlers.length; i++) { handlers[i](event); } } }, removeHandler: function(type, handler) { var handlers, i; if (this.handlers[type] instanceof Array) { handlers = this.handlers[type]; for (i = 0; i < handlers.length; i++) { if (handlers[i] === handler) { break; } } handlers.splice(i, 1); } } }; module.exports = function($o, rowWidth) { var pMouseHover = new ProductEvent(); var targetWidth = $o.eq(0).width(), targetHeight = $o.eq(0).height(), winW = $(window).width(); function handleEvent(event) { var $target, targetX = 0, targetY = 0, rowW = rowWidth, activeIndex = 0, $targetDuplicate = '', offsetL = 0, offsetR = 0; switch (event.type) { case 'mouseenter': $target = $(this); $targetDuplicate = $target.clone(); activeIndex = $target.index() + 1; targetX = (activeIndex % rowW) === 0 ? rowW : activeIndex % rowW; targetY = Math.ceil(activeIndex / rowW); offsetL = $target.offset().left; offsetR = winW - (offsetL + targetWidth); pMouseHover.fire({ type: 'MouseEnter', target: $target, targetWidth: targetWidth, targetHeight: targetHeight, targetX: targetX, targetY: targetY, rowWidth: rowW, activeIndex: activeIndex, targetDuplicate: $targetDuplicate, offsetL: offsetL, offsetR: offsetR }); break; case 'mouseleave': pMouseHover.fire({ type: 'MouseLeave' }); break; } } $o.bind('mouseenter', handleEvent); return pMouseHover; }; }); define("js/product/brand", ["jquery"], function(require, exports, module){ /** * 品牌页面 * @auhtor: bikai<kai.bi@yoho.cn> * @date: 2016/1/21 */ var $ = require("jquery"); var $brandFavor = $('#brand-favor'), id = $brandFavor.data('id'); $brandFavor.on('click', function() { $.ajax({ type: 'post', url: '/product/index/favoriteBrand', data: { brandId: id } }).then(function(res) { if (res.code === 200) { if (res.message === 'add') { $brandFavor.find('i').addClass('coled'); } else { $brandFavor.find('i').removeClass('coled'); } } else if (res.code === 403) { location.href = 'http://www.yohobuy.com/signin.html?refer=' + encodeURIComponent(location.href); } }); }); //页面进入更新收藏状态 $.ajax({ type: 'POST', url: '/product/index/isFavoriteBrand', data: { brandId: id } }).then(function(data) { if (data.code === 200) { //已收藏 $brandFavor.find('i').addClass('coled'); } else if (data.code === 404) { //未收藏 $brandFavor.find('i').removeClass('coled'); } }); }); define("js/product/hotrank", ["jquery","handlebars","source-map","lazyload"], function(require, exports, module){ /** * 首页 * @author: liuyue<yue.liu@yoho.cn> * @date: 2015/12/17 */ var $ = require("jquery"), Handlebars = require("handlebars"), lazyLoad = require("lazyload"); require("js/common/slider"); require("js/common/logo-brand"); lazyLoad($('img.lazy')); $('.slide-container').slider(); $('.logo-brand').logoBrand({ showNum: 10, url: $('.logo-brand').data('url') }); /* * 一周热卖 */ (function($) { var floatlayer = $('.hot-week').find('.floatlayer'), sid = $('.hot-cate').find('li').eq(0).data('sid'), weekOffsetTop, source, template, page = 1, hotCateW = 0, weekEnd = false; source = '\{{# list}}' + '<div class="good-info">' + '<div class="item-img">' + '<a class="good-thumb" target="_blank" href="\{{url}}">' + '<img class="lazy" data-original="\{{thumb}}">' + '</a>' + '</div>' + '<div class="good-detail-text">' + '<a target="_blank" href="{{url}}">{{name}}</a>' + '<p class="price">' + '{{# marketPrice}}<span class="market-price">¥{{.}}</span>{{/ marketPrice}} ' + '<span class="sale-price{{#unless marketPrice}}prime-cost{{/unless}}">' + '¥{{salePrice}}</span>' + '</p>' + '</div>' + '</div>' + '{{/ list}}'; //监听滚动事件,控制浮层样式及下拉加载更多 $(window).on('scroll', function() { var maxH = weekOffsetTop + $('.hot-week').outerHeight(), sid; //热卖右侧浮动导航位置 weekOffsetTop = $('.hot-week').offset().top; if ($(this).scrollTop() >= weekOffsetTop - $(window).height() / 2) { if (floatlayer.offset().top + floatlayer.outerHeight() >= maxH) { floatlayer.css({ position: 'absolute', marginTop: 0, top: $('.hot-week').outerHeight() - floatlayer.outerHeight() }); } else { floatlayer.css({ marginTop: -floatlayer.height() / 2 }).stop().animate({ opacity: 1 }, 200, function() { floatlayer.show(); }); } } else { floatlayer.stop().animate({ opacity: 0 }, 200, function() { floatlayer.hide(); }); } if (floatlayer.offset().top >= $(this).scrollTop() + ($(window).height() - floatlayer.outerHeight()) / 2) { floatlayer.css({ position: 'fixed', marginTop: -floatlayer.height() / 2, top: '50%' }); } //下拉加载 if ($(this).scrollTop() >= weekOffsetTop + $('.hot-week').height() - $(window).height()) { if (!weekEnd) { sid = $('.hot-cate').find('li.current').data('sid'); page++; weekEnd = true; //防止多次请求 weekAjax(sid, page); } } }); //热卖横导航及竖导航的超出显示控制 $('.hot-cate').find('li').each(function(i) { var maxW = $('.hot-cate').width(); if (hotCateW <= maxW) { hotCateW = hotCateW + $(this).width(); if (hotCateW >= maxW) { $('.floatlayer').find('li').eq(i).hide().nextAll().hide(); } } }); //热卖横导航点击事件处理 $('.hot-cate').on('click', 'li', function() { var nowIndex = $(this).index(), sid = $(this).data('sid'); if ($(this).hasClass('current')) { return; } //处理current样式 $(this).addClass('current').siblings().removeClass('current'); $('.floatlayer').find('li').removeClass('current').eq(nowIndex).addClass('current'); //返回热卖顶部,110为floor-header所占高度 $('body,html').stop().animate({ scrollTop: weekOffsetTop - 110 }, 500); //调用ajax请求函数,重置page,weekEnd weekAjax(sid); page = 1; }); //热卖右侧悬浮导航点击事件处理 $('.floatlayer').on('click', 'li', function() { var nowIndex = $(this).index(); if ($(this).hasClass('current')) { return; } $('.hot-cate').find('li').eq(nowIndex).trigger('click'); //处理current样式 $(this).addClass('current').siblings().removeClass('current'); $('.hot-cate').find('li').removeClass('current').eq(nowIndex).addClass('current'); }); /* * 热卖内容ajax请求 * param: sid(ajax请求的id), page(ajax请求的页码) */ function weekAjax(sid, page) { var param = {}; if (page) { param = { sid: sid, page: page }; } else { param = { sid: sid }; } $.ajax({ type: 'GET', dataType: 'json', url: '/product/index/getdata', data: param, success: function(res) { var data; if (res.code === 200) { data = { list: res.data }; //mustache渲染数据,并替换原内容 template = Handlebars.compile(source); if (page) { $('.hot-week-list').append(template(data)); floatlayer.css({ position: 'fixed', marginTop: -floatlayer.height() / 2, top: '50%' }); } else { $('.hot-week-list').html(template(data)); } lazyLoad($('img.lazy')); weekEnd = false; } } }); } //热卖中导航current类处理 $('.hot-cate').find('li').eq(0).addClass('current'); $('.floatlayer').find('li').eq(0).addClass('current'); })($); }); define("js/common/slider", ["jquery","lazyload"], function(require, exports, module){ /** * 首页banner轮播 * @author: liuyue(yue.liu@yoho.cn) * @date: 2015/12/04 */ var $ = require("jquery"), lazyLoad = require("lazyload"); (function($) { var Slider = function(element, options) { this.$element = $(element); this.options = $.extend({}, $.fn.slider.defaults, options); this.bigItem = this.$element.find('.slide-wrapper').find('li'); this.smallItem = null; this.len = this.bigItem.size(); this.index = 0; this.timer = null; this.init(); }; Slider.prototype = { init: function() { if (!this.$element) { return; } if (this.len <= 1) { lazyLoad(this.$element.find('img.lazy')); return; } if (!!this.options.pagination) { this.smallItem = $(this.options.pagination).find('li'); } else { this._createPage(); } if (this.options.orient) { this._createOrient(); } this._slideShow(); this._bindEvent(); this._autoplay(); }, _createOrient: function() { var orientHtml = '<div class="slide-switch">' + '<a class="prev" href="javascript:;"><span class="iconfont"></span></a>' + '<a class="next" href="javascript:;"><span class="iconfont"></span></a>' + '</div>'; if (this.$element.find('.slide-switch').length > 0) { return; } this.$element.append(orientHtml); }, _createPage: function() { var pageHtml = '<div class="slide-pagination"><div class="slide-pagination-inner">' + '<div class="slide-shade"></div><div class="slide-pagination-last">', i = 0; if (this.len <= 1) { return; } for (i = 0; i < this.len; i++) { pageHtml += '<span></span>'; } pageHtml += '</div></div></div>'; this.$element.append($(pageHtml)); this.smallItem = this.$element.find('.slide-pagination-inner span'); }, _bindEvent: function() { var that = this; this.$element.find('.slide-switch').on('click', '.next', function() { that._nextSlide(); clearInterval(that.timer); that.timer = setInterval(function() { that._nextSlide(); }, that.options.time); }).on('click', '.prev', function() { that._prevSlide(); clearInterval(that.timer); that.timer = setInterval(function() { that._nextSlide(); }, that.options.time); }); this.smallItem.on('mouseenter', function() { that.index = $(this).index(); clearInterval(that.timer); that._slideShow(); }).on('mouseleave', function() { that._autoplay(); }); this.$element.on('mouseenter', function() { $(this).find('.slide-switch').addClass('show'); }).on('mouseleave', function() { $(this).find('.slide-switch').removeClass('show'); }); }, _nextSlide: function() { if (this.index === this.len - 1) { this.index = 0; } else { this.index++; } this._slideShow(); }, _prevSlide: function() { if (this.index === 0) { this.index = this.len - 1; } else { this.index--; } this._slideShow(); }, _slideShow: function() { var $img = this.bigItem.eq(this.index).find('img.lazy'); //未加载图片的及时显示 if ($img.attr('src') !== $img.data('original')) { lazyLoad($img, { event: 'sporty' }); $img.trigger('sporty'); } this.smallItem.eq(this.index).addClass('focus').siblings().removeClass('focus'); this.bigItem.eq(this.index).show().stop().animate({ opacity: 1 }, function() { //修正IE下切换时文字会重叠的问题 $(this).find('.slide-tips > p').removeClass('hide'); }).siblings().stop().animate({ opacity: 0 }, function() { $(this).hide().find('.slide-tips > p').addClass('hide'); }); }, _autoplay: function() { var that = this; clearInterval(this.timer); this.timer = setInterval(function() { that._nextSlide(); }, this.options.time); } }; $.fn.slider = function(option) { return this.each(function() { var $this = $(this), data = $this.data('Slider'), options = typeof option === 'object' && option; if (!data) { $this.data('Slider', (data = new Slider(this, options))); } if (typeof option === 'string') { data[option](); } }); }; $.fn.slider.Constructor = Slider; $.fn.slider.defaults = { time: 5000, orient: true, //左右切换箭头的显示 pagination: null }; })($); }); define("js/common/logo-brand", ["jquery","handlebars","source-map","lazyload"], function(require, exports, module){ /** * 首页优选品牌js * @author: liuyue(yue.liu@yoho.cn) * @date: 2015/12/08 */ var $ = require("jquery"), Handlebars = require("handlebars"), lazyLoad = require("lazyload"); (function($) { var LogoBrand = function(element, options) { this.$element = $(element); this.options = $.extend({}, $.fn.logoBrand.defaults, options); this.init(); }; LogoBrand.prototype = { init: function() { this.$element.addClass('logos-' + this.options.showNum); this._sendRequest(); }, _createHelper: function() { var showNum = this.options.showNum; Handlebars.registerHelper('brandList', function(items, options) { var out = '<ul>', i = 0, item = null, fillNum = 0; //不是每页显示个数的倍数,填充数据 if (items.length % showNum !== 0) { fillNum = showNum - (items.length % showNum); for (i = 0; i < fillNum; i++) { items.push({ href: 'javascript:;', img: '' }); } } for (i = 0; i < items.length; i++) { item = options.fn(items[i]); if (i % showNum === 5 || i === 5) { //插入切换按钮的位置 out = out + '<li class="logo-brand-switch" data-page="' + Math.floor(i / showNum) + '">' + '<a class="prev iconfont" href="javascript:;"></a>' + '<a class="next iconfont" href="javascript:;"></a></li>' + '<li data-page="' + Math.floor(i / showNum) + '">' + item + '</li>'; } else if (i !== 0 && i % showNum === 0) { //插入more的位置,more占的是下一页第一个brand的位置,所以page是i/17 out = out + '<li class="brand-more" data-page="' + Math.floor(i / (showNum + 1)) + '">' + '<a href="javascript:;" target="_blank">MORE ></a></li>' + '<li data-page="' + Math.floor(i / showNum) + '">' + item + '</li>'; } else { out = out + '<li data-page="' + Math.floor(i / showNum) + '">' + item + '</li>'; } } //加上最后一个more, more占的是下一页第一个brand的位置,这里已经循环不到brand,所以加在末尾 return out + '<li class="brand-more" data-page="' + Math.floor(i / (showNum + 1)) + '">' + '<a href="javascript:;" target="_blank">MORE ></a></li></ul>'; }); }, _sendRequest: function() { var that = this; $.ajax({ type: 'GET', url: that.options.url, dataType: 'json', success: function(data) { var brandTpl, brandHtml; if (!data || data.length === 0) { return; } that._createHelper(); brandHtml = '\{{#brandList logoBrand}}' + '<a href="\{{href}}" target="_blank"><img class="lazy" data-original="\{{img}}" alt=""></a>' + '\{{/brandList}}'; brandTpl = Handlebars.compile(brandHtml); that.$element.html(brandTpl(data)); that.$element.find('.brand-more a').attr('href', data.moreBrand); lazyLoad(that.$element.find('img.lazy')); that._bindEvent(); } }); }, _brandShow: function(hidePage, showPage) { var that = this; lazyLoad($('li[data-page=' + showPage + ']').find('img.lazy').trigger('appear')); that.$element.find('li[data-page=' + hidePage + ']').find('img').fadeOut('normal', function() { that.$element.find('li').hide(); that.$element.find('li[data-page=' + showPage + ']').show().find('img').fadeIn(); }); }, _bindEvent: function() { var that = this; that.$element.on('click', '.next', function() { var page = $(this).parent().data('page'), nextPage = 0, totalPage = Math.ceil(that.$element.find('li').size() / (that.options.showNum + 2)) - 1; if (page === totalPage) { nextPage = 0; } else { nextPage = page + 1; } that._brandShow(page, nextPage); }); that.$element.on('click', '.prev', function() { var page = $(this).parent().data('page'), prevPage = 0, totalPage = Math.ceil(that.$element.find('li').size() / (that.options.showNum + 2)) - 1; if (page === 0) { prevPage = totalPage; } else { prevPage = page - 1; } that._brandShow(page, prevPage); }); } }; $.fn.logoBrand = function(option) { return this.each(function() { var $this = $(this), data = $this.data('LogoBrand'), options = typeof option === 'object' && option; if (!data) { $this.data('LogoBrand', (data = new LogoBrand(this, options))); } if (typeof option === 'string') { data[option](); } }); }; $.fn.logoBrand.Constructor = LogoBrand; $.fn.logoBrand.defaults = { showNum: 16, url: '/boys/getBrand' }; })($); }); define("js/product/item", ["jquery","lazyload","handlebars","source-map","index"], function(require, exports, module){ /** * 商品详情页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/23 */ var $ = require("jquery"), lazyLoad = require("lazyload"), Handlebars = require("handlebars"), JSON2 = require("index"); var $imgShow = $('#img-show'), $thumbs = $('#thumbs > .thumb-wrap'); var $size = $('#sizes'), $sizes = $size.children('.size'), $sizeWarn = $size.find('.size-warn'), $colorSizeTip = $size.children('.color-size-tip'); var $num = $('#num'), $plusNum = $('#plus-num'), $minusNum = $('#minus-num'); var $addToCart = $('#add-to-cart'), $soldOut = $('#sold-out'); var $lcContainer = $('.lc-container'), $itemBuy = $('.item-buy'); var $descColor = $('#desc-color'); var thumbsLoaded = {}; var $main = $('.main'), id = $main.data('id'); var maxStock = -1; //记录当前选中的颜色-尺码的库存量,若为-1,代表未选择尺码 var SLIDETIME = 200; var colTxt = { def: '收藏商品', coled: '已收藏', hover: '取消收藏' }; var Alert = require("js/common/dialog").Alert; require("js/product/latest-walk"); require("js/common/share"); function imgShow(src) { $imgShow.attr('src', src); } /** * 获取当前选择的商品数目 * @return [Number] */ function getNum() { return +$num.text(); } //重置Num显示为1 function resetNum() { $num.text('1'); //+-按钮状态重置 if (maxStock === 1 || maxStock === 0) { //数目为1/0时 $plusNum.addClass('dis'); $minusNum.addClass('dis'); } else { $plusNum.removeClass('dis'); $minusNum.addClass('dis'); } } //加入购物车和已售罄状态控制 function switchBtnStatus($color) { if ($itemBuy.length === 0) { //全部售罄,按钮状态不变 return; } //选中的商品存量为0或者某个颜色的total为0 if (maxStock === 0 || ($color && ~~$color.data('total') === 0)) { $itemBuy.addClass('hide'); //隐藏加入购物车、即将开始、立即购买等相同位置的按钮 $soldOut.removeClass('hide'); } else { //包括默认的-1情况下 $itemBuy.removeClass('hide'); $soldOut.addClass('hide'); } } //size warn function showSizeWarn() { $sizes.not('.hide').children('.size-warn').removeClass('hide'); } //size title (function() { var $sizeTitleJson = $('#size-title-json'), jsonHtml = $sizeTitleJson.html(), sizeTitle; if (jsonHtml === '') { return; } sizeTitle = JSON2.parse(jsonHtml); //数据获取后删除 $sizeTitleJson.remove(); $sizes.children('li').each(function() { var $this = $(this), key = $this.data('name'); $this.data('title', sizeTitle[key]); }); }()); //初始化thumbsLoaded thumbsLoaded[$('.colors .focus').index()] = true; //品牌收藏 $('#brand-favour').click(function() { var $this = $(this); $.ajax({ type: 'POST', url: '/product/index/favoriteBrand', data: { brandId: $this.data('id') } }).then(function(data) { if (data.code === 200) { $this.toggleClass('coled'); } else if (data.code === 403) { location.href = data.data.url; } }); }); //颜色 $('.colors').on('click', 'li', function() { var $this = $(this), index = $this.index(); var $imgs; //初始化color-size显示或隐藏 $colorSizeTip.addClass('hide'); //隐藏尺码提示 $sizeWarn.addClass('hide'); maxStock = -1; if ($this.hasClass('focus')) { //已获取焦点的颜色再次点击,清除尺码的选中 $sizes.eq(index).children('li').removeClass('focus'); } else { //未获取焦点,选择尺码 $this.siblings('.focus').removeClass('focus'); $this.addClass('focus'); //切换图片显示 $thumbs.not('.hide').addClass('hide'); $imgs = $thumbs.eq(index).removeClass('hide').find('img'); if (typeof thumbsLoaded[index] === 'undefined') { //trigger layLoad lazyLoad($imgs, { event: 'sporty' }); $imgs.trigger('sporty'); thumbsLoaded[index] = true; } imgShow($imgs.first().data('shower')); //切换详细信息的颜色显示 $descColor.text($this.data('color')); //切换尺码显示 $sizes.not('.hide').addClass('hide'); $sizes.eq(index).removeClass('hide').children('li').removeClass('focus'); } resetNum(); switchBtnStatus($this); }); //缩略图鼠标移入显示 $('#thumbs').on('mouseenter', '.thumb', function() { imgShow($(this).data('shower')); }); //尺码 $size.on('click', 'li', function() { var $this = $(this); if ($this.hasClass('focus')) { return; } maxStock = +$this.data('num'); $this.siblings('.focus').removeClass('focus'); $this.addClass('focus'); $colorSizeTip.html($this.data('title')).removeClass('hide'); $sizeWarn.addClass('hide'); switchBtnStatus(); resetNum(); }).on('click', '.size-ruler', function() { //尺码帮助 $('body,html').animate({ scrollTop: $('.size-info').offset().top }, 300); }); //数量 $plusNum.click(function() { var num = getNum(); if ($(this).hasClass('dis')) { return; } if (maxStock === -1) { showSizeWarn();//显示选择尺码提示 return; } //已售罄 if (maxStock === 0) { return; } if (num === maxStock - 1) { //+按钮不可点 $(this).addClass('dis'); } //数目为1时点+则移除-不可点状态 if (num === 1) { $minusNum.removeClass('dis'); } $num.text(num + 1 > maxStock ? maxStock : num + 1); }).on('selectstart', function() { return false; }); $minusNum.click(function() { var num = getNum(); if ($(this).hasClass('dis')) { return; } if (num === 2) { $(this).addClass('dis'); } if (num === maxStock) { //恢复+可点 $plusNum.removeClass('dis'); } $num.text(num - 1 < 0 ? 0 : num - 1); }).on('selectstart', function() { return false; }); //限购码 $('.get-lc:not(.dis)').hover(function() { $lcContainer.removeClass('hide'); }, function() { $lcContainer.addClass('hide'); }); //加入购物车 $addToCart.click(function() { if (maxStock === -1) { showSizeWarn(); return; } $.ajax({ type: 'POST', url: '/cart/index/add', data: { productSku: $('.size li.focus').data('sku'), buyNumber: getNum() } }).then(function(data) { var code = data.code; if (code === 200) { $('#type-chose').slideUp(SLIDETIME); $('#balance').slideDown(SLIDETIME); $('#cart-num').text(data.data.goods_count); //更新数目 } }); }); //收藏 $('#collect-product').click(function() { var $this = $(this), cancel; if ($this.hasClass('coled')) { cancel = true; } $.ajax({ type: 'POST', url: '/product/item/togglecollect', data: { productId: id, type: cancel ? 'cancel' : 'add' } }).then(function(data) { var code = data.code; if (code === 200) { $this.toggleClass('coled'); if (cancel) { $this.find('em').text(colTxt.def); } else { $this.find('em').text(colTxt.coled); } } else if (code === 403) { location.href = data.data.url; } }); }).hover(function() { var $this = $(this); if ($this.hasClass('coled')) { $this.find('em').text(colTxt.hover); } }, function() { var $this = $(this); if ($this.hasClass('coled')) { $this.find('em').text(colTxt.coled); } }); //继续购物 $('#keep-shopping').click(function() { $('#type-chose').slideDown(SLIDETIME); $('#balance').slideUp(SLIDETIME); }); //立即购买 $('#buy-now').click(function() { var sku, base, myAlert; if (maxStock === -1) { showSizeWarn(); return; } if ($(this).hasClass('dis')) { return; } base = $(this).data('base'); //潮流尖货 if (!base) { myAlert = new Alert('打开APP可抢购该商品哦~~'); myAlert.show(); return; } sku = $sizes.find('.focus').data('sku'); if (sku && base) { location.href = base + '?product_sku=' + sku; } }); //按钮鼠标移入效果【dis状态的按钮状态不变】 $('.buy-btn').mouseover(function() { if ($(this).hasClass('dis')) { return; } $(this).addClass('hover'); }).mouseleave(function() { $(this).removeClass('hover'); }); //商品详情/材质洗涤切换 $('.description-material').on('click', '.title', function() { var $this = $(this), index = $this.index(); var $description = $('.description-content'), $material = $('.material-content'); if ($this.hasClass('cur')) { return; } $this.addClass('cur'); $this.siblings('.cur').removeClass('cur'); if (index === 0) { //商品信息 $description.slideDown(SLIDETIME); $material.slideUp(SLIDETIME); } else { $description.slideUp(SLIDETIME); $material.slideDown(SLIDETIME); } }); //售后服务 $('.after-service-switch').click(function() { var $this = $(this), $content = $this.next('.after-service-content'); var html = { def: '', spread: '' }; if ($content.css('display') === 'none') { $content.slideDown(SLIDETIME); $this.find('.triangle').html(html.spread); } else { $content.slideUp(SLIDETIME); $this.find('.triangle').html(html.def); } }); //商品详情区的热点 $.ajax({ type: 'GET', url: '/product/item/hotarea', data: { productId: id } }).then(function(html) { $('#details-html').prepend(html); //Bind Hover event $('.hot-point').hover(function() { $(this).addClass('hover'); }, function() { $(this).removeClass('hover'); }); }); //商品详情懒加载 lazyLoad($('#details-html img')); //只有一个尺码(多个或一个颜色)时默认选中 (function() { var hasOnlyOneSize = true, i; for (i = 0; i < $sizes.length; i++) { if ($sizes.eq(i).find('li').length !== 1) { hasOnlyOneSize = false; break; } } if (hasOnlyOneSize) { $sizes.find('li').click(); } }()); //咨询和评价 (function() { var commentPage = 1, consultPage = 1; var commentsTpl = Handlebars.compile($('#comments-tpl').html()), consultsTpl = Handlebars.compile($('#consults-tpl').html()); var $commentsUl = $('#comments-ul'), $consultsUl = $('#consults-ul'); var $commentNum = $('.comment-num'), $consultNum = $('.consult-num'); //购买评价 function loadComments() { $.ajax({ type: 'GET', url: '/product/item/comments', data: { productId: id, page: commentPage } }).then(function(data) { var res; if (data.code === 200) { res = data.data; if (res.length === 0) { $commentsUl.next('.more-wrap').addClass('hide'); return; } //更新总数显示 $commentNum.text(res[0].total); $commentsUl.append(commentsTpl({ comments: res })); commentPage++; } }); } //顾客咨询 function loadConsults() { $.ajax({ type: 'GET', url: '/product/item/consults', data: { productId: id, page: consultPage } }).then(function(data) { var res; if (data.code === 200) { res = data.data; if (res.length === 0) { $consultsUl.next('.more-wrap').addClass('hide'); return; } //更新总数显示 $consultNum.text(res[0].total); $consultsUl.append(consultsTpl({ consults: res })); consultPage++; } }); } //评价和咨询切换 $('.consult-comment').on('click', '.title', function() { var $this = $(this), index = $this.index(); var $comments = $('.comments'), $consults = $('.consults'); if ($this.hasClass('cur')) { return; } $this.addClass('cur'); $this.siblings('.cur').removeClass('cur'); if (index === 0) { //咨询 $consults.slideDown(SLIDETIME); $comments.slideUp(SLIDETIME); } else { $consults.slideUp(SLIDETIME); $comments.slideDown(SLIDETIME); } }).on('click', '.load-more', function() { var $this = $(this); if ($this.hasClass('load-more-comments')) { loadComments(); } else { loadConsults(); } }); //我要咨询 $('#consults-btn').click(function() { //TODO:点击我要资讯的时候更新验证码显示 $('.new-consult').removeClass('hide'); $('.consult-success').addClass('hide'); }); //提交咨询 $('#submit-consult').click(function() { var $this = $(this), $parent = $this.closest('.new-consult'), $textarea = $parent.find('.my-consult'), content = $.trim($textarea.val()); var $consultWarn = $parent.find('.consult-warn'); var pass = true; if (content === '') { $textarea.addClass('error'); $consultWarn.removeClass('hide'); pass = false; } else { $textarea.removeClass('error'); $consultWarn.addClass('hide'); } if (pass === false) { return; } $.ajax({ type: 'POST', url: '/product/item/addconsult', data: { productId: id, content: content } }).then(function(data) { var code = data.code; if (code === 200) { $parent.addClass('hide'); $parent.siblings('.consult-success').removeClass('hide'); //清空输入 $textarea.val(''); } else if (code === 403) { //跳转登录页 location.href = data.data.url; } }); }); loadComments(); loadConsults(); }()); }); define("js/common/dialog", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 弹框公共组件 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/2/24 */ var $ = require("jquery"), Handlebars = require("handlebars"); var defaultOptions = { mask: true, closeIcon: true }; var tpl = '<div class="yoho-dialog {{className}} hide">' + '{{#if closeIcon}}' + '<span class="close">' + '<i class="iconfont"></i>' + '</span>' + '{{/if}}' + '<div class="content">' + '{{{content}}}' + '</div>' + '<div class="btns">' + '{{# btns}}' + '<span {{#if id}}id="dialog-{{id}}"{{/if}} class="btn{{#each btnClass}} {{.}}{{/each}}">' + '{{name}}' + '</span>' + '{{/ btns}}' + '</div>' + '</div>'; var tplFn = Handlebars.compile(tpl); //背景蒙版 function createMask() { if ($('.body-mask').length === 0) { $('body').append('<div class="body-mask hide"></div>'); } return $('.body-mask').css({ height: $(document).height(), width: $(document).width() }); } function createDialog(data) { $('body').append(tplFn(data)); return $('.yoho-dialog'); } function Dialog(options) { var opt = $.extend({}, defaultOptions, options); var that = this, i; if (opt.mask) { that.$mask = createMask(); } that.$el = createDialog(opt); //绑定x关闭事件 that.$el.find('.close').click(function() { that.close(); }); function bindBtnEvt(index) { that.$el.find('#dialog-' + opt.btns[index].id).on('click', function() { opt.btns[index].cb && opt.btns[index].cb(); }); } //绑定按钮事件 if (!!opt.btns) { for (i = 0; i < opt.btns.length; i++) { bindBtnEvt(i); } } } Dialog.prototype.close = function() { this.$mask && this.$mask.addClass('hide'); this.$el.remove(); }; Dialog.prototype.show = function() { this.$mask && this.$mask.removeClass('hide'); this.$el.removeClass('hide').css({ 'margin-top': -this.$el.height() / 2, 'margin-left': -this.$el.width() / 2 }); }; exports.Dialog = Dialog; //Alert function Alert(content) { var that = this; var option = { content: content, className: 'alert-dialog', btns: [ { id: 'alert-sure', btnClass: ['alert-sure'], name: '确定', cb: function() { that.close(); } } ] }; Dialog.call(this, option); } Alert.prototype = new Dialog(); Alert.prototype.constructor = Alert; exports.Alert = Alert; //Confirm function Confirm(opt) { var that = this; var option = { content: opt.content, className: 'confirm-dialog', btns: [ { id: 'confirm-sure', btnClass: ['confirm-sure'], name: '确定', cb: opt.cb }, { id: 'confirm-cancel', btnClass: ['confirm-cancel'], name: '取消', cb: function() { that.close(); } } ] }; Dialog.call(this, option); } Confirm.prototype = new Dialog(); Confirm.prototype.constructor = Confirm; exports.Confirm = Confirm; }); define("js/common/share", ["jquery"], function(require, exports, module){ /** * 分享 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/3/1 */ var $ = require("jquery"); function shareBase(options) { var openUrl = ''; var defOption = { title: '', url: window.location.href, weixinUrl: '', image: '', desc: '', channel: '' }; var shareChannels = ['weibo', 'tweibo', 'qzone', 'renren', 'qq', 'douban','weixin']; var sharebox; var shareCon = '<em><i></i></em>'; defOption = $.extend(defOption, options); if ($.inArray(defOption.channel, shareChannels) === -1) { alert('不存在的分享平台!'); return false; } switch (defOption.channel) { case 'weibo': openUrl = 'http://service.weibo.com/share/share.php?url=' + defOption.url + '&title=' + defOption.title + '&appkey=3739328910&searchPic=true&pic=' + defOption.image; break; case 'tweibo': openUrl = 'http://share.v.t.qq.com/index.php?c=share&a=index&url=' + defOption.url + '&title=' + defOption.title + '&appkey=c0af9c29e0900813028c2ccb42021792&pic=' + defOption.image; break; case 'qzone': openUrl = 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + defOption.url + '&title=' + defOption.title + '&desc=&summary=' + defOption.desc + '&site=YOHO!有货&pics=' + defOption.image; break; case 'renren': openUrl = 'http://widget.renren.com/dialog/share?resourceUrl=' + defOption.url + '&srcUrl=' + defOption.url + '&desc=' + defOption.desc + '&title=' + defOption.title + '&description=' + defOption.desc + '&pic=' + defOption.image; break; case 'qq': openUrl = 'http://connect.qq.com/widget/shareqq/index.html?url=' + defOption.url + '&desc=' + defOption.desc + '&title=' + defOption.title.replace('%', '') + '&desc=&summary=' + defOption.desc + '&site=YOHO!有货&pics=' + defOption.image; break; case 'weixin': openUrl = 'http://s.jiathis.com/qrcode.php?url=' + defOption.weixinUrl + '&desc=' + defOption.desc + '&title=' + defOption.title + '&description=' + defOption.desc + '&pic=' + defOption.image; break; case 'douban': openUrl = 'http://www.douban.com/share/service?href=' + defOption.url + '&text=' + defOption.desc + '&image=' + defOption.image + '&title=' + defOption.title + '&comment='; break; } if (defOption.channel === 'weixin') { if (!defOption.self) { return; } sharebox = defOption.self.closest('.share-to').find('.weixin-share-box'); if (sharebox.length > 0) { shareCon += '<div class="con"><h2>分享到微信朋友圈</h2><p class="pic">' + '<img src="' + openUrl + '" /></p><p class="w">打开微信,点击底部得“发现”,使用<br/>“扫一扫“即可将网页分享到我的朋友圈。</p>' + '<a href="javascript:void(0)" class="close">x</a></div>'; sharebox.find('div').length > 0 ? sharebox.show() : sharebox.html(shareCon).show(); sharebox.find('.close').click(function() { $(this).closest('.weixin-share-box').hide(); }); } } else { window.open(encodeURI(openUrl)); } } function share(channel, self) { var title = document.title.replace(/(^\s*)|(\s*$)/g, ''); var desc = $('#share-desc').val(); var image = $('#share-img').val(); var weixinUrl = $('#weixin-url').val(); if (channel === 'weibo' || channel === 'tqq') { shareBase({ channel: channel, title: title, image: image }); } else { shareBase({ channel: channel, title: title, desc: desc, image: image, self: self, weixinUrl: weixinUrl }); } } $('.share-wrapper').on('click', 'i', function() { var $el = $(this), type = $el.data('type'); if (type === 'weixin') { share(type, $el); } else { share(type); } }); }); define("js/index/index", ["jquery","lazyload","handlebars","source-map"], function(require, exports, module){ /** * 首页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/11/23 */ var $ = require("jquery"), lazyLoad = require("lazyload"), homePage = $('.home-page').data('page'), brandUrl = $('.logo-brand').data('url'); require("js/common/slider"); require("js/common/slider2"); require("js/common/logo-brand"); require("js/common/accordion"); $(document).on('mouseenter', '.imgopacity a img', function() { $(this).css('opacity', 0.8); }); $(document).on('mouseout', '.imgopacity a img', function() { $(this).css('opacity', 1); }); if ($.inArray(homePage, ['boys','girls','kids','lifestyle']) > -1) { require("js/common/new-arrivls")({ type: homePage, url: '/common/getNewArrival', count: (homePage === 'boys') || (homePage === 'lifestyle') ? 5 : 4, rows: [5,3] }); window.setCookie('_Channel', homePage, { domain: '.yohobuy.com', path: '/', expires: 365 }); } lazyLoad($('img.lazy')); if (homePage === 'boys') { $('.slide-container').slider({ pagination: '.thumb-pagination' }); } else { $('.center-col').slider(); $('.slide-container').slider(); } if (homePage === 'boys') { $('.logo-brand').logoBrand({ url: brandUrl }); $('.img-brand').slider2(); } else { $('.logo-brand').logoBrand({ showNum: 10, url: brandUrl }); $('.img-slider-wrapper').slider2(); } }); define("js/common/slider2", ["jquery"], function(require, exports, module){ /** * (品牌优选)图片幻灯片插件 * @author: wangqing(robin.wang@yoho.cn) * @date: 205/7/2 */ var $ = require("jquery"); (function($) { $.fn.slider2 = function(options) { function autoplay(index, limit, toright) { if (toright === true) { $('.next').trigger('click'); if (index === (limit - 3)) { autoplayrecycle(--index, limit, false); } else { autoplayrecycle(++index, limit, true); } } else { $('.prev').trigger('click'); if (index === 0) { autoplayrecycle(++index, limit, true); } else { autoplayrecycle(--index, limit, false); } } } function autoplayrecycle(index, limit, toright) { window.setTimeout(autoplay, $.fn.slider2.defaults.delaytime, index, limit, toright); } function changePic(index, width, callback) { var offersetleft = -(index * width); $('.img-list') .animate({ 'margin-left': offersetleft + 'px' }, 'slow', callback); } $.fn.slider2.defaults = { index: 0, shownum: 3, autoplay: false, delaytime: 3000 }; return this.each(function() { var opts = $.extend({}, $.fn.slider2.defaults, options); var mr = parseInt($('.img-item').css('margin-right')); var $banneritems = $('.img-item'); var bannerarr = []; var _width = $banneritems.outerWidth() + mr, _size = $banneritems.length, j = 0; if (_size <= 3) { $(this).find('.img-brand-switch').hide(); return; } for (j = 0; j < $banneritems.length; j++) { bannerarr.push($banneritems[j]); } _size = bannerarr.length; $(this).find('.img-list').css({ width: (_width * _size) }); $(this).find('.next').on('click', function(e) { var i = 0, _obj = null; e.preventDefault(); changePic(3, _width, function() { for (i = 0; i < 3; i++) { _obj = bannerarr.shift(); $('.img-item').parent().append(_obj.outerHTML); bannerarr.push(_obj); } $('.img-item').first().remove(); $('.img-item').first().remove(); $('.img-item').first().remove(); $('.img-list').css({ 'margin-left': '0' }); }); }); $(this).find('.prev').on('click', function(e) { var i = 0, _obj = null, offersetleft = ''; e.preventDefault(); for (i = 0; i < 3; i++) { _obj = bannerarr.pop(); $('.img-item').parent().prepend(_obj.outerHTML); bannerarr.unshift(_obj); } offersetleft = 3 * _width; $('.img-item').last().remove(); $('.img-item').last().remove(); $('.img-item').last().remove(); $('.img-list').css({ 'margin-left': -offersetleft + 'px' }); changePic(0, _width); }); if (opts.autoplay === true) { autoplayrecycle(opts.index, _size, true); } }); }; }($)); }); define("js/common/accordion", ["jquery"], function(require, exports, module){ var Slide = require("js/common/yohoui/YH.slide"); var $ = require("jquery"); var $contain = $('.slide-accordion'); var $item = $contain.find('li'); var $width = $item.width(); var $spn = parseInt($('.home-page').width()) === 1150 ? (120 + 5) : (102 + 5); var slide; function switchfun(to) { $item.each(function(index) { $(this).css('zIndex', index); if (index <= to) { $(this).stop().animate({ left: index * $spn }, 400); } else { $(this).stop().animate({ left: (to) * $spn + $width + $spn * (index - to - 1) }, 400); } }); } switchfun(0); slide = new Slide({ length: 5, loop: false, auto: false, timeout: 2, index: 0 }); slide.on('change', function(data) { switchfun(data.to); }); $item.mouseover(function() { slide.go($(this).index()); }); slide.init(); }); define("js/common/yohoui/YH.slide", [], function(require, exports, module){ var me = require("js/common/yohoui/YH.base"); var slide = function(options) { this.__lastTime = null; this.__isStop = false; options = me.extend(this.defaults, options); slide.superclass.constructor.call(this, options); }; me.inherit(slide, me.assembly); slide.prototype.oninit = function() { var __self = this, _o = __self.options; if (_o.auto) { __self.play(); } __self.go(_o.index); return this; }; slide.prototype.go = function(_to, _from) { var __self = this, _o = __self.options; var _direction,_loop,_current,_index,_originalto,o,key,_e; if (__self.__lastTime) { clearTimeout(__self.__lastTime); __self.__lastTime = null; } _from = 'undefined' === typeof _from ? _o.index : _from; _direction = _to === _from ? 0 : _to > _from ? 1 : -1; _loop = _o.loop, _index = _o.length - 1, _originalto = _to; if (_loop) { if (_to > _index) { _to = _to - _index - 1; } else { if (0 > _to) { _to = _to + _index + 1; } else { _to = _to; } } } else { if (_to > _index) { _to = _index; } else { if (0 > _to) { _to = 0; } else { _to = _to; } } } _current = _o.index = _to; o = { from: _from, to: _to, originalto: _originalto, direction: _direction }; for (key in __self.registerEvent) { if (__self.registerEvent[key].length > 0) { for (_e in __self.registerEvent[key]) { if (__self.registerEvent[key].hasOwnProperty(_e)) { __self.registerEvent[key][_e](o); } } } } if (_current !== _index || _to) { if (!__self.__isStop && _o.auto) { __self.play(); } } else { if (__self.__lastTime) { clearTimeout(__self.__lastTime); } } }; slide.prototype.play = function() { var __self = this, _o = __self.options; __self.__lastTime = setTimeout(function() { __self.next(); }, 1000 * _o.timeout); return this; }; slide.prototype.next = function() { var __self = this, _o = __self.options; var _from = _o.index; var _to = _from + _o.step; __self.go(_to, _from); }; slide.prototype.prev = function() { var __self = this, _o = __self.options; var _from = _o.index; var _to = _from - _o.step; __self.go(_to, _from); }; slide.prototype.pause = function() { var __self = this; if (__self.__lastTime) { clearTimeout(__self.__lastTime); } __self.__isStop = true; }; slide.prototype.resume = function() { var __self = this; __self.__isStop = false; __self.play(); }; slide.prototype.defaults = { index: 0, timeout: 5, step: 1, per: 1, auto: false, loop: false }; module.exports = slide; }); define("js/common/yohoui/YH.base", [], function(require, exports, module){ var assembly; var classtype = { '[object Array]': 'array', '[object Boolean]': 'boolean', '[object Date]': 'date', '[object Function]': 'function', '[object Number]': 'number', '[object Object]': 'object', '[object RegExp]': 'regexp', '[object String]': 'string' }; var me = { __Index: 0, list: [], get: function(id) { return id === undefined ? this.list : this.list[id]; }, fn: function() { }, inherit: function(childClass, parentClass) { var Constructor = me.fn; Constructor.prototype = parentClass.prototype; childClass.prototype = new Constructor(); childClass.prototype.constructor = childClass; childClass.superclass = parentClass.prototype; if (childClass.prototype.constructor === Object.prototype.constructor) { childClass.prototype.constructor = parentClass; } }, extend: function(obj, newProperties) { var key; for (key in newProperties) { if (newProperties.hasOwnProperty(key)) { obj[key] = newProperties[key]; } } return obj; }, copy: function(TargetClass, obj, newProperties) { var value,o,key; if (typeof obj !== 'object') { return obj; } value = obj.valueOf(); if (obj !== value) { return new obj.constructor(value); } if (obj instanceof obj.constructor && obj.constructor !== Object) { if (TargetClass) { o = new TargetClass(); } else { o = me.clone(obj.constructor.prototype); } for (key in obj) { if (TargetClass || obj.hasOwnProperty(key)) { o[key] = obj[key]; } } } else { o = {}; for (key in obj) { if (o.hasOwnProperty(key)) { o[key] = obj[key]; } } } if (newProperties) { for (key in newProperties) { if (o.hasOwnProperty(key)) { o[key] = newProperties[key]; } } } return o; }, clone: function(obj) { me.__cloneFunc.prototype = obj; return new me.__cloneFunc(); }, __cloneFunc: function() { }, delegate: function(func, scope) { var args; scope = scope || window; if (arguments.length > 2) { args = Array.prototype.slice.call(arguments, 2); return function() { return func.apply(scope, args); }; } else { return function() { return func.call(scope); }; } }, dom: function($select, classCss) { var wrap = $select; var name, DOM = { wrap: wrap }, els = wrap[0].getElementsByTagName('*'), elsLen = els.length; var i; for (i = 0; i < elsLen; i++) { name = els[i].className; if (name.indexOf(classCss) > -1) { name = name.split(classCss)[1]; } if (name) { DOM[name] = wrap.find(els[i]); } } return DOM; }, //模板引擎 template: function() { var result, key, reg,i; var args = arguments; if (args.length > 0) { if (me.isString(args[0])) { result = args[0]; if (args.length === 2 && me.isObject(args[1])) { for (key in args[1]) { if (args[1][key] !== undefined) { reg = new RegExp('({' + key + '})', 'g'); result = result.replace(reg, args[1][key]); } } } else { for (i = 1; i < args.length; i++) { if (args[i] !== undefined) { reg = new RegExp('({[' + (i - 1) + ']})', 'g'); result = result.replace(reg, args[i]); } } } } } return result; }, __type: function(obj) { return obj == null ? String(obj) : classtype[Object.prototype.toString.call(obj)] || 'object'; }, isObject: function(obj) { return this.isFunction(obj) || !!(obj && 'object' === typeof obj); }, isFunction: function(obj) { return this.__type(obj) === 'function'; }, isArray: Array.isArray || function(obj) { return this.__type(obj) === 'array'; }, isNum: function(obj) { return !isNaN(parseFloat(obj)) && isFinite(obj); }, isString: function(obj) { return this.__type(obj) === 'string'; }, each: function(data, callback, args) { var i, len; if (me.isArray(data)) { for (i = 0, len = data.length; i < len; i++) { if (callback.call(data[i], i, data[i], args) === false) { break; } } } else { for (i in data) { if (callback.call(data[i], i, data[i], args) === false) { break; } } } }, funManager: { __loadList: {}, __loadFun: function(item, callback, win) { if (item.methord && me.isFunction(item.methord())) { win = win || window; item.methord()(item, function() { callback(); }, win); } }, load: function(fns, statechange, win, __index) { __index = __index || 0; if (fns[__index]) { me.funManager.__loadFun(fns[__index], function() { me.funManager.load(fns, statechange, win, __index + 1); }, win); } statechange(__index, win); }, get: function(id) { return this.__loadList[id]; } }, log: function(msg) { var console = window.console || { log: function() { } }; console.log(msg); }, Event: { mousewheel: function(e) { var _eoe = e.originalEvent; var _de = _eoe.detail ? _eoe.detail * -1 : _eoe.wheelDelta / 40; var _direction = _de < 0 ? -1 : 1; return { direction: _direction, unit: _de }; }, __: function(_e, el, event, handle) { var key; for (key in _e) { if (window[_e[key].validator]) { el[_e[key].validator](_e[key].prefix + event, handle, false); break; } } }, add: function(el, event, handle) { var _e = [ { validator: 'addEventListener', prefix: '' }, { validator: 'attachEvent', prefix: 'on' } ]; this.__(_e, el, event, handle); }, remove: function(el, event, handle) { var _e = [ { validator: 'removeEventListener', prefix: '' }, { validator: 'detachEvent', prefix: 'on' } ]; this.__(_e, el, event, handle); } }, getUid: function(_name) { return me.template('me-{0}{1}-{2}', _name, new Date().getTime(), me.__Index++); }, Browser: { isTouch: function() { var msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture; return (('ontouchstart' in window) || msGesture || window.DocumentTouch) ? true : false; }, Prefix: function() { var i; var props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; var obj = document.createElement('div'); for (i in props) { if (obj.style[props[i]] !== undefined) { return me.template('-{0}-', props[i].replace('Perspective', '').toLowerCase()); } } }, parseURL: function(url) { var a = document.createElement('a'); var ret,seg,len,i,s; a.href = url; return { source: url, protocol: a.protocol.replace(':', ''), host: a.hostname, port: a.port, query: a.search, params: (function() { ret = {}, seg = a.search.replace(/^\?/, '').split('&'), len = seg.length, i = 0, s; for (; i < len; i++) { if (!seg[i]) { continue; } s = seg[i].split('='); ret[s[0]] = s[1]; } return ret; })(), file: (a.pathname.match(/\/([^\/?#]+)$/i) || [null, ''])[1], hash: a.hash.replace('#', ''), path: a.pathname.replace(/^([^\/])/, '/$1'), relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [null, ''])[1], segments: a.pathname.replace(/^\//, '').split('/') }; } }, Array: { indexOf: function(array, val) { var i; for (i = 0; i < array.length; i++) { if (this[i] === val) { return i; } } return -1; }, remove: function(array, val) { var index = this.indexOf(array, val); if (index > -1) { array.splice(index, 1); } return array; } } }; assembly = function(options) { this.initialized = false; this.registerEvent = { before: [], change: [], after: [] }; this.options = options; this.init(options); }; assembly.output = function() { me.log(me.list); }; assembly.prototype.oninit = me.fn; assembly.prototype.init = function(cfg) { this.initialized = true; // function _getClassName(_constructor, _constr) { // var _constr = _constr || ""; // if (_constructor.superclass) { // var args = /(\w+)\.superclass/.exec(_constructor.arguments.callee); // if (args != null) { // _constr += args[1] + "-"; // // return _getClassName(_constructor.superclass.constructor, _constr); // } // } // return _constr; // } this.__Uid = me.getUid('me'); this.oninit(cfg); me.list[this.__Uid] = this; }; assembly.prototype.destory = function() { this.initialized = false; delete me.list[this.__Uid]; }; assembly.prototype.getUid = function() { return this.__Uid; }; assembly.prototype.getOptions = function() { return this.options; }; assembly.prototype.config = function() { if (arguments.length > 0) { if (typeof (arguments[0]) === 'string') { if (arguments.length > 1) { this.options[arguments[0]] = arguments[1]; } else { return this.options[name]; } } } else { return this.options; } }; assembly.prototype.on = function(name, callback) { var __self = this; var _e = __self.registerEvent[name]; if (_e) { _e.push(callback); } return _e; }; assembly.prototype.off = function(name, callback) { var __self = this; var _e = __self.registerEvent[name]; var e = []; me.each(_e, function(name, _callback) { if (_callback === callback) { e.push(name); } }); me.each(e.reverse(), function(name, _callback) { _e.splice(_callback, 1); }); }; me.assembly = assembly; module.exports = me; }); define("js/common/new-arrivls", ["jquery","lazyload","handlebars","source-map"], function(require, exports, module){ var $ = require("jquery"), lazyload = require("lazyload"); var Handlebars = require("handlebars"); function InfiniteLoad(options) { var defaults = { index: 0, isload: true,//是否正在加载 isrun: true,//判断是否执行 offset: { height: null, width: null } }; this.registerEvent = { before: [], change: [], after: [] }; this.options = $.extend(true, {}, defaults, options); return this; } InfiniteLoad.prototype.on = function(name, callback) { var g = this; var _e = g.registerEvent[name]; if (_e) { _e.push(callback); } return _e; }; InfiniteLoad.prototype.exect = function(key, params) { var g = this; var e; if (g.registerEvent[key] && g.registerEvent[key].length > 0) { for (e in g.registerEvent[key]) { if (g.registerEvent[key].hasOwnProperty(e)) { g.registerEvent[key][e](params); } } } }; InfiniteLoad.prototype.init = function() { var g = this; var p = this.options; function __loadMore() { if (p.isrun && p.isload && g.__directionCalculation()) { p.isload = false; p.index++; g.exect('after', p); } g.exect('change', p); } g.exect('before', p); $(window).scroll(__loadMore); }; InfiniteLoad.prototype.emit = function() { var p = this.options; p.isload = true; }; InfiniteLoad.prototype.stop = function() { var p = this.options; p.isrun = false; p.isload = false; }; InfiniteLoad.prototype.__directionCalculation = function() { var p = this.options; if (p.offset.height && p.offset.height() > 0 && $(window).scrollTop() + $(window).height() >= p.offset.height()) { return true; } return false; }; module.exports = function(data) { var $container = $('#newarrivals .goods-container'); var $load = $('.loading a'); var load = new InfiniteLoad({ index: 1, isload: false, offset: { height: function() { return parseFloat($container.offset().top) + parseFloat($container.height()) - 200; } } }); var loadAjax; var url = data.url, count = data.count, rows = data.rows; data.pageIndex = 0; delete data.url; delete data.count; delete data.rows; loadAjax = function(url, data, count) { var options = { type: 'POST', url: url, success: function(result) { var code = result.code; var myTemplate,len,pos; if (code === 200) { len = result.goods.length % count; pos = result.goods.length - len - 1; result.goods.splice(pos, len); myTemplate = Handlebars.compile(load.tpl); $container.append(myTemplate(result.goods)); data.pageIndex = data.pageIndex + result.goods.length; //懒加载插件貌似有点问题,图片先直接展示 lazyload($container.find('img.lazy')); load.emit(); } else { load.stop(); $load.html('查看更多'); } }, error: function() { load.stop(); $load.html('网络断开连接了~'); } }; options.data = data; $.ajax(options); }; load.on('after', function(p) { data.pageCount = count * rows[1]; loadAjax(url, data); }); load.on('before', function(p) { load.tpl = '{{#each this}}'; load.tpl += '<div class="good-info imgopacity" data-skn="{{skn}}">'; load.tpl += ' <div class="tag-container clearfix">'; load.tpl += ' {{# tags}}'; load.tpl += ' {{# isNew}}'; load.tpl += ' <span class="good-tag new-tag">NEW</span>'; load.tpl += ' {{/ isNew}}'; load.tpl += ' {{# isReNew}}'; load.tpl += ' <span class="good-tag renew-tag">再到着</span>'; load.tpl += ' {{/ isReNew}}'; load.tpl += ' {{# isSale}}'; load.tpl += ' <span class="good-tag sale-tag">SALE</span>'; load.tpl += ' {{/ isSale}}'; load.tpl += ' {{# isNewFestival}}'; load.tpl += ' <span class="good-tag new-festival-tag">新品节</span>'; load.tpl += ' {{/ isNewFestival}}'; load.tpl += ' {{# isLimit}}'; load.tpl += ' <span class="good-tag limit-tag">限量商品</span>'; load.tpl += ' {{/ isLimit}}'; load.tpl += ' {{# isYearEndPromotion}}'; load.tpl += ' <span class="good-tag yep-tag">年终大促</span>'; load.tpl += ' {{/ isYearEndPromotion}}'; load.tpl += ' {{# isYearMidPromotion}}'; load.tpl += ' <span class="good-tag ymp-tag">年中热促</span>'; load.tpl += ' {{/ isYearMidPromotion}}'; load.tpl += ' {{/ tags}}'; load.tpl += ' </div>'; load.tpl += ' <div class="good-detail-img">'; load.tpl += ' <a class="good-thumb" href="{{url}}" target= "_blank">'; load.tpl += ' <img class="lazy" data-original="{{thumb}}">'; load.tpl += ' </a>'; load.tpl += ' {{# isFew}}'; load.tpl += ' <p class="few-tag">即将售罄</p>'; load.tpl += ' {{/ isFew}}'; load.tpl += ' {{#if showColBtn}}'; load.tpl += ' <span class="col-btn iconfont{{#if coled}} coled{{/if}}"></span>'; load.tpl += ' {{/if}}'; load.tpl += ' </div>'; load.tpl += ' <div class="good-detail-text">'; load.tpl += ' <a href="{{url}}" target= "_blank">{{name}}</a>'; load.tpl += ' <p class="price">'; load.tpl += ' <span class="sale-price{{#unless marketPrice}}prime-cost{{/unless}}">'; load.tpl += ' ¥{{salePrice}}'; load.tpl += ' </span>'; load.tpl += ' {{# marketPrice}}'; load.tpl += ' <span class="market-price">¥{{.}}</span>'; load.tpl += ' {{/ marketPrice}}'; load.tpl += ' </p>'; load.tpl += ' </div>'; load.tpl += '</div>'; load.tpl += '{{/each}}'; data.pageCount = count * rows[0]; loadAjax(url, data, data.count); //load.emit(); }); load.init(); }; }); define("js/brand/index", ["jquery","lazyload","handlebars","source-map","dot"], function(require, exports, module){ /** * 首页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/11/23 */ var $ = require("jquery"), lazyLoad = require("lazyload"); require("js/common/slider"); require("js/brand/brands"); lazyLoad($('img.lazy')); $('.slide-container').slider({ orient: true }); }); define("js/brand/brands", ["jquery","handlebars","source-map","dot"], function(require, exports, module){ var $ = require("jquery"), Handlebars = require("handlebars"), dot = require("dot"); var $tabs = $('.brands-tabs'); var $list = $('.brands-list'); var $gory = $('.brands-category'); var $news = $('.news-txt ul'); var $clearfix = $list.find('dl.clearfix'); var $brand = $list.find('li>a'); var $category = $gory.find('a'); var $tab = $tabs.find('li>a'); var $arr = $tabs.find('.hoverarr'); var $thisTab; var categoryHeight = $category.height(); var categoryTop = $category.offset() ? $category.offset().top : 0; var newsHeight = $news.height(); var newsTop = $news.offset() ? $news.offset().top : 0; var timeout, _id; //用于临时存储数据 var tempdata = {}; var templete = '<div class="brands-dialog">'; templete += ' <div class="brands-layer">'; templete += ' <div class="layer-content">'; templete += ' <div class="title">{{title}}</div>'; templete += ' <div class="clearfix desc">'; templete += ' <img src="{{icon}}">'; templete += ' <p class="right">{{content}}</p>'; templete += ' </div> '; templete += ' <div class="featured">'; templete += ' <p>{{subtitle}}</p> '; templete += ' <div class="clearfix"> '; templete += ' {{#each imgs}}'; templete += ' <img src="{{src}}">'; templete += ' {{/each}}'; templete += ' </div>'; templete += ' </div>'; templete += ' </div>'; templete += ' </div>'; templete += '</div>'; dot($('.brand-desc')); $.easing.easeOutQuint = function(x, t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; }; function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); var r = window.location.search.substr(1).match(reg); if (r != null) { return window.unescape(r[2]); } return null; } // 格式化资讯NEWS标题数量 if ($news.length) { $news.find('li').each(function() { var $dom = $(this); var domHeight = $dom.offset().top - newsTop + $dom.height(); if (domHeight > newsHeight) { $dom.hide(); } }); } //头部图片TAB切换展示 $tab.eq(0).parent('li').find('.brands-content').css('z-index', '1'); _id = getQueryString('id') ? getQueryString('id') : 0; // 设置对应TAB选中 $thisTab = $tab.eq(_id); $thisTab.find('.g-mask').addClass('g-mask-on'); if (_id && $thisTab.length) { $arr.css({ left: parseFloat($thisTab.offset().left) - parseFloat($tabs.offset().left) }); } $tab.hover(function() { var $this = $(this); clearTimeout(timeout); timeout = setTimeout(function() { var targetLeft = parseFloat($this.offset().left) - parseFloat($tabs.offset().left); $arr.animate({ left: targetLeft }, 200, 'easeOutQuint'); }, 50); $tabs.find('.brands-content').removeAttr('style'); $this.parent('li').find('.brands-content').css('z-index', '1'); }, function() { clearTimeout(timeout); }); //品牌类别滚动事件 $(window).scroll(function() { if ($(this).scrollTop() >= categoryTop) { $gory.addClass('category-fix'); } else { $gory.removeClass('category-fix'); } }); //点击字母,页面滚动到相关区域 $category.click(function() { var name = $(this).attr('href').split('#')[1]; var targetTop = $list.find('[name=' + name + ']').offset().top - categoryHeight; if (!$gory.hasClass('category-fix')) { targetTop -= categoryHeight; } $('html,body').animate({ scrollTop: targetTop }, 200); return false; }); //浮层代码 function bindTemplete($select, data, templete) { var $this = $select; var offset = { width: $this.width(), left: $this.offset().left, right: parseFloat($(window).width()) - parseFloat($this.offset().left) - parseFloat($this.width()) }; var $parent = $this.parent('li'); var myTemplate; $list.find('.brands-dialog').remove(); myTemplate = Handlebars.compile(templete); $parent.append(myTemplate(data)); dot($parent.find('.right')); if (offset.right - 350 < 0) { $parent.find('.brands-layer') .addClass('brands-layer-right').css('left', -330 - offset.width); } } //鼠标悬浮品牌,请求数据,并且展示 function bindHoverEvent() { $brand.unbind('mouseenter').unbind('mouseleave').hover(function() { var $this = $(this); var key = $this.attr('data-key'); var options = { url: '/brands/brandinfo', type: 'get', data: { brandId: key }, success: function(_data) { if (_data.code === 200 && _data.brand) { if (!tempdata.hasOwnProperty(_data.brand.key)) { tempdata[_data.brand.key] = _data.brand; } bindTemplete($this, tempdata[_data.brand.key], templete); } } }; clearTimeout(timeout); timeout = setTimeout(function() { if (!tempdata.hasOwnProperty(key)) { $.ajax(options); } else { bindTemplete($this, tempdata[key], templete); } }, 200); }, function() { clearTimeout(timeout); $list.find('.brands-dialog').remove(); }); } if ($clearfix.length < 26) { $.ajax({ url: '/brands/brandList', type: 'POST', data: { start: $clearfix.length ? ($clearfix.length + 1) : 1 }, success: function(_data) { if (_data) { $list.append(_data); $brand = $list.find('li>a'); bindHoverEvent(); } } }); } bindHoverEvent(); }); define("js/passport/entry", ["jquery","jquery.placeholder"], function(require, exports, module){ /* * 密码中心打包入口文件 */ require("js/passport/reg"); require("js/passport/back"); require("js/passport/login"); require("js/passport/reset"); require("js/passport/vertification"); require("js/passport/thirdlogin"); require("js/passport/third-pwd"); }); define("js/passport/reg", ["jquery","jquery.placeholder"], function(require, exports, module){ /* * @description 注册页js * @time 2015/12/14 */ var $ = require("jquery"), regValidate = require("js/passport/mail-phone-regx"), computeComplex = require("js/passport/pwd-strength"); var $registerPage = $('.register-page'), $pwdTips = $('#pwd-tips'), $pwdTip1 = $pwdTips.find('#pwd-tip1'), $errTip = $('#err-tip'), $registerBtn = $('#register-btn'), $countDown = $('#count-down'), $successBtn = $('.success-btn'), countDown = 5, clearT; var $sendCaptcha = $('#send-captcha'), caCount = 4, validateResult = []; var $pn = $('#phone-num'), $mc = $('#msg-captcha'), $pwd = $('#pwd'), $repwd = $('#repwd'), $ca = $('#captcha'), timeResidue = 0; // 密码强度验证 var $pwdIntensity = $('.pwd-intensity'), $pwdParent = $pwdIntensity.closest('.pwd-intensity-container'); //signup验证 var $region = $('#country-code'), $regionSelect = $('#region'), isPwd = false, pwdVal; var pwdReg = regValidate.pwdValidateRegx; var $curErrContainer; var oldPhone = ''; //如果手机号改变时刷新验证码 require("jquery.placeholder"); setTimeout(function() { $pn.val(''); $mc.val(''); $pwd.val(''); $repwd.val(''); $ca.val(''); }, 0); //验证码位数 $ca.attr('maxlength', caCount); //密码规则提示 $pwd.focus(function(event) { $pwdTips.removeClass('hide'); isPwd = true; pwdVal = $(this).val(); }).blur(function() { $pwdTips.addClass('hide'); isPwd = false; }); //IE8 placeholder $('[placeholder]').placeholder(); // 存储校验信息 validateResult = [ { id: 'phone-num', message: '', //错误信息 status: false //当前的状态 }, { id: 'captcha', message: '', status: false }, { id: 'msg-captcha', message: '', status: false }, { id: 'pwd', message: '', status: false }, { id: 'repwd', message: '', status: false } ]; //刷新图形验证码 function refreshPic() { var time = new Date(), $captchaImg = $('.captcha-img'), captchaImgSrc = $captchaImg.attr('src').split('?')[0]; $captchaImg.attr('src', captchaImgSrc + '?t=' + time.getTime()); } //手机号ajax校验 function phoneAjaxFn(page, callback) { var url, data; if (page === 'reg') { url = '/passport/register/checkmobile'; data = { mobile: $pn.val(), area: $region.text().split('+')[1] }; } else if (page === 'third') { url = '/passport/autouserinfo/bindCheck'; data = { mobile: $pn.val(), area: $region.text().split('+')[1], openId: $('#open-id').val(), sourceType: $('#source-type').val() }; } validateResult[0].message = 'err'; validateResult[0].status = false; $.ajax({ url: url, type: 'POST', data: data }).then(function(data) { if (!data) { return; } switch (data.code) { case 200: if ($pn.val() !== oldPhone && oldPhone !== '') { // 如果手机号发生改变则刷新验证码并且更新状态 refreshPic(); $sendCaptcha.addClass('disable').attr('disabled', 'disabled'); validateResult[1].message = '图形验证码错误'; validateResult[1].status = false; } oldPhone = $pn.val(); validateResult[0].message = ''; validateResult[0].status = true; break; case 400: refreshPic(); validateResult[0].message = data.message; validateResult[0].status = false; break; } callback(); }); } //图形验证码ajax校验 function picCaptchaAjaxFn(page, callback) { var url; if (page === 'reg') { url = '/passport/register/piccaptcha'; } else if (page === 'third') { url = '/passport/autouserinfo/checkPicCode'; } $.ajax({ type: 'POST', url: url, data: { verifyCode: $ca.val() //mobile: $pn.val(), //area: $region.text().split('+')[1] } }).then(function(data) { if (!data) { return; } switch (data.code) { case 200: validateResult[1].message = ''; validateResult[1].status = true; break; case 400: refreshPic(); validateResult[1].message = '图形验证码错误'; validateResult[1].status = false; break; } callback(); }); } //短信验证码ajax校验 function msgCaptchaAjaxFn(page, callback) { var url; if (page === 'reg') { url = '/passport/register/msgcaptcha'; } else if (page === 'third') { url = '/passport/autouserinfo/checkBindMsg'; } $.ajax({ type: 'POST', url: url, data: { code: $mc.val(), mobile: $pn.val(), area: $region.text().split('+')[1] } }).then(function(data) { if (!data) { return; } switch (data.code) { case 200: validateResult[2].message = ''; validateResult[2].status = true; break; case 400: validateResult[2].message = '短信验证码错误'; validateResult[2].status = false; break; } callback(); }); } // 验证 function validateRule(page, $element, callback) { var val = $.trim($element.val()), regionCode; // 根据需求http://redmine.yoho.cn/issues/3117改成上边的正则 // 对应的错误提示语也改了,感觉要不了多久就会改回来 // pwdReg = /^([a-zA-Z0-9\-\+_!@\#$%\^&\*\(\)\:\;\.=\[\]\\\',\?]){6,20}$/gi; //手机号校验 if ($element.hasClass('phone-num')) { regionCode = $region.text(); if (val === '') { validateResult[0].message = '请输入手机号码'; validateResult[0].status = false; callback(); } else if (!regValidate.phoneRegx[regionCode].test(val)) { validateResult[0].message = '手机号码格式不正确,请重新输入'; validateResult[0].status = false; callback(); } else { phoneAjaxFn(page, callback); } //图形验证码校验 } else if ($element.hasClass('captcha')) { if (val === '') { validateResult[1].message = '请输入图形验证码'; validateResult[1].status = false; callback(); } else if (val.length <= 3) { validateResult[1].message = '图形验证码为4位'; validateResult[1].status = false; callback(); } else { // 并且手机号正确 if (validateResult[0].status) { picCaptchaAjaxFn(page, callback); } else { validateResult[1].message = '图形验证码错误'; validateResult[1].status = false; callback(); } } //短信验证码校验 } else if ($element.hasClass('msg-captcha')) { if (val === '') { validateResult[2].message = '请输入短信验证码'; validateResult[2].status = false; callback(); } else if (val.length <= 3) { validateResult[2].message = '短信验证码错误'; validateResult[2].status = false; callback(); } else { // 并且图形验证码正确 if (validateResult[1].status) { msgCaptchaAjaxFn(page, callback); } else { validateResult[2].message = '短信验证码错误'; validateResult[2].status = false; callback(); } } //密码校验 } else if ($element.hasClass('pwd')) { if (val === '') { validateResult[3].message = '请输入密码'; validateResult[3].status = false; } else if (val.length < 6 || val.length > 20) { validateResult[3].message = '密码只支持6-20位字符'; validateResult[3].status = false; } else if (!pwdReg.test($element.val())) { validateResult[3].message = '密码须字母和数字组合'; validateResult[3].status = false; } else { validateResult[3].message = ''; validateResult[3].status = true; } callback(); //二次密码校验 } else if ($element.hasClass('repwd')) { if (val === '') { validateResult[4].message = '请输入密码确认'; validateResult[4].status = false; } else if ($pwd.val() !== val) { validateResult[4].message = '与密码不一致,请重新输入'; validateResult[4].status = false; } else { validateResult[4].message = ''; validateResult[4].status = true; } callback(); } } function posErrTip() { var tipPos = $curErrContainer.offset(); return $errTip.css({ top: tipPos.top - 40, left: tipPos.left }); } //显示提示信息 function showErrTip() { var show = false, i, validateResultLen = validateResult.length; for (i = 0; i < validateResultLen; i++) { if (!show) { //不可以通过status判断 if (!!validateResult[i].message && validateResult[i].message !== 'err') { //显示错误提示 $errTip.find('span').text(validateResult[i].message); $curErrContainer = $('#' + validateResult[i].id); posErrTip().removeClass('hide'); show = true; //停止判断 } else { $errTip.addClass('hide'); } } } } //显示红色边框 function showBorder() { var $errInput, i, validateResultLen = validateResult.length; for (i = 0; i < validateResultLen; i++) { if (!!validateResult[i].message) { //显示红色边框 $errInput = $('#' + validateResult[i].id); $errInput.addClass('error'); } else { //去掉红色边框 $errInput = $('#' + validateResult[i].id); $errInput.removeClass('error'); } } } // 密码强度验证 function pwdFn($obj) { var pwd = $obj.val(), pwdStrength = computeComplex(pwd), level = 0; if (pwdStrength === 0) { level = 0; } else if (pwdStrength <= 10) { level = 1; } else if (pwdStrength <= 20) { level = 2; } else { level = 3; } switch (level) { case 0: $pwdParent.removeClass('red yellow green'); $pwdIntensity.removeClass('color'); break; case 1: $pwdParent.addClass('red').removeClass('yellow green'); $pwdIntensity.filter('.low').addClass('color'); $pwdIntensity.filter('.mid,.high').removeClass('color'); break; case 2: $pwdParent.addClass('yellow').removeClass('red green'); $pwdIntensity.filter('.low,.mid').addClass('color'); $pwdIntensity.filter('.high').removeClass('color'); break; case 3: $pwdParent.addClass('green').removeClass('yellow red'); $pwdIntensity.addClass('color'); break; } //提示框 if (pwd === '') { $pwdTip1.removeClass('red yes no').addClass('default'); } else if (pwd.length < 6 || pwd.length > 20) { $pwdTip1.removeClass('default yes').addClass('no red'); } else { $pwdTip1.removeClass('default no red').addClass('yes'); } } //重新定位错误提示 $(window).resize(function() { if ($errTip.hasClass('hide')) { return; } posErrTip(); }); // 失去焦点时开始校验 // Tips: 不可以在获得焦点的时候验证,获得焦点和失去焦点的间隔太小,如果中间存在ajax校验的话会出现问题 // ( ▼-▼ )注册页和信息完善页面接口不同 exports.init = function(page) { $('#agree-terms').click(function() { var $this = $(this), i, passI = 0; if (!!$this.attr('notchecked')) { $this.removeAttr('notchecked'); //勾选 for (i = 0; i < validateResult.length; i++) { if (validateResult[i].status) { passI++; } } if (passI === 4) { $registerBtn.removeClass('disable').removeAttr('disabled'); } } else { //取消勾选 $registerBtn.addClass('disable').attr('disabled', 'disabled'); $this.attr('notchecked', 'notchecked'); } }); // 按回车键提交 $registerPage.on('keydown', function(e) { var key = e.which; if (key === 13) { $registerBtn.click(); } }); $registerPage.find('.va').keyup(function() { var j, statusLen = 0, vLen = validateResult.length, $that = $(this); validateRule(page, $(this), function() { showErrTip(); // 显示错误提示 showBorder(); // 显示红色边框 // 如果validateResult中有4个status为true表示验证通过 for (j = 0; j < vLen; j++) { if (validateResult[j].status) { statusLen++; } } if (statusLen === 4 && !$('#agree-terms').attr('notchecked')) { $registerBtn.removeClass('disable').removeAttr('disabled'); } else { $registerBtn.addClass('disable').attr('disabled', 'disabled'); } // 图形验证通过时,发送短信按钮可点击 if (validateResult[1].status && timeResidue <= 0) { $sendCaptcha.removeClass('disable').removeAttr('disabled'); } else { $sendCaptcha.addClass('disable').attr('disabled', 'disabled'); } //图形验证通过时,发送短信按钮可点击 end }); // 如果是密码则校验强度 if (($that).hasClass('pwd')) { pwdFn($that); } }).blur(function() { /*validateRule($(this), function() { showErrTip(); showBorder(); // 显示红色边框 });*/ }); $regionSelect.change(function() { $region.text($('#region').val()); validateRule(page, $pn, showErrTip); //验证 }); // 点击发送验证码 $sendCaptcha.click(function() { var t, url; if ($(this).hasClass('disable')) { return; } timeResidue = 60; $('#msg-tip').removeClass('hide'); $sendCaptcha.addClass('disable').attr('disabled', 'disabled'); t = setInterval(function() { if (timeResidue <= 0) { $sendCaptcha.removeClass('disable').removeAttr('disabled').val('获取短信验证码'); clearInterval(t); return; } $sendCaptcha.val(timeResidue-- + '秒可重新发送'); }, 1000); if (page === 'reg') { url = '/passport/register/sendBindMsg'; } else if (page === 'third') { url = '/passport/autouserinfo/sendBindMsg'; } //todo ajax 发送验证码 $.ajax({ type: 'POST', url: url, data: { area: $region.text().split('+')[1], mobile: $pn.val(), verifyCode: $ca.val() } }); }); // 防止粘贴密码 if ($('.success-box').length <= 0) { $pwd[0].onpaste = function() { return false; }; } //ajax表单提交 $registerBtn.click(function() { var url; if (page === 'reg') { url = '/passport/register/mobileregister'; } else if (page === 'third') { url = '/passport/autouserinfo/bindMobile'; } if ($(this).hasClass('disable')) { return; } else { //ajax提交 $.ajax({ type: 'POST', url: url, data: { area: $region.text().split('+')[1], mobile: $pn.val(), verifyCode: $ca.val(), code: $mc.val(), password: $pwd.val() } }).then(function(data) { var time = 0, t, refer; if (data.code === 200) { refer = data.data.href; t = setTimeout(function() { time++; }, 1000); $.ajax({ type: 'GET', url: data.data.session }).then(function(data) { if (data.code === 200 && t < 3) { clearInterval(t); location.href = refer; } }); if (t >= 3) { clearInterval(t); location.href = refer; } } else { //todo console.log('网络超时~'); } }); } }); $('.change-captcha').click(function() { refreshPic(); }); //注册成功页面5秒后跳转 if ($('.success-box').length > 0) { clearT = setInterval(function() { if (countDown === 0) { window.location.href = $successBtn.attr('data-url'); clearInterval(clearT); } $countDown.text(countDown--); }, 1000); } }; }); define("js/passport/mail-phone-regx", [], function(require, exports, module){ /** * 国家区号Map手机号码以及邮箱验证正则 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/11 */ var countryPhoneRegx = { '+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]{1}[0-9]{8}$/, '+81': /^0[9|8|7][0-9]{9}$/, '+61': /^[0-9]{11}$/ }; var emailRegx = /^[.\-_a-zA-Z0-9]+@[\-_a-zA-Z0-9]+\.[a-zA-Z0-9]/; var pwdValidateRegx = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/; exports.phoneRegx = countryPhoneRegx; exports.emailRegx = emailRegx; exports.pwdValidateRegx = pwdValidateRegx; }); define("js/passport/pwd-strength", [], function(require, exports, module){ /* * 计算密码复杂度 */ function gettype(str, i) { if (str.charCodeAt(i) >= 48 && str.charCodeAt(i) <= 57) { return 1; } else if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 122) { return 2; } else if (str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90) { return 3; } return 4; } function isregular(cur, pre, type) { var curCode = cur.charCodeAt(0); var preCode = pre.charCodeAt(0); if (curCode - preCode === 0) { return true; } if (type !== 4 && (curCode - preCode === 1 || curCode - preCode === -1)) { return true; } return false; } function getcomplex(curType, preType) { if (preType === 0 || curType === preType) { return 0; } else if (curType === 4 || preType === 4) { return 2; } else { return 1; } } function computeComplex(password) { var complex = 0, length = password.length, pre = '', preType = 0, i = 0, cur, curType; for (i = 0; i < length; i++) { cur = password.charAt(i); curType = gettype(password, i); if (preType !== curType || !isregular(cur, pre, curType)) { complex += curType + getcomplex(curType, preType); } pre = cur; preType = curType; } return complex; } module.exports = computeComplex; }); define("js/passport/back", ["jquery","jquery.placeholder"], function(require, exports, module){ /** * 找回密码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/14 */ var $ = require("jquery"), regx = require("js/passport/mail-phone-regx"), emailReg = regx.emailRegx, phoneRegx = regx.phoneRegx; var emailAc = require("js/passport/ac-email"); //邮箱自动完成 var $cr = $('#country-code-hide'), $phoneNum = $('#phone-num'), $ca = $('#captcha'), $ccList = $('#country-code-list'), $cc = $('#country-code'), $btn = $('#find-btn'), $accErr = $('#account-err'), $caErr = $('#captcha-err'), caCount = 4, //验证码位数 hasPh = false, hasCa = false; require("jquery.placeholder"); function imgcode() { var time = new Date(), $captchaImg = $('#captcha-img'), captchaImgSrc = $captchaImg.attr('src').split('?')[0]; $('#captcha-img').attr('src', captchaImgSrc + '?t=' + time.getTime()); } function enableBtn() { if (hasPh && hasCa) { $btn.removeClass('disable').prop('disabled', false); } else { $btn.addClass('disable').prop('disabled', true); } } function authcode() { if (!hasPh || !hasCa) { enableBtn(); return; } $.ajax({ type: 'POST', url: '/passport/back/authcode', data: { verifyCode: $.trim($ca.val()), phoneNum: $phoneNum.val(), area: $cr.val() } }).then(function(data) { if (data.code === 200) { hasCa = true; } else if (data.code === 402) { hasPh = false; hasCa = true; $accErr.removeClass('hide').find('em').text('该账号不存在'); $phoneNum.addClass('error'); } else if (data.code === 400) { hasCa = false; imgcode(); } enableBtn(); }); } function vaPn(v) { var pass = true, errTxt = ''; v = $.trim(v); if (v !== '') { if (/^[0-9]+$/.test(v)) { if (phoneRegx[$cr.val()].test(v)) { pass = true; } else { errTxt = '手机号码格式不正确, 请重新输入'; pass = false; } } else { if (emailReg.test(v)) { pass = true; } else { errTxt = '邮箱格式不正确, 请重新输入'; pass = false; } } } else { errTxt = '账户名不能为空'; pass = false; } hasPh = pass; authcode(); return { pass: pass, errTxt: errTxt }; } function vaCa() { var v = $.trim($ca.val()); if (v === '' || v.length < caCount) { hasCa = false; enableBtn(); return; } hasCa = true; authcode(); } emailAc($phoneNum, function() { var pnVa = vaPn($phoneNum.val()); if (pnVa.pass) { $accErr.addClass('hide'); $phoneNum.removeClass('error'); } else { $accErr.removeClass('hide').find('em').text(pnVa.errTxt); $phoneNum.addClass('error'); } } ); $ca.attr('maxlength', caCount); //IE8 placeholder $('input').placeholder(); $('#change-captcha, #captcha-img').on('click', function() { imgcode(); }); $cc.on('click', function(e) { e.stopPropagation(); if ($ccList.css('style') === 'block') { $ccList.slideUp('fast'); } else { $ccList.slideDown('fast'); } }); $ccList.delegate('li', 'click', function(e) { var $cur = $(this), code = $cur.data('cc'), pnVa; e.stopPropagation(); $cr.val(code); $cc.find('em').html($cur.text()); //切换后验证手机号码 if ($.trim($phoneNum.val()) !== '') { pnVa = vaPn($phoneNum.val()); enableBtn(); if (hasPh) { $accErr.addClass('hide'); $phoneNum.removeClass('error'); } else { $accErr.removeClass('hide').text(pnVa.errTxt); $phoneNum.addClass('error'); } } $ccList.slideUp('fast'); }); $(document).click(function() { if ($ccList.css('display') === 'block') { $ccList.slideUp(); } }); $phoneNum.keyup(function() { vaPn($.trim($(this).val())); }).focus(function() { $(this).removeClass('error'); //focus隐藏错误提示 $accErr.addClass('hide'); }); //验证码在鼠标移开后验证, keyup时不再验证 $ca.blur(function() { var errTxt = $.trim($ca.val()) === '' ? '验证码不能为空' : '验证码不正确'; if (hasCa) { $caErr.addClass('hide'); $ca.removeClass('error'); } else { $caErr.removeClass('hide').find('em').text(errTxt); $ca.addClass('error'); //验证码错误则刷新验证码 if ($ca.val() < caCount) { //防止重复刷新验证码 imgcode(); } } }).focus(function() { $(this).removeClass('error'); //focus隐藏错误提示 $caErr.addClass('hide'); }).keyup(function() { vaCa(); }); $('#find-btn').click(function(e) { if (/^[0-9]+$/.test($.trim($phoneNum.val()))) { $('#find-form').attr('action', '/passport/back/mobile'); } if ($(this).hasClass('disable')) { return; } if (!hasCa || !hasPh) { e.preventDefault(); return true; } }); }); define("js/passport/ac-email", ["jquery"], function(require, exports, module){ /** * 邮箱自动补全 * @author:xuqi<qi.xu@yoho.cn> * @date: 2016/2/22 */ var $ = require("jquery"); var mailPostfix = { num: ['qq.com', '163.com', '126.com', 'sina.com', 'gmail.com', 'sohu.com', 'hotmail.com', '139.com', '189.com'], other: ['gmail.com', 'qq.com', '163.com', '126.com', 'sina.com', 'sohu.com', 'hotmail.com', '139.com', '189.com'] }; var emailAcTime; /** * @param $input 需要自动完成的$对象 * @param cb 鼠标移开/点击自动完成项后需要执行的操作(验证等) */ module.exports = function($input, cb) { var ulHtml = '<ul id="email-autocomplete" class="email-autocomplete hide"></ul>'; var $emailAutoComplete; $input.parent().append(ulHtml); $emailAutoComplete = $('#email-autocomplete'); $input.on('keyup', function() { var account = $.trim($(this).val()), html = '', accountMatch, matchStr, postfix, i; //输入@时自动补全邮箱后缀 //此处>0非错误,用于避免输入的第一个字符为@被识别为邮箱 if (account.indexOf('@') > 0) { accountMatch = account.match(/^[0-9]+@(.*)/); if (accountMatch) { //数字邮箱补全 postfix = mailPostfix.num; matchStr = accountMatch[1]; } else { postfix = mailPostfix.other; matchStr = account.match(/@(.*)/)[1]; } for (i = 0; i < postfix.length; i++) { if (postfix[i].indexOf(matchStr) > -1) { html += '<li>' + account.slice(0, account.indexOf('@')) + '@' + postfix[i] + '</li>'; } } if (html !== '' && /.com$/.test(account) === false) { $emailAutoComplete.html(html).removeClass('hide'); } else { //隐藏autocomplete $emailAutoComplete.html('').addClass('hide'); } } }).on('blur', function() { emailAcTime = setTimeout(function() { //未点击自动完成项 $emailAutoComplete.addClass('hide'); cb && cb(); }, 200); }); //邮箱自动完成列表项点击 $emailAutoComplete.on('click', 'li', function() { clearTimeout(emailAcTime); //清空默认关闭 //点击自动完成项后进行验证 $input.val($(this).text()).focus(); $emailAutoComplete.addClass('hide'); cb && cb(); }); }; }); define("js/passport/login", ["jquery","jquery.placeholder"], function(require, exports, module){ /** * 登录 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/11 */ var $ = require("jquery"); var $account = $('#account'), $password = $('#password'), $captcha = $('#captcha'); var $accountTip = $account.siblings('.err-tip'), $passwordTip = $password.siblings('.err-tip'), $captchaTip = $captcha.siblings('.err-tip'), $capsLock = $('#caps-lock'); var $countryCodeHide = $('#country-code-hide'), $countryCodeEm = $('#country-code > em'), $countryList = $('#country-list'); var $emailAutoComplete = $('#email-autocomplete'); var mailPhoneRegx = require("js/passport/mail-phone-regx"); var mailAc = require("js/passport/ac-email"); //邮箱自动完成 var $remember = $('.remember-me'); var captchaUrl = '/passport/images?t='; // /passport/images?t=1454464125 var $captchaWrap = $('.captcha-wrap'), $captcha = $captchaWrap.find('#captcha'), $captchaImg = $captchaWrap.find('#captcha-img'), $captchaTip = $captchaWrap.find('.err-tip'); //checkbox status unicode var checkbox = { checked: '', unchecked: '' }; var authing = false; var emailAcTime; require("jquery.placeholder"); //验证账户名 function validateAccount() { var pass = false, account = $.trim($account.val()), err; if (account !== '') { if (/^[0-9]+$/.test(account)) { //如果是纯数字,则作为手机号码处理 if (mailPhoneRegx.phoneRegx[$countryCodeHide.val()].test(account)) { pass = true; } else { pass = false; err = '手机号码不正确,请重新输入'; } } else { if (mailPhoneRegx.emailRegx.test(account)) { pass = true; } else { pass = false; err = '邮箱格式不正确,请重新输入'; } } } else { err = '请输入账户名'; } if (pass) { $accountTip.addClass('hide'); $account.removeClass('error'); } else { $accountTip.removeClass('hide').children('em').text(err); $account.addClass('error'); } return pass; } //验证密码 function validatePassword() { var pass = false, password = $.trim($password.val()), err; if (password !== '') { if (password.length < 6) { err = '请输入长度为6-20字符的密码'; } else { pass = true; } } else { err = '请输入密码'; } if (pass) { $passwordTip.addClass('hide'); $password.removeClass('error'); } else { $passwordTip.removeClass('hide').children('em').text(err); $password.addClass('error'); } return pass; } //验证验证码 function validateCaptcha() { var pass = false, captcha = $.trim($captcha.val()), err; // 验证码不可见的时候不验证 if ($captchaWrap.is(':hidden')) { return true; } if (captcha !== '') { if (captcha.length !== 4) { err = '请输入长度为4字符的验证码'; } else { pass = true; } } else { err = '请输入验证码'; } if (pass) { $captchaTip.addClass('hide'); $captcha.removeClass('error'); } else { $captchaTip.removeClass('hide').children('em').text(err); $captcha.addClass('error'); } return pass; } //验证 function validate() { var pass = true, account = $.trim($account.val()), password = $.trim($password.val()); if (account !== '') { pass = validateAccount() && validatePassword() && validateCaptcha(); } else { pass = false; $account.addClass('error'); if (password === '') { //账户名和密码都为空的情况下点击登陆,只在账户输入框后显示错误提示 $accountTip.addClass('both-error').removeClass('hide').children('em').text('请输入账户名和密码'); $passwordTip.addClass('hide'); $password.addClass('error'); } else { $accountTip.removeClass('hide').children('em').text('请输入账户名'); } } return pass; } //密码错误次数,超过三次显示验证码 function vaAccountErrTimes() { $captchaImg.attr('src', captchaUrl + $.now()); $captcha.val(''); $captchaWrap.removeClass('hide'); } //登录 function login() { var pass = validate(); if (pass && authing === false) { authing = true; $.ajax({ url: '/passport/login/auth', type: 'POST', data: { areaCode: $countryCodeHide.val().replace('+', ''), account: $.trim($account.val()), password: $.trim($password.val()), captcha: $.trim($captcha.val()), isRemember: $remember.hasClass('checked') ? true : false }, success: function(res) { if (res.code === 200) { if (res.data) { //防止data.data为undefined时下行语句执行出错而导致脚本不能走到complete去处理authing location.href = res.data.session; } } else { if (res.data.errorType === 'captcha') { $captchaTip.removeClass('hide').children('em').html(res.message); $captcha.addClass('error').val(''); } else { $passwordTip.removeClass('hide').children('em').html(res.message); $password.addClass('error').val(''); } //验证错误次数 if (res.data && res.data.needCaptcha) { vaAccountErrTimes(); } } }, complete: function() { authing = false; } }); } } mailAc($account, function() { if (validateAccount()) { $.ajax({ url: '/passport/login/account', type: 'GET', data: { account: $.trim($account.val()) } }).then(function(res) { if (res.data && res.data.needCaptcha) { vaAccountErrTimes(); } }); } } ); $('[placeholder]').placeholder(); //展开地区列表 $('#country-code').on('click', function() { if ($countryList.css('display') === 'none') { $countryList.slideDown(); } }); //选中地区列表项 $countryList.on('click', 'li', function() { var $this = $(this), cc = $this.data('cc'); $countryCodeEm.html($this.html()); $countryCodeHide.val(cc); $countryList.slideUp(); }); //点击其他区域,收起区域列表 $(document).on('click', function(e) { if ($(e.target).closest('#country-code').length > 0) { return; } if ($countryList.css('display') === 'block') { $countryList.slideUp(); } }); //密码 $password.on('blur', function() { validatePassword(); if ($capsLock.hasClass('hide')) { return; } $capsLock.addClass('hide'); }).on('keypress', function(e) { var code = e.which; //CapsLock检测 if (code >= 65 && code <= 90) { $capsLock.removeClass('hide'); return; } $capsLock.addClass('hide'); }); // 验证码 $captcha.on('blur', function() { validateCaptcha(); }); //邮箱自动完成列表项点击 $emailAutoComplete.on('click', 'li', function() { clearTimeout(emailAcTime); //清空默认关闭 $account.val($(this).text()).focus(); $emailAutoComplete.addClass('hide'); }); //记住登录状态 $remember.on('click', function() { var $this = $(this); $this.toggleClass('checked'); if ($this.hasClass('checked')) { $this.children('i').html(checkbox.checked); } else { $this.children('i').html(checkbox.unchecked); } }); //focus到输入框则隐藏错误提示和样式 $('.va').on('focus', function() { var $this = $(this); $this.removeClass('error'); $this.siblings('.err-tip').addClass('hide'); }); // 验证码刷新 $captchaWrap.on('click', '.change-captcha, .captcha-img', function() { $captchaImg.attr('src', captchaUrl + $.now()); }); //登录 $('#login-btn').on('click', login); //Enter登录 $('input.va').on('keypress', function(e) { if (e.which === 13) { login(); } }); // 初始:只带账户名的页面,密码输入获得焦点 if (($account.val() !== '' || $account.val() === $account.attr('placeholder')) && $password.val() === '') { $password.focus(); } }); define("js/passport/reset", ["jquery","jquery.placeholder"], function(require, exports, module){ /** * 找回密码 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/14 */ var $ = require("jquery"); var $pwd = $('#pwd'), $repwd = $('#re-input'), $next = $('#reset-pwd-btn'), $pwdErr = $('#pwd-err'), $repwdErr = $('#repwd-err'), $pwdTips = $('#pwd-tips'); var hasNoErrPw = false; var $pwdIntensity = $('.pwd-intensity'), $pwdParent = $pwdIntensity.closest('.pwd-intensity-container'), $pwdTip1 = $('#pwd-tip1'); var pwdRegx = require("js/passport/mail-phone-regx").pwdValidateRegx; require("jquery.placeholder"); /* * 计算密码复杂度 */ function gettype(str, i) { if (str.charCodeAt(i) >= 48 && str.charCodeAt(i) <= 57) { return 1; } else if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 122) { return 2; } else if (str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90) { return 3; } return 4; } function isregular(cur, pre, type) { var curCode = cur.charCodeAt(0); var preCode = pre.charCodeAt(0); if (curCode - preCode === 0) { return true; } if (type !== 4 && (curCode - preCode === 1 || curCode - preCode === -1)) { return true; } return false; } function getcomplex(curType, preType) { if (preType === 0 || curType === preType) { return 0; } else if (curType === 4 || preType === 4) { return 2; } else { return 1; } } function computeComplex(password) { var complex = 0, length = password.length, pre = '', preType = 0, i = 0, cur, curType; for (i = 0; i < length; i++) { cur = password.charAt(i); curType = gettype(password, i); if (preType !== curType || !isregular(cur, pre, curType)) { complex += curType + getcomplex(curType, preType); } pre = cur; preType = curType; } return complex; } function pwdKeyupEvt() { var pwd = $pwd.val(), pwdStrength = computeComplex(pwd), level = 0; //TODO:自定义密码强度规则,需要修正 if (pwdStrength === 0) { level = 0; } else if (pwdStrength <= 10) { level = 1; } else if (pwdStrength <= 20) { level = 2; } else { level = 3; } switch (level) { case 0: $pwdParent.removeClass('red yellow green'); $pwdIntensity.removeClass('color'); break; case 1: $pwdParent.addClass('red').removeClass('yellow green'); $pwdIntensity.filter('.low').addClass('color'); $pwdIntensity.filter('.mid,.high').removeClass('color'); break; case 2: $pwdParent.addClass('yellow').removeClass('red green'); $pwdIntensity.filter('.low,.mid').addClass('color'); $pwdIntensity.filter('.high').removeClass('color'); break; case 3: $pwdParent.addClass('green').removeClass('yellow red'); $pwdIntensity.addClass('color'); break; } //提示框 if (pwd === '') { $pwdTip1.removeClass('red yes no').addClass('default'); } else if (pwd.length < 6 || pwd.length > 20) { $pwdTip1.removeClass('default yes').addClass('no red'); } else { $pwdTip1.removeClass('default no red').addClass('yes'); } if (pwdRegx.test(pwd)) { hasNoErrPw = true; } else { hasNoErrPw = false; } } //IE8 placeholder $('input').placeholder(); $('.va').keyup(function() { var pass = true; if ($(this).hasClass('pwd')) { pwdKeyupEvt(); } else { if ($(this).val() === '') { pass = false; } } if (pass && hasNoErrPw && $pwd.val() === $repwd.val()) { pass = true; } else { pass = false; } if (pass) { $next.removeClass('disable').prop('disabled', false); } else { $next.addClass('disable').prop('disabled', true); } }).blur(function() { var $this = $(this), v = $this.val(); if ($this.hasClass('pwd')) { if (v === '') { $this.addClass('error'); $pwdErr.removeClass('hide').find('em').text('请输入密码'); } else if (v.length < 6 || v.length > 20) { $this.addClass('error'); $pwdErr.removeClass('hide').find('em').text('密码只支持6-20位'); } else if (!pwdRegx.test(v)) { $this.addClass('error'); $pwdErr.removeClass('hide').find('em').text('密码须字母和数字组合'); } else { $pwdErr.addClass('hide'); if ($repwd.val() !== '') { if (v !== $repwd.val()) { $repwd.addClass('error'); $repwdErr.removeClass('hide').find('em').text('两次密码输入不一致,请重新输入'); } else { $repwd.removeClass('error'); $repwdErr.addClass('hide'); } } } } else { if (v === '') { $this.addClass('error'); $repwdErr.removeClass('hide').find('em').text('请输入密码确认'); } else { if ($pwd.val() !== '' && v !== $pwd.val()) { $this.addClass('error'); $repwdErr.removeClass('hide').find('em').text('两次密码输入不一致,请重新输入'); } else { $this.removeClass('error'); $repwdErr.addClass('hide'); } } } }).focus(function() { $(this).removeClass('error'); //focus后错误提示隐藏 if ($(this).hasClass('pwd')) { $pwdErr.addClass('hide'); } else { $repwdErr.addClass('hide'); } }); $pwd.focus(function() { $pwdErr.addClass('hide'); $pwdTips.removeClass('hide'); }).blur(function() { $pwdTips.addClass('hide'); }); $('#pwd, #repwd').keydown(function(e) { var code = e.keyCode || e.which; //空格输入过滤 if (code === 32) { e.preventDefault(); return; } }); }); define("js/passport/vertification", ["jquery"], function(require, exports, module){ /** * 验证手机 * @author: xuqi<qi.xu@yoho.cn> * @date: 2015/12/14 */ var $ = require("jquery"); var $sc = $('#send-captcha'), $msgTip = $('#captcha-tip'), $errTip = $('#err-tip'), $next = $('#next-step'), seconds, itime; $sc.click(function() { $.post('/passport/back/sendbackmobile', { mobile: $('#mobile').val(), area: $('#area').val(), verifyCode: $('#captchaPic').val() }, function(jsonData) { if (jsonData.code === 200) { $errTip.hide(); if ($(this).hasClass('disable')) { return; } seconds = 60; //$sc.addClass('disable').prop('disabled', true); $sc.addClass('disable').attr('disabled', true); $msgTip.removeClass('hide'); $sc.val(seconds-- + '秒后可重新操作'); itime = setInterval(function() { if (seconds === 0) { clearInterval(itime); //$sc.val('发送验证码').removeClass('disable').prop('disabled', false); $sc.val('发送验证码').removeClass('disable').removeAttr('disabled'); } else { $sc.val(seconds-- + '秒后可重新操作'); } }, 1000); } else { $(this).addClass('error'); $errTip.removeClass('hide').text('发送失败'); } }); }); if ($(this).hasClass('disable')) { return; } seconds = 60; //$sc.addClass('disable').prop('disabled', true); $sc.addClass('disable').attr('disabled', true); $msgTip.removeClass('hide'); $sc.val(seconds-- + '秒后可重新操作'); itime = setInterval(function() { if (seconds === 0) { clearInterval(itime); //$sc.val('发送验证码').removeClass('disable').prop('disabled', false); $sc.val('发送验证码').removeClass('disable').removeAttr('disabled'); } else { $sc.val(seconds-- + '秒后可重新操作'); } }, 1000); $('#captcha').keyup(function() { var v = $.trim($(this).val()), that = this; if (v.length === 4) { $.ajax({ type: 'POST', url: '/passport/back/backmobile', dataType: 'json', data: { code: $('#captcha').val(), verifyCode: $("#captchaPic").val(), area: $('#area').val(), mobile: $('#mobile').val() }, success: function(res) { if (res.code === 200) { //添加验证码正确验证 $next.removeClass('disable').attr('href', res.data); $errTip.addClass('hide'); $(that).removeClass('error'); } else { $next.addClass('disable'); $errTip.removeClass('hide').find('em').text('验证码输入错误'); $(that).addClass('error'); } } }); } }).blur(function() { var v = $.trim($(this).val()); if (v === '') { //添加验证码正确验证 $(this).addClass('error'); $errTip.removeClass('hide').text('请输入验证码'); } }).focus(function() { $(this).removeClass('error'); }); }); define("js/passport/thirdlogin", ["jquery"], function(require, exports, module){ /** * 第三方登录首页 * @author: wq * @date: 2016/1/21 */ var $ = require("jquery"); var phoneRegx = require("js/passport/mail-phone-regx").phoneRegx; var nopermissionoption = $('#nopermissionmessage').html(); //倒计时dom var sendmessagehtml = $('.validatewrapper').html(); //发送短信dom var second = +$('.second').text(); //倒计时秒数 var dovalidate = false; //校验验证码标识 var validatecode = false; //验证码是否通过 var choosedpic = 'http://cdn.yoho.cn/yohobuy/assets/img/passport/choosed.png';//已选择图片 var $wrapper = $('.bindwrapper'), $phoneTip = $wrapper.find('.phone-err-tip'), $nextBtn = $wrapper.find('.yohobindbtn'); /** * 选择协议 * @return {[type]} [description] */ function chooseProtocol() { $('.choosetag').on('change', function() { var btnColor = '#f02200'; if ($(this).attr('checked') === 'checked') { $('.choosewrapper').css({ 'background-image': 'url("' + choosedpic + '")' }); } else { $('.choosewrapper').css({ 'background-image': 'none' }); btnColor = '#CCCCCC'; } $nextBtn.css({ 'background-color': btnColor }); }); } /** * 判断是否同意协议 * @return {[type]} [description] */ function isagree() { return $('.choosetag').attr('checked') === 'checked'; } /** * 选择区域的开关 * @return {[type]} [description] */ function chooseAreaToogle() { $('.optionshow').on('click', function() { $('.optionslist').toggleClass('hide'); }); } /** * 验证码校验 * @return {[type]} [description] */ function codeValidate() { var validatenum = ''; $(document).on('keyup', '#validatenum', function() { validatenum = $(this).val(); if (validatenum.length === 4) { if (!dovalidate) { dovalidate = true; $.ajax({ type: 'POST', url: '/passport/autouserinfo/checkBindMsg', data: { code: validatenum, mobile: $('#mobile').val(), area: $('#areacode').val() } }).then(function(data) { dovalidate = false; if (data.code === 200) { validatecode = true; } else { alert(data.message); } }); } } }); $('#validatenum').focus(function() { $(this).removeAttr('placeholder'); }).blur(function() { $(this).attr('placeholder', '验证码'); }); } /** * 选择区域 * @return {[type]} [description] */ function chooseArea() { $('.optionitem').on('click', function() { var $option = $(this); var areanum = $option.attr('areanum'); var areaname = $option.text(); $('#areaname').text(areaname); $('#areanum').text(areanum); $('#areacode').val(areanum); $('.optionslist').addClass('hide'); }); } /** * 取消选择区域 * @return {[type]} [description] */ function cancelChooseArea() { $(document).on('click', 'body', function(e) { var $target = $(e.target); if ($target.hasClass('yohoselectarea') || $target.hasClass('areaname') || $target.hasClass('righttag') || $target.hasClass('optionslist') || $target.hasClass('optionitem')) { return; } else { $('.optionslist').addClass('hide'); } }); } /** * 去掉区域号的加号 * @return {[type]} [description] */ function fixAreaNum() { var $opitem = ''; var itemarecode = ''; $('.optionitem').each(function() { $opitem = $(this); itemarecode = $opitem.attr('areanum').replace(/\+/g, ''); $opitem.attr('areanum', itemarecode); }); } /** * 关闭蒙层 * @return {[type]} [description] */ function closeMask() { var $target; $(document).on('click', '#alreayregist', function(e) { $target = $(e.target); if ($target.hasClass('mask') || $target.hasClass('backdrop')) { $('#alreayregist').hide(); $('.backdrop').hide(); } }); $(document).on('click', '#bindconfirm', function(e) { $target = $(e.target); if ($target.hasClass('mask') || $target.hasClass('backdrop')) { $('#bindconfirm').hide(); $('.backdrop').hide(); } }); } /** * 绑定其他手机号 * @return {[type]} [description] */ function yohoBindBtn() { $(document).on('click', '#yohobindbtn', function(e) { $('.phonenum').val(''); $('#bindconfirm').hide(); $('.backdrop').hide(); }); $(document).on('click', '#yohobindbtn2', function(e) { $('.phonenum').val(''); $('#alreayregist').hide(); $('.backdrop').hide(); }); } /** * 发送短信的时间变换动画 * @return {[type]} [description] */ function changeSecond() { second -= 1; if (second < 0) { second = 60; $('.validatewrapper').html(sendmessagehtml); return; } else { $('.second').text(second); window.setTimeout(changeSecond, 1000); } } /** * 时间循环 * @param {[type]} phonenum [description] * @return {[type]} [description] */ function circleTime(phonenum) { $('.validatewrapper').html(nopermissionoption); window.setTimeout(changeSecond, 1000); } /** * 发送短信 * @return {[type]} [description] */ function sendMessageValidate() { $(document).on('click', '#sendmessage', function() { if ($('#sendmessage').attr('disabled') === 'disabled') { return; } circleTime($('#mobile').val()); $.ajax({ type: 'POST', url: '/passport/autouserinfo/sendBindMsg', data: { mobile: $('#mobile').val(), area: $('#areacode').val() } }).then(function(data) { if (data.code !== 200) { alert(data.message); } }); }); } /** * 最终提交表单 */ function actionSubmit() { var mobile = ''; var area = ''; area = $('#areacode').val(); mobile = $('#mobile').val(); $.ajax({ type: 'POST', url: '/passport/autouserinfo/bindMobile', data: { area: area, openId: $('#openId').val(), sourceType: $('#sourceType').val(), mobile: mobile, code: $('#validatenum').val() } }).then(function(data) { if (data.code === 200) { if (data.data && data.data.refer) { window.location.href = data.data.refer; } else { window.location.href = '/passport/thirdlogin/bindsuccess'; } } else { alert(data.message); } }); } /** * 确认去绑定 * @return {[type]} [description] */ function goToBindPhone() { $(document).on('click', '#gotobindphone', function() { if (validatecode === true) { $('#inarea').val($('#areacode').val()); $('#inmobile').val($('#mobile').val()); actionSubmit(); } else { alert('请输入正确验证码'); } }); } /** * 点击下一步 * @return {[type]} [description] */ function nextStep() { var openId = ''; var sourceType = ''; var mobile = ''; var areaCode = ''; var username = ''; var headImg = ''; $('#bindfirststep').on('click', function(e) { var regx; e.preventDefault(); mobile = $('.phonenum').val(); areaCode = $('#areanum').text(); regx = phoneRegx['+' + areaCode]; if (!isagree()) { return; } if (mobile === '' || !regx || !regx.test(mobile)) { $phoneTip.find('em').text('手机格式错误'); $phoneTip.removeClass('hide'); return; } openId = $('#openId').val() || '29803EC6D4AAC3AAB8ABDB6AE829D579'; sourceType = $('#sourceType').val() || 'qq'; $.ajax({ type: 'post', url: '/passport/autouserinfo/bindCheck', data: { mobile: mobile, area: areaCode, openId: openId, sourceType: sourceType }, dataType: 'json', success: function(data) { var winHeight = $(window).height(); if (data.code === 200) { $('#bindmobileform').attr('action', '/passport/thirdlogin/noregist'); $('#bindmobileform').submit(); } if (data.code === 400 || data.code === 402) { $phoneTip.find('em').text('手机格式错误'); $phoneTip.removeClass('hide'); } if (data.code === 506) { username = data.data.user.username; headImg = data.data.user.headImg; $('#registphone').text(mobile); $('#username').text(username); if (headImg === '') { $('#userphoto').attr('src', 'http://img10.static.yhbimg.com/headimg/2013/11/28/09/' + '01cae078abe5fe320c88cdf4c220212688.gif?imageView/2/w/100/h/100'); } else { $('#userphoto').attr('src', headImg); } $('#logindirectly2').attr('href', data.data.user.bindLogin); $('.backdrop').show(); $('#sendmessage').click(); $('#alreayregist .mask').css({ 'padding-top': winHeight > 440 ? winHeight / 2 : 217 }); $('#alreayregist').show(); } if (data.code === 505) { username = data.data.user.username; headImg = data.data.user.headImg; $('#registphonetwo').text(mobile); $('#username1').text(username); if (headImg === '') { $('#userphoto1').attr('src', 'http://img10.static.yhbimg.com/headimg/2013/11/28/09/' + '01cae078abe5fe320c88cdf4c220212688.gif?imageView/2/w/100/h/100'); } else { $('#userphoto1').attr('src', headImg); } $('#logindirectly').attr('href', data.data.user.bindLogin); $('.backdrop').show(); $('#bindconfirm .mask').css({ 'padding-top': winHeight > 440 ? winHeight / 2 : 217 }); $('#bindconfirm').show(); } } }); }); } function init() { fixAreaNum(); //去掉所有区域的+ sendMessageValidate(); //有交互的发送短信 chooseProtocol(); //选择协议 chooseArea(); //选择区域 chooseAreaToogle(); //选择区域展示或关闭 cancelChooseArea(); //取消选择区域 nextStep(); //下一步 closeMask(); //关闭蒙层 yohoBindBtn(); //绑定其他手机号点击 goToBindPhone(); //绑定手机 codeValidate(); //验证码校验 } init(); }); define("js/passport/third-pwd", ["jquery"], function(require, exports, module){ /** * 第三方绑定完善个人信息 * @author: wq * @date: 2016/1/27 */ var $ = require("jquery"); var dovalidate = false; //校验验证码的标识 var isvalidatecode = false; //是否验证成功的标识 var isvalidatepwd = false; //密码验证是否通过的标识 var second = ''; //倒计时时间 var nopermissionoption = ''; //倒计时的dom var sendmessagehtml = ''; //发送短信的dom var submitStatus = false; //信息提交状态 var $wrapper = $('.bindwrapper'), $codeTip = $wrapper.find('.code-err-tip'), $pwdTip = $wrapper.find('.pwd-err-tip'), $pwdTip2 = $('#pwd-tip2'), $sendMsgBtn = $('#sendmessage'); var $pwd, $pwdParent, $pwdTip1, $pwdIntensity; var pwdRegx = require("js/passport/mail-phone-regx").pwdValidateRegx; var mobile = $('#mobile').val(), area = $('#area').val(); nopermissionoption = $('#nopermissionmessage').html(); sendmessagehtml = $('.validatewrapper').html(); second = +$('.second').text(); function gettype(str, i) { if (str.charCodeAt(i) >= 48 && str.charCodeAt(i) <= 57) { return 1; } else if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 122) { return 2; } else if (str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90) { return 3; } return 4; } function isregular(cur, pre, type) { var curCode = cur.charCodeAt(0); var preCode = pre.charCodeAt(0); if (curCode - preCode === 0) { return true; } if (type !== 4 && (curCode - preCode === 1 || curCode - preCode === -1)) { return true; } return false; } function getcomplex(curType, preType) { if (preType === 0 || curType === preType) { return 0; } else if (curType === 4 || preType === 4) { return 2; } else { return 1; } } /** * @desc: 计算密码复杂度(from:http://www.oschina.net/code/snippet_127301_17269) * @author: xuqi(qi.xu@yoho.cn) * @date: 2015/5/6 */ function computeComplex(password) { var complex = 0; var length = password.length; var pre = ''; var preType = 0; var i = 0; var cur = ''; var curType = ''; for (i; i < length; i++) { cur = password.charAt(i); curType = gettype(password, i); if (preType !== curType || !isregular(cur, pre, curType)) { complex += curType + getcomplex(curType, preType); } pre = cur; preType = curType; } return complex; } function showErrTip($dom, info) { $dom.find('em').text(info); $dom.removeClass('hide'); } function changeSecond() { second -= 1; if (second < 0) { second = 60; $('.validatewrapper').html(sendmessagehtml); return; } else { $('.second').text(second); window.setTimeout(changeSecond, 1000); } } /** * 启动倒计时 * @return {[type]} [description] */ function circleTime() { $('.validatewrapper').html(nopermissionoption); window.setTimeout(changeSecond, 1000); } function sendMessageValidate() { $(document).on('click', '#sendmessage', function() { circleTime(); $.ajax({ type: 'POST', url: '/passport/autouserinfo/sendBindMsg', data: { mobile: mobile, area: area } }).then(function(data) { if (data.code !== 200) { alert(data.message); } }); }); } function codeValidate() { var validatenum = ''; $(document).on('keyup', '#validatenum', function() { $('#err-info').hide(); validatenum = $(this).val(); if (validatenum.length === 4) { if (!dovalidate) { dovalidate = true; $.ajax({ type: 'POST', url: '/passport/autouserinfo/checkBindMsg', data: { code: validatenum, mobile: mobile, area: area } }).then(function(data) { dovalidate = false; if (data.code !== 200) { $('#err-info').show(); } else { isvalidatecode = true; } }); } } }); } function pwdKeyupEvt() { var pwd = $pwd.val(), pwdStrength = computeComplex(pwd), level = 0; if (pwdStrength === 0) { level = 0; } else if (pwdStrength <= 10) { level = 1; } else if (pwdStrength <= 20) { level = 2; } else { level = 3; } switch (level) { case 0: $pwdParent.removeClass('red yellow green'); $pwdIntensity.removeClass('color'); break; case 1: $pwdParent.addClass('red').removeClass('yellow green'); $pwdIntensity.filter('.low').addClass('color'); $pwdIntensity.filter('.mid,.high').removeClass('color'); break; case 2: $pwdParent.addClass('yellow').removeClass('red green'); $pwdIntensity.filter('.low,.mid').addClass('color'); $pwdIntensity.filter('.high').removeClass('color'); break; case 3: $pwdParent.addClass('green').removeClass('yellow red'); $pwdIntensity.addClass('color'); break; } if (pwd === '') { isvalidatepwd = false; $pwdTip1.removeClass('red yes no').addClass('default'); } else { if (pwd.length < 6 || pwd.length > 20) { isvalidatepwd = false; $pwdTip1.removeClass('default yes').addClass('no red'); } else { isvalidatepwd = true; $pwdTip1.removeClass('default no red').addClass('yes'); } if (/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]*$/.test(pwd)) { $pwdTip2.removeClass('default no red').addClass('yes'); } else { $pwdTip2.removeClass('default yes').addClass('no red'); } } } function validatePwd() { $(document).on('keyup', '.pwdcontent', function() { pwdKeyupEvt($(this)); }); $(document).on('focus', '.pwdcontent', function() { $('#pwd-tips').removeClass('hide'); }); $(document).on('blur', '.pwdcontent', function() { $('#pwd-tips').addClass('hide'); }); } /** * 最终提交表单 */ function actionSubmit() { var pwd = ''; var code = ''; // 查看提交状态,避免重复提交 if (submitStatus) { return; } submitStatus = true; setTimeout(function() { submitStatus = false; }, 50000); pwd = $('#pwd').val(); code = $('#validatenum').val(); $.ajax({ type: 'POST', url: '/passport/autouserinfo/bindMobile', data: { area: area, openId: $('#openId').val(), sourceType: $('#sourceType').val(), mobile: mobile, password: pwd, code: code } }).then(function(data) { submitStatus = false; if (data.code === 200) { if (data.data && data.data.refer) { window.location.href = data.data.refer; } else { window.location.href = '/passport/thirdlogin/bindsuccess'; } } else { alert(data.message); } }); } /** * 确定完善信息 * @return {[type]} [description] */ function actionConfirm() { var validatenum = ''; var pwd = ''; $('#confirmsubmit').on('click', function() { var isAssess = true; validatenum = $('#validatenum').val(); pwd = $('#pwd').val(); if (validatenum === '') { showErrTip($codeTip, '短信验证码不能为空'); isAssess = false; } else if (isvalidatecode === false) { showErrTip($codeTip, '请输入正确的验证码'); isAssess = false; } if (pwd === '') { showErrTip($pwdTip, '密码不能为空'); isAssess = false; } else if (pwd.length < 6 || pwd.length > 20) { showErrTip($pwdTip, '密码只支持6-20位字符'); isAssess = false; } else if (!pwdRegx.test(pwd)) { showErrTip($pwdTip, '密码须由字母和数字组合'); isAssess = false; } else if (isvalidatepwd === false) { showErrTip($pwdTip, '请输入符合强度的密码'); isAssess = false; } if (!isAssess) { return; } actionSubmit(); }); } function init() { $pwd = $('#pwd'); $pwdParent = $('.safelevel'); $pwdIntensity = $('.pwd-intensity'); $pwdTip1 = $('#pwd-tip1'); sendMessageValidate(); codeValidate(); validatePwd(); actionConfirm(); if (mobile && area) { $sendMsgBtn.click(); } } init(); }); define("js/cart/cart", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * @description: 购物车 * @author: chenglong.wang@yoho.cn * @tips: 购物车的商品计价在服务端处理,客户端只要在每次操作后刷新页面重新渲染就可以了 */ var $ = require("jquery"); var Handlerbars = require("handlebars"); var dialog = require("js/common/dialog"); var Confirm = dialog.Confirm; var Alert = dialog.Alert; var $cartnewSum = $('.cartnew-sum'), $cartnewTips = $('.cartnew-tips'), $payWapper = $('.pay-wapper'), $goodsDetail = $('.goods-detail'), $histroy = $('.histroy'), $together = $('.together'), $shopCart = $('.shop-cart'), $detailBigpic = $('.detail-bigpic'), togetherProductSource, togetherProductTemplate, togetherProductStr, subjoinPage, subjoinPageNum, subjoinPageAll, pageDom, selected, pageNum = 1, productNum, goodstype, delUrl, count, countJSON, id, dataJSON, pacList = 0, shopNum = 1, shopNumAll, productSku, promotionId, promotionPrice, yetCollect, collect, isClass, content, productId, shopName, delNum, understock, selectArray = []; // 关闭温馨提示 $cartnewTips.find('.btn_close').click(function() { $cartnewTips.fadeOut(); }); // checkbox提交ajax function choiceOut(data) { dataJSON = { skuList: JSON.stringify(data) }; $.ajax({ type: 'POST', dataType: 'json', url: '/cart/index/select', data: dataJSON, beforeSend: function() { $('.loading').css({ top: $(document).scrollTop() + 200 }); $('.loading').show(); } }).then(function(d) { if (d.code === 200) { window.history.go(0); } }); } //单选提交 $payWapper.on('click', '.common-sell-box input[type="checkbox"], .pre-sell-box input[type="checkbox"]', function() { selectArray = []; selected = $(this).attr('checked') ? 'Y' : 'N'; id = $(this).parents('tr').data('id'); productNum = $(this).parents('tr').data('productnum'); goodstype = $(this).data('goodstype'); selectArray.push({ product_sku: id, selected: selected, buy_number: productNum, goods_type: goodstype }); choiceOut(selectArray); }); //多选提交 $cartnewSum.on('click', 'input[type="checkbox"]', function() { selectArray = []; selected = $(this).attr('checked') ? 'Y' : 'N'; $('.pay-wapper:first tr').each(function() { if ($(this).data('id')) { selectArray.push({ product_sku: $(this).data('id'), selected: selected, buy_number: $(this).data('productnum'), goods_type: $(this).find('input[type="checkbox"]').data('goodstype') }); } }); choiceOut(selectArray); }); // 凑单商品,最近浏览异步加载 togetherProductSource = $('#togetherProduct').html(); togetherProductTemplate = Handlerbars.compile(togetherProductSource); function getTogetherProduct($obj, url, page) { $.ajax({ type: 'GET', dataType: 'json', url: url, data: page }).then(function(d) { if (d.code === 200) { if (d.data.item) { if (d.data.item.length > 0) { $obj.html(' '); togetherProductStr = togetherProductTemplate(d.data); $obj.append($(togetherProductStr)); $('#orderProduct li:last').addClass('end'); $('.gift').removeClass('none'); } } } }); } // 最近浏览 getTogetherProduct($histroy, '/cart/index/getHistroyProduct'); // 凑单商品 getTogetherProduct($together, '/cart/index/getTogetherProduct'); //凑单商品翻页 $together.on('click', '.pagenext, .pageprev', function() { getTogetherProduct($together, '/cart/index/getTogetherProduct', { page: Math.ceil(Math.random() * 100) + 1 }); }); //凑单商品,历史商品商品折叠 $shopCart.on('click', '.icon-minus, .icon-add', function() { if ($(this).hasClass('icon-minus')) { $(this).parents('.title').next('.main').hide(); $(this).parents('h2').next('.right').hide(); } else { $(this).parents('.title').next('.main').show(); $(this).parents('h2').next('.right').show(); } $(this).siblings('i').toggleClass('none'); $(this).toggleClass('none'); }); // 最近浏览翻页 $histroy.on('click', '.pagenext, .pageprev', function() { if ($(this).hasClass('pagenext')) { pageNum++; } else { --pageNum > 0 || (pageNum = 1); } getTogetherProduct($histroy, '/cart/index/getHistroyProduct', { page: pageNum }); }); //根据id获取商品信息 function productInfo(data) { $.ajax({ type: 'GET', dataType: 'html', url: '/cart/index/getProductInfo', data: data }).then(function(d) { $goodsDetail.html(' '); $goodsDetail.append(d); $('.bigpic :not(:first)').hide(); $('.detail-bigpic:first .con li:first').addClass('active'); if ($('.showSizeBox:not(.none) span:first').data('num') > 0) { $('.showSizeBox:not(.none) span:first').addClass('atcive'); } else { $('.addcart').addClass('none'); $('.btn_sellout').removeClass('none'); } $.each($('.showSizeBox span'), function() { if ($(this).data('num') <= 0) { $(this).addClass('nullAtcivec'); } }); if (typeof promotionPrice !== 'undefined') { $('.oldprice').html('现价:<del>' + $('.oldprice del').html() + '</div>'); $('.newprice').html('活动价<b class="promotion-price">' + promotionPrice + '</b>'); } $goodsDetail.show(); }); } function removeInfo() { $goodsDetail.html(' '); $goodsDetail.css({ top: $(document).scrollTop() + 30, left: $(document).width() / 2 - $goodsDetail.width() / 2 }); } //显示加价购商品信息 $payWapper.on('click', '.cart-add-btn', function() { productId = $(this).data('id'); promotionId = $(this).parents('table').data('promotion'); promotionPrice = $(this).parents('table').find('.subjoin-price').html(); removeInfo(); productInfo({ productId: productId }); }); //凑单商品,历史商品商品记录 $('.clearfix').on('click', '.btn_view_s', function() { productId = $(this).data('id'); promotionId = $(this).parents('table').data('promotion'); promotionPrice = $(this).parents('table').find('.subjoin-price').html(); removeInfo(); productInfo({ productId: productId }); }); //关闭商品信息窗口 $goodsDetail.on('click', '.colse', function() { $goodsDetail.hide(); $goodsDetail.html(' '); shopNum = 1; }); //展开加价购商品列表 function fold(icon) { icon.addClass('none').siblings('i').removeClass('none'); icon.parents('.cart-product-num').siblings('div').toggleClass('fold'); icon.siblings('.unfold-color').toggleClass('none'); icon.siblings('.cart-page').toggleClass('none'); } $payWapper.on('click', '.icon-minusCart, .icon-addCart', function() { fold($(this)); }); $payWapper.on('click', '.unfold-color', function() { fold($(this)); $(this).siblings('.icon-minusCart').removeClass('none'); $(this).siblings('.icon-addCart').addClass('none'); }); //加价购商品分页 $payWapper.on('click', '.cart-btn-next', function() { subjoinPage = $(this).siblings('p').find('.f-red'); subjoinPageAll = Number($(this).siblings('p').find('.subjoinPageNum').html()); subjoinPageNum = Number(subjoinPage.html()); subjoinPage.html(subjoinPageNum + 1); if (subjoinPageNum >= subjoinPageAll - 1) { $(this).hide(); } else { $(this).siblings('i').show(); } pageDom = $(this).parents('.cart-product-num').siblings('div').find('table'); pageDom.addClass('none').eq(subjoinPageNum).removeClass('none'); }); $payWapper.on('click', '.cart-btn-pre', function() { subjoinPage = $(this).siblings('p').find('.f-red'); subjoinPageAll = Number($(this).siblings('p').find('.subjoinPageNum').html()); subjoinPageNum = Number(subjoinPage.html()); subjoinPage.html(subjoinPageNum - 1); if (subjoinPageNum <= 2) { $(this).hide(); } else { $(this).siblings('i').show(); } pageDom = $(this).parents('.cart-product-num').siblings('div').find('table'); pageDom.addClass('none').eq(subjoinPageNum - 2).removeClass('none'); }); //删除购物车商品,把删除的商品移入cookie中 function cartDel(data, delUrl, cookieList) { dataJSON = { skuList: JSON.stringify(data) }; $.ajax({ type: 'POST', dataType: 'json', url: delUrl, data: dataJSON, beforeSend: function() { $('.loading').css({ top: $(document).scrollTop() + 200 }); $('.loading').show(); } }).then(function(d) { if (d.code === 200) { if (cookieList) { window.setCookie('cart-del-list', JSON.stringify(cookieList), { domain: '.yohobuy.com', path: '/' }); } window.history.go(0); } else if (d.code === 300) { $('.loading').hide(); new Alert(d.message).show(); } else if (d.code === 403) { if (d.data.url) { window.location = d.data.url; } } }); } //商品信息弹出框,加入收藏夹 $goodsDetail.on('click', '.fav_count', function() { $.ajax({ type: 'POST', dataType: 'json', url: '/product/item/togglecollect', data: { productId: productId, type: 'add' } }).then(function(d) { if (d.code === 200) { new Alert(d.message).show(); } else if (d.code === 403) { if (d.data.url) { window.location = d.data.url; } } else { new Alert(d.message).show(); } }); }); //删除商品 $payWapper.on('click', '.cart-del-btn', function() { id = {}; countJSON = {}; isClass = $(this).attr('class'); productNum = $(this).parents('tr').data('productnum'); id['' + $(this).parents('tr').data('id')] = productNum; content = '<div><span></span>删除商品</div>' + '<p>确定从购物车中删除此商品?</p>'; if (!$(this).data('gift')) { countJSON = { productPrice: $(this).parents('tr').find('.productPrice').text(), productTitle: $(this).parents('tr').find('.pay-pro-info a').text(), link: $(this).parents('tr').find('.pay-pro-info a').attr('href'), productNum: $(this).parents('tr').data('productnum'), productSku: $(this).parents('tr').data('id') }; } delUrl = '/cart/index/remove'; new Confirm({ content: content, cb: function() { cartDel(id, delUrl, countJSON); } }).show(); }); //移入收藏夹 $payWapper.on('click', '.cart-remove-btn', function() { id = {}; isClass = $(this).attr('class'); productNum = $(this).parents('tr').data('productnum'); id['' + $(this).parents('tr').data('id')] = productNum; cartDel(id, '/cart/index/fav'); }); //批量删除商品 $cartnewSum.on('click', '.delAll', function() { id = {}; selectArray = []; $('.pay-wapper:first tr').each(function() { if ($(this).data('id')) { if ($(this).find('input[type="checkbox"]').attr('checked')) { id['' + $(this).data('id')] = $(this).data('productnum'); countJSON = { productPrice: $(this).find('.productPrice').text(), productTitle: $(this).find('.pay-pro-info a').text(), link: $(this).find('.pay-pro-info a').attr('href'), productNum: $(this).data('productnum'), productSku: $(this).data('id') }; selectArray.push(countJSON); } } }); delUrl = '/cart/index/remove'; content = '<div><span></span>删除商品</div>' + '<p>确定从购物车中删除所有选中商品?</p>'; if (!$.isEmptyObject(id)) { new Confirm({ content: content, cb: function() { cartDel(id, delUrl, selectArray); } }).show(); } else { new Alert('请至少选择一件商品').show(); } }); //批量移入收藏夹商品 $cartnewSum.on('click', '.removeAll', function() { id = {}; $('.pay-wapper:first tr').each(function() { if ($(this).data('id')) { if ($(this).find('input[type="checkbox"]').attr('checked')) { id['' + $(this).data('id')] = $(this).data('productnum'); } } }); if (!$.isEmptyObject(id)) { cartDel(id, '/cart/index/fav'); } else { new Alert('请至少选择一件商品').show(); } }); //购物车商品增减 function countAJAX(data) { $.ajax({ type: 'POST', dataType: 'json', url: '/cart/index/modify', data: data }).then(function(d) { if (d.code === 200) { window.history.go(0); } }); } $payWapper.on('click', '.minus, .plus', function() { countJSON = {}; count = $(this).hasClass('minus') ? 'decreaseNum' : 'increaseNum'; countJSON['' + count] = 1; if ($(this).siblings('input').val() === '1' && $(this).hasClass('minus')) { id = {}; isClass = $(this).attr('class'); productNum = $(this).parents('tr').data('productnum'); id['' + $(this).parents('tr').data('id')] = productNum; content = '<div><span></span>删除商品</div>' + '<p>确定从购物车中删除此商品?</p>'; countJSON = { productPrice: $(this).parents('tr').find('.productPrice').text(), productTitle: $(this).parents('tr').find('.pay-pro-info a').text(), link: $(this).parents('tr').find('.pay-pro-info a').attr('href'), productNum: $(this).parents('tr').data('productnum'), productSku: $(this).parents('tr').data('id') }; delUrl = '/cart/index/remove'; // new Confirm({ // content: content, // cb: function() { // cartDel(id, delUrl); // } // }).show(); return false; } countAJAX($.extend(countJSON, { sku: $(this).parents('tr').data('id') } )); }); $('.gift').on('click', '.up, .down', function() { $(this).siblings('i').toggleClass('none'); $(this).toggleClass('none'); }); //加入购物车 function addcart(data, cookieList) { $.ajax({ type: 'POST', url: '/cart/index/add', data: data }).then(function(d) { if (d.code === 200) { window.history.go(0); if (cookieList) { window.setCookie('cart-del-list', JSON.stringify(cookieList), { domain: '.yohobuy.com', path: '/' }); } } else if (d.code === 500) { new Alert(d.message).show(); } }); } $goodsDetail.on('click', '.addcart', function() { shopNumAll = $('.showSizeBox:not(.none) .atcive').data('num'); productSku = $('.showSizeBox:not(.none) .atcive').data('sku'); dataJSON = { productSku: productSku, buyNumber: $('#mnum').val(), promotionId: promotionId }; if ($('#mnum').val() > shopNumAll) { new Alert('库存不足,目前还有' + shopNumAll + '个库存').show(); } else { addcart(dataJSON); } }); $goodsDetail.on('click', '.cut, .add', function() { count = $(this).hasClass('minus') ? 'decreaseNum' : 'increaseNum'; if (promotionId) { if ($(this).hasClass('cut')) { new Alert('-_-,已经是最后一件,不能在减了!').show(); } else { new Alert('最多只能购买1,您好像购买的太多了!').show(); } } else { if ($(this).hasClass('add')) { shopNum++; } else { shopNum--; } if (shopNum < 1) { new Alert('-_-,已经是最后一件,不能在减了!').show(); return false; } $('#mnum').val(shopNum); } }); $goodsDetail.on('click', '.color', function() { $('.color').find('p').removeClass('atcive'); $(this).find('p').addClass('atcive'); $('.showSizeBox').addClass('none').eq($(this).index()).removeClass('none'); if ($('.showSizeBox:not(.none) span:first').data('num') > 0) { $('.showSizeBox:not(.none) span:first').addClass('atcive'); $('.addcart').removeClass('none'); $('.btn_sellout').addClass('none'); } else { $('.showSizeBox:not(.none) span:first').addClass('atcivec'); $('.addcart').addClass('none'); $('.btn_sellout').removeClass('none'); } $detailBigpic.addClass('none').eq($(this).index()).removeClass('none'); $detailBigpic.eq($(this).index()).find('.bigpic:first').show(); $detailBigpic.eq($(this).index()).find('.con li:first').addClass('active'); }); $goodsDetail.on('click', '.showSizeBox span', function() { shopNumAll = $(this).data('num'); if ($(this).data('num') > 0) { $('.showSizeBox:not(.none) span').removeClass('atcivec atcive').eq($(this).index()).addClass('atcive'); $('.addcart').removeClass('none'); $('.btn_sellout').addClass('none'); } else { $('.showSizeBox:not(.none) span').removeClass('atcivec atcive').eq($(this).index()).addClass('atcivec'); $('.addcart').addClass('none'); $('.btn_sellout').removeClass('none'); } }); //撤销删除 $('.goBack').on('click', function() { delNum = $('.dev-revocation .goBack').index(this); selectArray = []; $('.dev-revocation tr').each(function(index) { if (delNum !== index) { countJSON = { productPrice: $(this).find('.productPrice').text(), productTitle: $(this).find('.title').text(), link: $(this).find('.title').attr('href'), productNum: $(this).data('productnum'), productSku: $(this).data('productsku') }; selectArray.push(countJSON); } }); dataJSON = { productSku: $(this).parents('tr').data('productsku'), buyNumber: $(this).parents('tr').data('productnum') }; addcart(dataJSON, selectArray); }); $goodsDetail.on('click', '.piclist li', function() { pacList = $(this).index(); $('.detail-bigpic:not(.none) .piclist li').removeClass('active'); $(this).addClass('active'); $('.detail-bigpic:not(.none) .bigpic').hide().eq($(this).index()).show(); }); function isSollect() { $('.gift-wrapper .fold').show(); if ($('.pre-sell-box input:checked').length === $('.pre-sell-box input[type="checkbox"]').length) { $('.per-list input[type="checkbox"]').attr('checked', true); } if ($('.common-sell-box input:checked').length === $('.common-sell-box input[type="checkbox"]').length) { $('.common-list input[type="checkbox"]').attr('checked', true); } $('.cart-page').each(function() { if ($(this).data('pageall') === 1) { $('.cart-btn-pre', this).hide(); $('.cart-btn-next', this).hide(); } else { $('.cart-btn-pre', this).hide(); } }); if ($('.pre-sell-box input:checked').length > 0 && $('.common-sell-box input:checked').length > 0) { $('.go_cash_tips').show(); $('.btn_account_disabled').show(); $('.btn_account').hide(); } else { $('.go_cash_tips').hide(); $('.btn_account').show(); $('.btn_account_disabled').hide(); } $('.pay-wapper tr').each(function() { if ($(this).data('pid')) { selectArray.push($(this).data('pid') + ''); } }); $.ajax({ type: 'POST', url: '/cart/index/checkFav', data: { pidList: JSON.stringify(selectArray) } }).then(function(d) { yetCollect = '<span class="cart-yetremove-btn">已收藏</span>'; collect = '<a href="javascript:void(0);" class="cart-remove-btn"><span>移入收藏</span></a>'; $.each(d.data, function(key, val, index) { $('.pay-wapper tr').each(function() { if (Number($(this).data('pid')) === Number(key)) { if (val) { $(this).find('.cart-operation').append(yetCollect); } else { $(this).find('.cart-operation').append(collect); } } }); }); }); } isSollect(); $goodsDetail.on('click', '.pre, .next', function() { if ($(this).hasClass('next')) { if (pacList > $(this).siblings('.con').find('li').length - 2) { return false; } pacList++; } else { if (pacList < 1) { return false; } pacList--; } $(this).siblings('.con').find('li').removeClass('active').eq(pacList).addClass('active'); $('.bigpic').hide().eq(pacList).show(); }); //结算 $('.btn_account').on('click', function() { understock = ''; if ($('.pay-wapper input:checked').parents('tr').find('.tipNoStore').length > 0) { shopName = $('.pay-wapper input:checked').parents('tr').find('.tipNoStore'); $.each(shopName.parents('.common-sell-box').find('.pay-pro-info a'), function() { understock += $(this).html(); }); new Alert(understock + '库存不足').show(); } else { if ($('.zp').length > 0 && !$(this).attr('title')) { $(this).attr('title', '1'); new Alert('您有赠品没有选择,请选择完再结算!').show(); } else { if ($('input:checked').length > 0) { if ($('.pre-sell-box input:checked').length > 0) { window.location.href = '/cart/index/orderEnsure?type=2'; } else { window.location.href = '/cart/index/orderEnsure?type=1'; } } else { new Alert('请至少选择一件商品').show(); } } } }); function isCheck(obj, className) { selectArray = []; selected = obj.attr('checked') ? 'Y' : 'N'; $('.' + className).each(function() { if ($(this).data('id')) { selectArray.push({ product_sku: $(this).data('id'), selected: selected, buy_number: $(this).data('productnum'), goods_type: $(this).find('input[type="checkbox"]').data('goodstype') }); } }); choiceOut(selectArray); } $('.per-list').on('click', 'input[type="checkbox"]', function() { isCheck($(this), 'pre-sell-box'); }); $('.common-list').on('click', 'input[type="checkbox"]', function() { isCheck($(this), 'common-sell-box'); }); }); define("js/home/entry", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 个人中心页js打包入口文件 * @author: zhaobiao<bill.zhao@yoho.cn> * @date: 2016/02/17 */ require("js/home/index"); require("js/home/orders"); require("js/home/favorite"); require("js/home/returns"); require("js/home/comment"); require("js/home/edit"); require("js/home/gift"); require("js/home/validate"); require("js/home/address"); require("js/home/common-address"); }); define("js/home/index", ["jquery"], function(require, exports, module){ /** * 个人中心首页 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/2/17 */ var $ = require("jquery"); //关闭消息提示 $('#close-message').click(function() { $('.message-tip').slideUp(200); }); //新品上架 (function() { var $naPager = $('.na-pager'), $naUl = $('.new-arrival ul'), naPage = Math.ceil($naUl.children('li').length / 5), naItemWith = $naUl.children('li:last-child').outerWidth(), naCurPage = 1; $naUl.width($naUl.width() * naPage); //最新上架翻页 $naPager.click(function() { var $this = $(this), left; if ($this.hasClass('next')) { //后翻 ++naCurPage; //第2页显示前翻按钮 if (naCurPage === 2) { $this.siblings().removeClass('no-visible'); } //最后一页隐藏后翻按钮 if (naCurPage === naPage) { $this.addClass('no-visible'); } } else { //前翻 --naCurPage; //倒数第2页显示后翻按钮 if (naCurPage === naPage - 1) { $this.siblings().removeClass('no-visible'); } //第1页隐藏前翻按钮 if (naCurPage === 1) { $this.addClass('no-visible'); } } left = -5 * (naCurPage - 1) * naItemWith; $naUl.animate({ marginLeft: left }, 400); }); }()); }); define("js/home/orders", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 我的订单 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/2/17 */ require("js/home/order-block"); }); define("js/home/order-block", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 订单 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/2/17 */ var $ = require("jquery"); var dialog = require("js/common/dialog"); var Dialog = dialog.Dialog; var Confirm = dialog.Confirm; var $tpl = $('#cancel-dialog-tpl'); var html = $tpl.html(); var active; function dialogFactory(id) { var options = { mask: false, btns: [ { id: 'cancel-sure', name: '确定并取消订单', btnClass: ['cancel-sure'], cb: function() { var $checked = $('.cancel-dialog :checked'); $.ajax({ type: 'POST', url: '/home/orders/cancelorder', data: { orderCode: id, reason: $checked.length > 0 ? $checked.val() : '' } }).then(function(data) { if (data.code === 200) { active.close(); history.go(0); } else { $('.cancel-dialog .cancel-tip').html(data.message); } }); } }, { id: 'cancel-no', name: '取消', btnClass: ['cancel-no'], cb: function() { active.close(); } } ], content: html, className: 'cancel-dialog' }; return new Dialog(options); } $tpl.remove(); //查看物流 $('.check-logistics').click(function() { $(this).parent().siblings('.logistics').removeClass('hide'); }); $('.close-logistics').click(function() { $(this).closest('.logistics').addClass('hide'); }); $('.me-orders').on('click', '.cancel-order', function(e) { //取消订单 active = dialogFactory($(this).closest('.order').data('id')); active.show(); }).on('click', '.confirm-received', function(e) { var id = $(this).closest('.order').data('id'); //确认收货 active = new Confirm({ cb: function() { $.ajax({ type: 'POST', url: '/home/orders/confirmorder', data: { orderCode: id } }).then(function(data) { if (data.code === 200) { active.close(); history.go(0); } }); }, content: '您确定要确认收货吗?' }); active.show(); }); }); define("js/home/favorite", ["jquery"], function(require, exports, module){ /** * 我的收藏 * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/2/23 */ var $ = require("jquery"); var phoneReg = require("js/passport/mail-phone-regx").phoneRegx['+86']; var clockTxt = { on: '[ 降价通知 ]', off: '[ 取消通知 ]' }; var favType; var curSkn; var $curClock; //商品收藏 (function() { var $defaultSorts, $allSorts; var $bodyMask, $priceNotice, $noticeContent, $noticeSuccess, $noticeSubOrCancel; //关闭价格订阅弹窗和蒙层 function closeNoticeBox() { $bodyMask.addClass('hide'); $priceNotice.addClass('hide'); //重置头部文字 $noticeSubOrCancel.text('订阅成功'); } //显示价格订阅弹窗和蒙层 function showNoticeBox() { if (typeof $bodyMask === 'undefined') { $('body').append('<div class="body-mask hide"></div>'); $bodyMask = $('.body-mask'); } $bodyMask.css({ height: $(document).height(), width: $(document).width() }).removeClass('hide'); if ($curClock.hasClass('noticed')) { //取消降价通知 $.ajax({ type: 'GET', url: '/home/favorite/cancelnotice', data: { skn: curSkn } }).then(function(data) { if (data.code === 200) { $noticeContent.addClass('hide'); $noticeSuccess.removeClass('hide').find('.notice-num').text(data.data.num); $noticeSubOrCancel.text('取消成功'); if ($curClock.closest('.reduction-products').length > 0) { $curClock.closest('.fav-good').remove(); } else { $curClock.text(clockTxt.on); } } }); } $priceNotice.removeClass('hide'); } if ($('.fav-products').length === 0) { return; } favType = 'products'; $defaultSorts = $('.default-sorts'); $allSorts = $('.all-sorts'); $priceNotice = $('.price-notice'); $noticeContent = $('#price-notice .content'); $noticeSuccess = $('#price-notice .success'); $noticeSubOrCancel = $noticeSuccess.find('.subscribe-or-cancel'); //展开分类 $('#spread-sort').click(function() { $defaultSorts.slideUp(function() { $allSorts.slideDown(); }); }); //收起分类 $('#retract-sort').click(function() { $allSorts.slideUp(function() { $defaultSorts.slideDown(); }); }); //降价通知 $('.price-down-clock').click(function() { $curClock = $(this), showNoticeBox(); curSkn = $curClock.closest('.fav-good').data('skn'); }); //降价通知确定按钮 $('#price-notice').on('click', '.close', function() { closeNoticeBox(); }).on('click', '.price-notice-sure', function() { var $phone = $('#notice-phone-num'), phone, errTxt; if ($noticeSuccess.hasClass('hide')) { //订阅到手机号 phone = $.trim($phone.val()); if (phone === '' || !phoneReg.test(phone)) { errTxt = phone === '' ? '请输入手机号码' : '手机号码格式不正确'; $phone.addClass('error'); $('#price-notice .err-text').removeClass('hide').find('em').html(errTxt); return; } else { $phone.removeClass('error'); $('#price-notice .err-text').addClass('hide'); } $.ajax({ type: 'GET', url: '/home/favorite/notice', data: { phone: phone, skn: curSkn } }).then(function(data) { if (data.code === 200) { $noticeSuccess.removeClass('hide'); $noticeContent.addClass('hide'); $noticeSuccess.find('.notice-num').html(data.data.num); //切换商品通知文字 $curClock.toggleClass('noticed').text(clockTxt.off); } }); } else { //关闭窗口 closeNoticeBox(); } }); //商品可参加活动 $('.has-activity').click(function() { var $this = $(this), $activites = $this.next('.activites'), $li = $this.closest('li'); if ($activites.hasClass('hide')) { //显示 $activites.removeClass('hide'); $li.css('padding-bottom', $activites.outerHeight()); } else { //隐藏 $activites.addClass('hide'); $li.css('padding-bottom', ''); } }); }()); //品牌收藏 (function() { if ($('.fav-brands').length === 0) { return; } // 新品到着 $('.na-not-zero').click(function() { var $this = $(this), $naList = $this.next('.na-list'), $li = $this.closest('li'); if (!$naList.hasClass('hide')) { $naList.addClass('hide'); $li.css('padding-bottom', ''); return; } $.ajax({ type: 'GET', url: '/home/newproduct' }).then(function(html) { $naList.removeClass('hide').find('.na-content').html(html); $li.css('padding-bottom', $naList.outerHeight() + 10); }); }); $('.na-content').on('click', '.na-pre, .na-next', function() { var $this = $(this), url = $this.data('url'); $.ajax({ type: 'GET', url: url }).then(function(html) { $this.closest('.na-content').html(html); }); }); }()); //全选【通用】 $('#me-checkall').click(function() { $('.checkbox input[type="checkbox"]').prop('checked', $(this).prop('checked')); }); //删除多个商品/品牌/文章【通用】 $('#me-del-checked').click(function() { var ids = [], url; $('.checkbox input[type="checkbox"]:checked').each(function() { ids.push($(this).closest('.fav-row').data('id')); }); if (ids.length === 0) { return; } switch (favType) { case 'products': url = '/home/favorite/multidelgoods'; break; case 'brands': url = '/home/favorite/multidelbrands'; break; case 'articles': url = '/home/favorite/multidelarticles'; break; } $.ajax({ type: 'GET', url: url, data: { ids: ids } }).then(function(data) { if (data.code === 200) { window.history.go(0); } }); }); }); define("js/home/returns", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 我的退/换货 * @author: yyqing<yanqing.yang@yoho.cn> * @date: 2016/2/26 */ require("js/home/returns-detail"); require("js/home/returns-apply"); }); define("js/home/returns-detail", ["jquery"], function(require, exports, module){ /** * 退换货详情 * @author: yyqing<yanqing.yang@yoho.cn> * @date: 2016/2/26 */ var $ = require("jquery"); var $detail = $('.detail-container'), $courierCode = $('.courier-code'), $expressCompany = $('#express-company'), $expressNumber = $('#express-number'), $expressViewBox = $('.express-view-box > span'); var returnId = $('#return-id').val(), expId = $('#express-old-id').val(), expNumber = $expressNumber.val(), expCompany = '', expList = {}, isChange = false; function syncExpressInfo() { expCompany = expList[expId] ? expList[expId] : ''; $expressViewBox.html(expCompany + ' 快递单号:' + expNumber); $expressCompany.val(expId); $expressNumber.val(expNumber); } function validateExpress() { var send = {}; send.number = $expressNumber.val(); send.id = $expressCompany.val() * 1; if (!send.id) { alert('请选择快递公司'); } else if (!send.number) { alert('请填入快递单号'); } else { return send; } return false; } function sendExpressCode() { var sendParm = validateExpress(); if (!sendParm) { return; } $.ajax({ type: 'POST', url: '/home/returns/setExpressNumber', data: { id: returnId, isChange: isChange, expressId: sendParm.id, expressNumber: sendParm.number, expressCompany: expList[sendParm.id] } }).then(function(jsonData) { if (jsonData.code === 200) { expId = sendParm.id; expNumber = sendParm.number; } else { alert(jsonData.message); } syncExpressInfo(); $courierCode.removeClass('in-edit'); }); } if ($detail.parent().hasClass('exchange-detail')) { isChange = true; } $expressCompany.val(expId); $detail.find('.company-list').each(function() { var data = $(this).data(); expList[data.id] = data.name; }); $('#modify').click(function() { $courierCode.addClass('in-edit'); }); $('#submit-btn').click(function() { sendExpressCode(); }); }); define("js/home/returns-apply", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 退换货申请 * @author: yyqing<yanqing.yang@yoho.cn> * @date: 2016/2/29 */ var $ = require("jquery"), Addr = require("js/home/common-address"); var $goosTable = $('#goods-table'), $reasons = $goosTable.find('.return-reason'), $file = $goosTable.find('input[type=file]'); var $exchange = $('.exchange-detail'), defaultArea = $exchange.find('input[name="hide-area"]').val(); require("plugin/jquery.upload"); defaultArea = defaultArea ? defaultArea : ''; Addr.loadAllData(defaultArea, { areaDomId: 'area' }); $reasons.change(function() { var $par = $(this).parent().parent(), type = $(this).val() * 1; if (type === 4 || type === 6 || type === 8) { $par.next().show(); } else { $par.next().hide(); } }); $goosTable.find('.up-image-list li').on('click', '.btn-del', function() { $(this).parent().empty(); }); $file.each(function(e) { $('#upload-img-' + e).upload({ auto: true, buttonClass: 'upload-img-btn', fileType: 'image/*', uploadScript: '/home/suggestimgUpload', fileObjName: 'fileData', fileSizeLimit: 5000, buttonText: '上传图片', height: 34, width: 116, multi: false, onUploadComplete: function(file, data) { var $par = $(this).closest('.problem-description'), $imgList = $par.find('li'), isShow = false, img, _html; img = JSON.parse(data).imgList[0]; _html = '<span class="btn-del" title="删除"></span>' + '<img src="' + img.imgUrl + '" width="126" height="126">'; $imgList.each(function() { if (!isShow && !$(this).find('img').length) { isShow = true; $(this).html(_html); } }); }, onError: function(info, fileType, data) { var msg = '图片上传失败!'; if (info === 'FILE_SIZE_LIMIT_EXCEEDED') { msg = '图片大小超出限制!'; } alert(msg); } }); }); }); define("js/home/common-address", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 个人中心页-地址管理 * @author: wsl<shuiling.wang@yoho.cn> * @date: 2016/02/24 */ var $ = require("jquery"), dialog = require("js/common/dialog"), Alert = dialog.Alert; var address = { // 省的控件ID provinceDomId: 'province', // 城市的控件ID cityDomId: 'city', // 地区的控件ID areaDomId: 'areaCode', initDomIds: function(domOptions) { var the = this; if (domOptions.provinceDomId !== undefined) { the.provinceDomId = domOptions.provinceDomId; } if (domOptions.cityDomId !== undefined) { the.cityDomId = domOptions.cityDomId; } if (domOptions.areaDomId !== undefined) { the.areaDomId = domOptions.areaDomId; } }, // 初始化地址数据 loadAreaData: function(pCode, toDomId, defaultValue, allCode) { var $toDom = $('#' + toDomId), i = 0, point = ''; var active, val, nId, selecter; $toDom.empty(); if (pCode < 91) { $('#areaCode').empty(); $('#county').attr('disabled', 'disabled'); } $.ajax({ type: 'GET', url: '/home/address/area', data: 'id=' + pCode, success: function(jsonData) { jsonData.code = 200; if (jsonData.code !== 200) { active = new Alert('暂无数据'); active.show(); return false; } $toDom.append('<option value="0">' + defaultValue + '</option>'); for (i in jsonData.options) { if (jsonData.options[i]) { val = jsonData.options[i]; point = (toDomId === 'areaCode' && val.is_support === 'Y') ? '*' : ''; nId = val.value; selecter = ''; if (typeof (allCode) !== 'undefined' && allCode !== 0 && nId === allCode.substr(0, nId.length)) { selecter = 'selected'; } $toDom.append('<option value="' + nId + '" ' + selecter + '>' + point + val.text + '</option>'); } } } }); }, bindAreaChange: function(domOptions) { var the = this; if ($('#' + the.provinceDomId).data('events') !== undefined) { return; } // 初始化 $('#' + the.provinceDomId).change(function() { var pCode = $('#' + the.provinceDomId).val(); if (pCode === '0') { return; } the.loadAreaData(pCode, the.cityDomId, '请选择城市', pCode); $('#' + the.areaDomId).hide(); the.showAreaSel(domOptions.dispDomId); }); $('#' + this.cityDomId).change(function() { var pCode = $('#' + the.cityDomId).val(); if (pCode === '0') { return; } the.loadAreaData(pCode, the.areaDomId, '请选择区县', pCode); $('#' + the.areaDomId).show(); the.showAreaSel(domOptions.dispDomId); }); $('#' + the.areaDomId).change(function() { the.showAreaSel(domOptions.dispDomId); }); the.showAreaSel(domOptions.dispDomId); }, /** * 显示地区选择 */ showAreaSel: function(dispDomId) { var the = this, strAddr = '', strProvince = $('#' + the.provinceDomId).find('option:selected').text(), strCity = $('#' + the.cityDomId).find('option:selected').text(), strArea = $('#' + the.areaDomId).find('option:selected').text(); if (dispDomId !== undefined && dispDomId !== '') { if (strProvince.indexOf('选择') < 0) { strAddr = strProvince; } if (strCity !== '' && strCity.indexOf('选择') < 0) { strAddr += ',' + strCity; } if (strArea !== '' && strArea.indexOf('选择') < 0) { strAddr += ',' + strArea; } $('#' + dispDomId).html(strAddr); } }, loadAllData: function(areaCode, domOptions) { var the = this; the.initDomIds(domOptions); areaCode += ''; if (areaCode < 91) { the.loadAreaData(0, the.provinceDomId, '请选择省份', ''); $('#' + the.areaDomId).hide(); $('#' + the.cityDomId).html('<option value="0">请选择市</option>'); } else if (areaCode.length === 4) { the.loadAreaData(0, the.provinceDomId, '请选择省份', areaCode); the.loadAreaData(areaCode.substr(0, 2), the.cityDomId, '请选择城市', areaCode); the.loadAreaData(areaCode, the.areaDomId, '请选择区县', areaCode); $('#' + the.areaDomId).show(); } else if (areaCode.length === 6) { the.loadAreaData(0, the.provinceDomId, '请选择省份', areaCode); the.loadAreaData(areaCode.substr(0, 2), the.cityDomId, '请选择城市', areaCode); the.loadAreaData(areaCode.substr(0, 4), the.areaDomId, '请选择区县', areaCode); $('#' + this.areaDomId).show(); } the.bindAreaChange(domOptions); } }; module.exports = address; }); define("plugin/jquery.upload", ["jquery"], function(require, exports, module){ /* UploadiFive 1.2.2 Copyright (c) 2012 Reactive Apps, Ronnie Garcia Released under the UploadiFive Standard License <http://www.uploadify.com/uploadifive-standard-license> */ var jQuery = require("jquery"); ;(function($) { var methods = { init : function(options) { return this.each(function() { // Create a reference to the jQuery DOM object var $this = $(this); $this.data('uploadifive', { inputs : {}, // The object that contains all the file inputs inputCount : 0, // The total number of file inputs created fileID : 0, queue : { count : 0, // Total number of files in the queue selected : 0, // Number of files selected in the last select operation replaced : 0, // Number of files replaced in the last select operation errors : 0, // Number of files that returned an error in the last select operation queued : 0, // Number of files added to the queue in the last select operation cancelled : 0 // Total number of files that have been cancelled or removed from the queue }, uploads : { current : 0, // Number of files currently being uploaded attempts : 0, // Number of file uploads attempted in the last upload operation successful : 0, // Number of files successfully uploaded in the last upload operation errors : 0, // Number of files returning errors in the last upload operation count : 0 // Total number of files uploaded successfully } }); var $data = $this.data('uploadifive'); // Set the default options var settings = $data.settings = $.extend({ 'auto' : true, // Automatically upload a file when it's added to the queue 'buttonClass' : false, // A class to add to the UploadiFive button 'buttonText' : 'Select Files', // The text that appears on the UploadiFive button 'checkScript' : false, // Path to the script that checks for existing file names 'dnd' : true, // Allow drag and drop into the queue 'dropTarget' : false, // Selector for the drop target 'fileObjName' : 'Filedata', // The name of the file object to use in your server-side script 'fileSizeLimit' : 0, // Maximum allowed size of files to upload 'fileType' : false, // Type of files allowed (image, etc), separate with a pipe character | 'formData' : {}, // Additional data to send to the upload script 'height' : 30, // The height of the button 'itemTemplate' : false, // The HTML markup for the item in the queue 'method' : 'post', // The method to use when submitting the upload 'multi' : true, // Set to true to allow multiple file selections 'overrideEvents' : [], // An array of events to override 'queueID' : false, // The ID of the file queue 'queueSizeLimit' : 0, // The maximum number of files that can be in the queue 'removeCompleted' : false, // Set to true to remove files that have completed uploading 'simUploadLimit' : 0, // The maximum number of files to upload at once 'truncateLength' : 0, // The length to truncate the file names to 'uploadLimit' : 0, // The maximum number of files you can upload 'uploadScript' : 'uploadifive.php', // The path to the upload script 'width' : 100 // The width of the button /* // Events 'onAddQueueItem' : function(file) {}, // Triggered for each file that is added to the queue 'onCancel' : function(file) {}, // Triggered when a file is cancelled or removed from the queue 'onCheck' : function(file, exists) {}, // Triggered when the server is checked for an existing file 'onClearQueue' : function(queue) {}, // Triggered during the clearQueue function 'onDestroy' : function() {} // Triggered during the destroy function 'onDrop' : function(files, numberOfFilesDropped) {}, // Triggered when files are dropped into the file queue 'onError' : function(file, fileType, data) {}, // Triggered when an error occurs 'onFallback' : function() {}, // Triggered if the HTML5 File API is not supported by the browser 'onInit' : function() {}, // Triggered when UploadiFive if initialized 'onQueueComplete' : function() {}, // Triggered once when an upload queue is done 'onProgress' : function(file, event) {}, // Triggered during each progress update of an upload 'onSelect' : function() {}, // Triggered once when files are selected from a dialog box 'onUpload' : function(file) {}, // Triggered when an upload queue is started 'onUploadComplete' : function(file, data) {}, // Triggered when a file is successfully uploaded 'onUploadFile' : function(file) {}, // Triggered for each file being uploaded */ }, options); // Calculate the file size limit if (isNaN(settings.fileSizeLimit)) { var fileSizeLimitBytes = parseInt(settings.fileSizeLimit) * 1.024 if (settings.fileSizeLimit.indexOf('KB') > -1) { settings.fileSizeLimit = fileSizeLimitBytes * 1000; } else if (settings.fileSizeLimit.indexOf('MB') > -1) { settings.fileSizeLimit = fileSizeLimitBytes * 1000000; } else if (settings.fileSizeLimit.indexOf('GB') > -1) { settings.fileSizeLimit = fileSizeLimitBytes * 1000000000; } } else { settings.fileSizeLimit = settings.fileSizeLimit * 1024; } // Create a template for a file input $data.inputTemplate = $('<input type="file">') .css({ 'font-size' : settings.height + 'px', 'opacity' : 0, 'position' : 'absolute', 'right' : '-3px', 'top' : '-3px', 'z-index' : 999 }); // Create a new input $data.createInput = function() { // Create a clone of the file input var input = $data.inputTemplate.clone(); // Create a unique name for the input item var inputName = input.name = 'input' + $data.inputCount++; // Set the multiple attribute if (settings.multi) { input.attr('multiple', true); } // Set the accept attribute on the input if (settings.fileType) { input.attr('accept', settings.fileType); } // Set the onchange event for the input input.bind('change', function() { $data.queue.selected = 0; $data.queue.replaced = 0; $data.queue.errors = 0; $data.queue.queued = 0; // Add a queue item to the queue for each file var limit = this.files.length; $data.queue.selected = limit; if (($data.queue.count + limit) > settings.queueSizeLimit && settings.queueSizeLimit !== 0) { if ($.inArray('onError', settings.overrideEvents) < 0) { alert('The maximum number of queue items has been reached (' + settings.queueSizeLimit + '). Please select fewer files.'); } // Trigger the error event if (typeof settings.onError === 'function') { settings.onError.call($this, 'QUEUE_LIMIT_EXCEEDED'); } } else { for (var n = 0; n < limit; n++) { file = this.files[n]; $data.addQueueItem(file); } $data.inputs[inputName] = this; $data.createInput(); } // Upload the file if auto-uploads are enabled if (settings.auto) { methods.upload.call($this); } // Trigger the select event if (typeof settings.onSelect === 'function') { settings.onSelect.call($this, $data.queue); } }); // Hide the existing current item and add the new one if ($data.currentInput) { $data.currentInput.hide(); } $data.button.append(input); $data.currentInput = input; } // Remove an input $data.destroyInput = function(key) { $($data.inputs[key]).remove(); delete $data.inputs[key]; $data.inputCount--; } // Drop a file into the queue $data.drop = function(e) { $data.queue.selected = 0; $data.queue.replaced = 0; $data.queue.errors = 0; $data.queue.queued = 0; var fileData = e.dataTransfer; var inputName = fileData.name = 'input' + $data.inputCount++; // Add a queue item to the queue for each file var limit = fileData.files.length; $data.queue.selected = limit; if (($data.queue.count + limit) > settings.queueSizeLimit && settings.queueSizeLimit !== 0) { // Check if the queueSizeLimit was reached if ($.inArray('onError', settings.overrideEvents) < 0) { alert('The maximum number of queue items has been reached (' + settings.queueSizeLimit + '). Please select fewer files.'); } // Trigger the onError event if (typeof settings.onError === 'function') { settings.onError.call($this, 'QUEUE_LIMIT_EXCEEDED'); } } else { // Add a queue item for each file for (var n = 0; n < limit; n++) { file = fileData.files[n]; $data.addQueueItem(file); } // Save the data to the inputs object $data.inputs[inputName] = fileData; } // Upload the file if auto-uploads are enabled if (settings.auto) { methods.upload.call($this); } // Trigger the onDrop event if (typeof settings.onDrop === 'function') { settings.onDrop.call($this, fileData.files, fileData.files.length); } // Stop FireFox from opening the dropped file(s) e.preventDefault(); e.stopPropagation(); } // Check if a filename exists in the queue $data.fileExistsInQueue = function(file) { for (var key in $data.inputs) { input = $data.inputs[key]; limit = input.files.length; for (var n = 0; n < limit; n++) { existingFile = input.files[n]; // Check if the filename matches if (existingFile.name == file.name && !existingFile.complete) { return true; } } } return false; } // Remove an existing file in the queue $data.removeExistingFile = function(file) { for (var key in $data.inputs) { input = $data.inputs[key]; limit = input.files.length; for (var n = 0; n < limit; n++) { existingFile = input.files[n]; // Check if the filename matches if (existingFile.name == file.name && !existingFile.complete) { $data.queue.replaced++; methods.cancel.call($this, existingFile, true); } } } } // Create the file item template if (settings.itemTemplate == false) { $data.queueItem = $('<div class="uploadifive-queue-item">\ <a class="close" href="#">X</a>\ <div><span class="filename"></span><span class="fileinfo"></span></div>\ <div class="progress">\ <div class="progress-bar"></div>\ </div>\ </div>'); } else { $data.queueItem = $(settings.itemTemplate); } // Add an item to the queue $data.addQueueItem = function(file) { if ($.inArray('onAddQueueItem', settings.overrideEvents) < 0) { // Check if the filename already exists in the queue $data.removeExistingFile(file); // Create a clone of the queue item template file.queueItem = $data.queueItem.clone(); // Add an ID to the queue item file.queueItem.attr('id', settings.id + '-file-' + $data.fileID++); // Bind the close event to the close button file.queueItem.find('.close').bind('click', function() { methods.cancel.call($this, file); return false; }); var fileName = file.name; if (fileName.length > settings.truncateLength && settings.truncateLength != 0) { fileName = fileName.substring(0, settings.truncateLength) + '...'; } file.queueItem.find('.filename').html(fileName); // Add a reference to the file file.queueItem.data('file', file); $data.queueEl.append(file.queueItem); } // Trigger the addQueueItem event if (typeof settings.onAddQueueItem === 'function') { settings.onAddQueueItem.call($this, file); } // Check the filesize if (file.size > settings.fileSizeLimit && settings.fileSizeLimit != 0) { $data.error('FILE_SIZE_LIMIT_EXCEEDED', file); } else { $data.queue.queued++; $data.queue.count++; } } // Remove an item from the queue $data.removeQueueItem = function(file, instant, delay) { // Set the default delay if (!delay) delay = 0; var fadeTime = instant ? 0 : 500; if (file.queueItem) { if (file.queueItem.find('.fileinfo').html() != ' - Completed') { file.queueItem.find('.fileinfo').html(' - Cancelled'); } file.queueItem.find('.progress-bar').width(0); file.queueItem.delay(delay).fadeOut(fadeTime, function() { $(this).remove(); }); delete file.queueItem; $data.queue.count--; } } // Count the number of files that need to be uploaded $data.filesToUpload = function() { var filesToUpload = 0; for (var key in $data.inputs) { input = $data.inputs[key]; limit = input.files.length; for (var n = 0; n < limit; n++) { file = input.files[n]; if (!file.skip && !file.complete) { filesToUpload++; } } } return filesToUpload; } // Check if a file exists $data.checkExists = function(file) { if ($.inArray('onCheck', settings.overrideEvents) < 0) { // This request needs to be synchronous $.ajaxSetup({ 'async' : false }); // Send the filename to the check script var checkData = $.extend(settings.formData, {filename: file.name}); $.post(settings.checkScript, checkData, function(fileExists) { file.exists = parseInt(fileExists); }); if (file.exists) { if (!confirm('A file named ' + file.name + ' already exists in the upload folder.\nWould you like to replace it?')) { // If not replacing the file, cancel the upload methods.cancel.call($this, file); return true; } } } // Trigger the check event if (typeof settings.onCheck === 'function') { settings.onCheck.call($this, file, file.exists); } return false; } // Upload a single file $data.uploadFile = function(file, uploadAll) { if (!file.skip && !file.complete && !file.uploading) { file.uploading = true; $data.uploads.current++; $data.uploads.attempted++; // Create a new AJAX request xhr = file.xhr = new XMLHttpRequest(); // Start the upload // Use the faster FormData if it exists if (typeof FormData === 'function' || typeof FormData === 'object') { // Create a new FormData object var formData = new FormData(); // Add the form data formData.append(settings.fileObjName, file); // Add the rest of the formData for (i in settings.formData) { formData.append(i, settings.formData[i]); } // Open the AJAX call xhr.open(settings.method, settings.uploadScript, true); // On progress function xhr.upload.addEventListener('progress', function(e) { if (e.lengthComputable) { $data.progress(e, file); } }, false); // On complete function xhr.addEventListener('load', function(e) { if (this.readyState == 4) { file.uploading = false; if (this.status == 200) { if (file.xhr.responseText !== 'Invalid file type.') { $data.uploadComplete(e, file, uploadAll); } else { $data.error(file.xhr.responseText, file, uploadAll); } } else if (this.status == 404) { $data.error('404_FILE_NOT_FOUND', file, uploadAll); } else if (this.status == 403) { $data.error('403_FORBIDDEN', file, uploadAll); } else { $data.error('Unknown Error', file, uploadAll); } } }); // Send the form data (multipart/form-data) xhr.send(formData); } else { // Send as binary var reader = new FileReader(); reader.onload = function(e) { // Set some file builder variables var boundary = '-------------------------' + (new Date).getTime(), dashes = '--', eol = '\r\n', binFile = ''; // Build an RFC2388 String binFile += dashes + boundary + eol; // Generate the headers binFile += 'Content-Disposition: form-data; name="' + settings.fileObjName + '"'; if (file.name) { binFile += '; filename="' + file.name + '"'; } binFile += eol; binFile += 'Content-Type: application/octet-stream' + eol + eol; binFile += e.target.result + eol; for (key in settings.formData) { binFile += dashes + boundary + eol; binFile += 'Content-Disposition: form-data; name="' + key + '"' + eol + eol; binFile += settings.formData[key] + eol; } binFile += dashes + boundary + dashes + eol; // On progress function xhr.upload.addEventListener('progress', function(e) { $data.progress(e, file); }, false); // On complete function xhr.addEventListener('load', function(e) { file.uploading = false; var status = this.status; if (status == 404) { $data.error('404_FILE_NOT_FOUND', file, uploadAll); } else { if (file.xhr.responseText != 'Invalid file type.') { $data.uploadComplete(e, file, uploadAll); } else { $data.error(file.xhr.responseText, file, uploadAll); } } }, false); // Open the ajax request var url = settings.uploadScript; if (settings.method == 'get') { var params = $(settings.formData).param(); url += params; } xhr.open(settings.method, settings.uploadScript, true); xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary); // Trigger the uploadFile event if (typeof settings.onUploadFile === 'function') { settings.onUploadFile.call($this, file); } // Send the file for upload xhr.sendAsBinary(binFile); } reader.readAsBinaryString(file); } } } // Update a file upload's progress $data.progress = function(e, file) { if ($.inArray('onProgress', settings.overrideEvents) < 0) { if (e.lengthComputable) { var percent = Math.round((e.loaded / e.total) * 100); } file.queueItem.find('.fileinfo').html(' - ' + percent + '%'); file.queueItem.find('.progress-bar').css('width', percent + '%'); } // Trigger the progress event if (typeof settings.onProgress === 'function') { settings.onProgress.call($this, file, e); } } // Trigger an error $data.error = function(errorType, file, uploadAll) { if ($.inArray('onError', settings.overrideEvents) < 0) { // Get the error message switch(errorType) { case '404_FILE_NOT_FOUND': errorMsg = '404 Error'; break; case '403_FORBIDDEN': errorMsg = '403 Forbidden'; break; case 'FORBIDDEN_FILE_TYPE': errorMsg = 'Forbidden File Type'; break; case 'FILE_SIZE_LIMIT_EXCEEDED': errorMsg = 'File Too Large'; break; default: errorMsg = 'Unknown Error'; break; } // Add the error class to the queue item file.queueItem.addClass('error') // Output the error in the queue item .find('.fileinfo').html(' - ' + errorMsg); // Hide the file.queueItem.find('.progress').remove(); } // Trigger the error event if (typeof settings.onError === 'function') { settings.onError.call($this, errorType, file); } file.skip = true; if (errorType == '404_FILE_NOT_FOUND') { $data.uploads.errors++; } else { $data.queue.errors++; } if (uploadAll) { methods.upload.call($this, null, true); } } // Trigger when a single file upload is complete $data.uploadComplete = function(e, file, uploadAll) { if ($.inArray('onUploadComplete', settings.overrideEvents) < 0) { file.queueItem.find('.progress-bar').css('width', '100%'); file.queueItem.find('.fileinfo').html(' - Completed'); file.queueItem.find('.progress').slideUp(250); file.queueItem.addClass('complete'); } // Trigger the complete event if (typeof settings.onUploadComplete === 'function') { settings.onUploadComplete.call($this, file, file.xhr.responseText); } if (settings.removeCompleted) { setTimeout(function() { methods.cancel.call($this, file); }, 3000); } file.complete = true; $data.uploads.successful++; $data.uploads.count++; $data.uploads.current--; delete file.xhr; if (uploadAll) { methods.upload.call($this, null, true); } } // Trigger when all the files are done uploading $data.queueComplete = function() { // Trigger the queueComplete event if (typeof settings.onQueueComplete === 'function') { settings.onQueueComplete.call($this, $data.uploads); } } // ---------------------- // Initialize UploadiFive // ---------------------- // Check if HTML5 is available if (window.File && window.FileList && window.Blob && (window.FileReader || window.FormData)) { // Assign an ID to the object settings.id = 'uploadifive-' + $this.attr('id'); // Wrap the file input in a div with overflow set to hidden $data.button = $('<div id="' + settings.id + '" class="uploadifive-button">' + settings.buttonText + '</div>'); if (settings.buttonClass) $data.button.addClass(settings.buttonClass); // Style the button wrapper $data.button.css({ 'height' : settings.height, 'line-height' : settings.height + 'px', 'overflow' : 'hidden', 'position' : 'relative', 'text-align' : 'center', 'width' : settings.width }); // Insert the button above the file input $this.before($data.button) // Add the file input to the button .appendTo($data.button) // Modify the styles of the file input .hide(); // Create a new input $data.createInput.call($this); // Create the queue container if (!settings.queueID) { settings.queueID = settings.id + '-queue'; $data.queueEl = $('<div id="' + settings.queueID + '" class="uploadifive-queue" />'); $data.button.after($data.queueEl); } else { $data.queueEl = $('#' + settings.queueID); } // Add drag and drop functionality if (settings.dnd) { var $dropTarget = settings.dropTarget ? $(settings.dropTarget) : $data.queueEl.get(0); $dropTarget.addEventListener('dragleave', function(e) { // Stop FireFox from opening the dropped file(s) e.preventDefault(); e.stopPropagation(); }, false); $dropTarget.addEventListener('dragenter', function(e) { // Stop FireFox from opening the dropped file(s) e.preventDefault(); e.stopPropagation(); }, false); $dropTarget.addEventListener('dragover', function(e) { // Stop FireFox from opening the dropped file(s) e.preventDefault(); e.stopPropagation(); }, false); $dropTarget.addEventListener('drop', $data.drop, false); } // Send as binary workaround for Chrome if (!XMLHttpRequest.prototype.sendAsBinary) { XMLHttpRequest.prototype.sendAsBinary = function(datastr) { function byteValue(x) { return x.charCodeAt(0) & 0xff; } var ords = Array.prototype.map.call(datastr, byteValue); var ui8a = new Uint8Array(ords); this.send(ui8a.buffer); } } // Trigger the oninit event if (typeof settings.onInit === 'function') { settings.onInit.call($this); } } else { // Trigger the fallback event if (typeof settings.onFallback === 'function') { settings.onFallback.call($this); } return false; } }); }, // Write some data to the console debug : function() { return this.each(function() { console.log($(this).data('uploadifive')); }); }, // Clear all the items from the queue clearQueue : function() { this.each(function() { var $this = $(this), $data = $this.data('uploadifive'), settings = $data.settings; for (var key in $data.inputs) { input = $data.inputs[key]; limit = input.files.length; for (i = 0; i < limit; i++) { file = input.files[i]; methods.cancel.call($this, file); } } // Trigger the onClearQueue event if (typeof settings.onClearQueue === 'function') { settings.onClearQueue.call($this, $('#' + $data.settings.queueID)); } }); }, // Cancel a file upload in progress or remove a file from the queue cancel : function(file, fast) { this.each(function() { var $this = $(this), $data = $this.data('uploadifive'), settings = $data.settings; // If user passed a queue item ID instead of file... if (typeof file === 'string') { if (!isNaN(file)) { fileID = 'uploadifive-' + $(this).attr('id') + '-file-' + file; } file = $('#' + fileID).data('file'); } file.skip = true; $data.filesCancelled++; if (file.uploading) { $data.uploads.current--; file.uploading = false; file.xhr.abort(); delete file.xhr; methods.upload.call($this); } if ($.inArray('onCancel', settings.overrideEvents) < 0) { $data.removeQueueItem(file, fast); } // Trigger the cancel event if (typeof settings.onCancel === 'function') { settings.onCancel.call($this, file); } }); }, // Upload the files in the queue upload : function(file, keepVars) { this.each(function() { var $this = $(this), $data = $this.data('uploadifive'), settings = $data.settings; if (file) { $data.uploadFile.call($this, file); } else { // Check if the upload limit was reached if (($data.uploads.count + $data.uploads.current) < settings.uploadLimit || settings.uploadLimit == 0) { if (!keepVars) { $data.uploads.attempted = 0; $data.uploads.successsful = 0; $data.uploads.errors = 0; var filesToUpload = $data.filesToUpload(); // Trigger the onUpload event if (typeof settings.onUpload === 'function') { settings.onUpload.call($this, filesToUpload); } } // Loop through the files $('#' + settings.queueID).find('.uploadifive-queue-item').not('.error, .complete').each(function() { _file = $(this).data('file'); // Check if the simUpload limit was reached if (($data.uploads.current >= settings.simUploadLimit && settings.simUploadLimit !== 0) || ($data.uploads.current >= settings.uploadLimit && settings.uploadLimit !== 0) || ($data.uploads.count >= settings.uploadLimit && settings.uploadLimit !== 0)) { return false; } if (settings.checkScript) { // Let the loop know that we're already processing this file _file.checking = true; skipFile = $data.checkExists(_file); _file.checking = false; if (!skipFile) { $data.uploadFile(_file, true); } } else { $data.uploadFile(_file, true); } }); if ($('#' + settings.queueID).find('.uploadifive-queue-item').not('.error, .complete').size() == 0) { $data.queueComplete(); } } else { if ($data.uploads.current == 0) { if ($.inArray('onError', settings.overrideEvents) < 0) { if ($data.filesToUpload() > 0 && settings.uploadLimit != 0) { alert('The maximum upload limit has been reached.'); } } // Trigger the onError event if (typeof settings.onError === 'function') { settings.onError.call($this, 'UPLOAD_LIMIT_EXCEEDED', $data.filesToUpload()); } } } } }); }, // Destroy an instance of UploadiFive destroy : function() { this.each(function() { var $this = $(this), $data = $this.data('uploadifive'), settings = $data.settings; // Clear the queue methods.clearQueue.call($this); // Destroy the queue if it was created if (!settings.queueID) $('#' + settings.queueID).remove(); // Remove extra inputs $this.siblings('input').remove(); // Show the original file input $this.show() // Move the file input out of the button .insertBefore($data.button); // Delete the button $data.button.remove(); // Trigger the destroy event if (typeof settings.onDestroy === 'function') { settings.onDestroy.call($this); } }); } } $.fn.upload = function(method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('The method ' + method + ' does not exist in $.uploadify'); } } })(jQuery); }); define("js/home/comment", ["jquery"], function(require, exports, module){ /** * 退换货申请 * @author: yyqing<yanqing.yang@yoho.cn> * @date: 2016/3/1 */ var $ = require("jquery"); var $comment = $('.comment-table'), $remarkBtn = $comment.find('.remark-btn'); var $dialog = $('#comment-dialog-widget'), $titleBar = $dialog.find('.dialog-titlebar'), $commentArea = $dialog.find('textarea'), $closeBtn = $dialog.find('.dialog-close-btn'); var pageW = $(document).width(), pageH = $(document).height(), winH = $(window).height(); var dialog = { padding: 12, canmove: false, offset: {}, maxtop: 0, maxleft: 0 }; $remarkBtn.click(function() { var scrollTop = $(document).scrollTop(); $commentArea.val(''); $dialog.removeClass('hide').css({ top: scrollTop + (winH - $dialog.height() - dialog.padding) / 2, left: (pageW - $dialog.width() - dialog.padding) / 2 }); }); // 评论弹窗 $titleBar.bind('mousedown', function(e) { if ($(e.target).hasClass('dialog-close-btn')) { return; } dialog.canmove = true; dialog.offset = { x: e.offsetX, y: e.offsetY }; dialog.maxtop = pageH - $dialog.height() - dialog.padding; dialog.maxleft = pageW - $dialog.width() - dialog.padding; }); $(document).mousemove(function(e) { var mtop, mleft; if (!dialog.canmove) { return; } mtop = e.pageY - dialog.offset.y; mleft = e.pageX - dialog.offset.x; mtop = mtop < dialog.maxtop ? mtop : dialog.maxtop; mleft = mleft < dialog.maxleft ? mleft : dialog.maxleft; $dialog.css({ top: mtop > 0 ? mtop : 0, left: mleft > 0 ? mleft : 0 }); }).mouseup(function(e) { dialog.canmove = false; }); $closeBtn.click(function() { $dialog.addClass('hide'); }); }); define("js/home/edit", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 个人中心页-个人资料编辑 * @author: zhaobiao<bill.zhao@yoho.cn> * @date: 2016/02/17 */ var $ = require("jquery"); var $allEditForms = $('.userinfo-edit form'); var address = require("js/home/common-address"); var date = { init: function(year, month, day) { var $year = $('#year'), $month = $('#month'), $day = $('#day'); var that = this; this.createDay($year.val(), $month.val(), $day.val()); $year.on('change', function() { that.update(); }); $month.on('change', function() { that.update(); }); }, update: function() { this.createDay($('#year').val(), $('#month').val(), $('#day').val()); }, createDay: function(year, month, day) { var html = '<select name="day" id="day">', monthArray = new Array(4, 6, 9, 11), dayNum = 31; var select, i; year = parseInt(year); month = parseInt(month); if (year === 0) { year = 0; } if (month === 0) { month = 0; } $('#year').val(year.toString()); $('#month').val(month.toString()); html += '<option value="0">日</option>'; if (year > 0 && month > 0) { if ($.inArray(month, monthArray) !== -1) { dayNum = 30; } else if (month === 2) { dayNum = 28; if (0 === year % 4 && (year % 100 !== 0 || year % 400 === 0)) { dayNum = 29; } } for (i = 1; i <= dayNum; i++) { select = ''; if (parseInt(day) === i) { select = 'selected'; } html += '<option value="' + i + '" ' + select + '>' + i + '</option>'; } } html += '</select>'; $('#day').replaceWith(html); } }; $('.userinfo-edit h2').on('click', function() { var $form = $(this).next(); $allEditForms.slideUp('fast'); $form.css('display') === 'none' ? $form.slideDown('slow') : null; }); function checkBaseForm() { var nicknameLength = $('#nickname').val().length, usernameLength = $('#username').val().length, $gender = $('input[name="gender"]'), $year = $('#year'), $month = $('#month'), $day = $('#day'); if (nicknameLength === 0) { alert('请输入昵称'); return false; } if (usernameLength === 0) { alert('请输入用户名'); return false; } if (nicknameLength >= 20) { alert('昵称最长为20个字符'); return false; } if (!$gender.is(':checked')) { alert('请选择性别'); return false; } if ($year.val() === '0' || $month.val() === '0' || $day.val() === '0') { alert('请选择出生年月日'); return false; } return true; } function checkContactForm() { if ($('#province').val() === '0' || $('#city').val() === '0' || $('#areaCode').val() === '0') { alert('请选择所在区域'); return false; } if ($('#province').val() === null || $('#city').val() === null || $('#areaCode').val() === null) { alert('请选择所在区域'); return false; } if ($('#phone').val().length === 0 && $('#mobile').val().length === 0) { alert('电话和手机号码不能同时为空,请填写!'); return false; } if ($('#fullAddress').val().length === 0) { alert('请填写地址'); return false; } if ($('#zipCode').val().length === 0 || $('#zipCode').val().length < 2) { alert('请填写邮编'); return false; } return true; } function checkHabbitForm() { if (!$('.user-habbit-info input').is(':checked')) { alert('请填写购物&着装习惯'); return false; } return true; } function checkFavoriteForm() { if ($('#likebrand').val() === '') { alert('请选择品牌'); return false; } return true; } function delBrand(brandId) { var brand = $('#likebrand').val(); if (parseInt(brandId) === 0) { return false; } $('#likebrand').val(brand.replace(',' + brandId + ',', ',')); $('#pp-' + brandId).attr('checked', false); $('#brand-' + brandId).remove(); } function addBrand(domObj, brandId, brandName) { var html = '<li id="brand-' + brandId + '">' + brandName + '<a href="javascript:void(0);" class="btn-del"></a></li>'; var brandInfo = $('#brand-' + brandId).html(), brandStr = $('#likebrand').val(); var $brandBox = $('#brand-box'); if (parseInt(brandId) === 0) { return false; } if (typeof domObj !== 'undefined' && domObj !== '' && domObj.checked === false) { delBrand(brandId); return false; } if (brandInfo) { alert('您已经选择了该品牌.'); return false; } $brandBox.append(html); $brandBox.find('li>a').off('click').on('click', function() { delBrand($(this).closest('li').attr('id').substr(6)); }); brandStr += brandId + ','; $('#likebrand').val(brandStr); } function checkBrand() { var postData = { brandName: $('#keywords').val() }; $.post('/home/user/isbrandname', postData, function(data) { if (data.code === 200) { if (data.data.id && data.data.brand_name) { addBrand('', data.data.id, data.data.brand_name); $('#keywords').val(''); return true; } else { alert('网络异常,请重试'); return false; } } alert(data.message); return false; }, 'json'); } function save(postUrl, btnId) { var $form = $('#' + btnId).closest('form'); $.post(postUrl, $form.serialize(), function(data) { if (data.code === 200) { alert(data.message); setTimeout(function() { $form.closest('div').next().find('h2').click(); }, 100); return true; } alert(data.message); return false; }, 'json'); } $('#base-info').on('click', function() { if (checkBaseForm()) { save('/home/user/edituserinfo/', 'base-info'); } }); $('#contact-info').on('click', function() { if (checkContactForm()) { save('/home/user/editusercontactinfo/', 'contact-info'); } }); $('#shopping-info').on('click', function() { if (checkHabbitForm()) { save('/home/user/edituserhabitsinfo/', 'shopping-info'); } }); $('#favorite-brand').on('click', function() { if (checkFavoriteForm()) { $.ajax({ url: '/home/user/edituserlikebrand/', type: 'post', datatype: 'json', data: { brand: $('#likebrand').val() }, success: function(data) { if (data.code === 200) { alert(data.message); return true; } alert(data.message); return false; }, error: function(err) { alert('网络异常'); } }); } }); $('#add-brand-btn').on('click', function() { checkBrand(); }); $('.user-favorite-info input[type="checkbox"]').on('click', function() { var $this = $(this); addBrand(this, $this.attr('id').substr(3), $this.parent().text()); }); (function() { var $brands = $('#brand-box li'); if ($brands.length > 0) { $brands.find('a').on('click', function() { delBrand($(this).closest('li').attr('id').substr(6)); }); } })(); date.init(); (function() { if (!$('#province').val()) { address.loadAllData(0, { provinceDomId: 'province', cityDomId: 'city', areaDomId: 'areaCode' }); } else { address.bindAreaChange({ provinceDomId: 'province', cityDomId: 'city', areaDomId: 'areaCode' }); } })(); }); define("js/home/gift", ["jquery"], function(require, exports, module){ /** * 个人中心页-兑换礼品卡 * @author: wsl<shuiling.wang@yoho.cn> * @date: 2016/02/22 */ var $ = require("jquery"); var $giftError = $('.giftCardCode').find('.gift-error'), $codeError = $('.captchaCode').find('.gift-error'), reg = '', code = ''; var Gift = { suc1: false, suc2: false, suc3: false, suc4: false, bindGiftCardForm: function() { $('#giftCardCode1').bind('blur keyup', function() { reg = /^[0-9a-zA-Z]{4,4}$/; if (!reg.test($('#giftCardCode1').val())) { $giftError.html('您输入的兑换码有误,兑换码必须为数字或字母,每个文本框里只能输入四个兑换码!'); Gift.suc1 = false; } else { $giftError.html(''); $('#giftCardCode2').focus(); Gift.suc1 = true; } }); $('#giftCardCode2').bind('blur keyup', function() { reg = /^[0-9a-zA-Z]{4,4}$/; if (!reg.test($('#giftCardCode2').val())) { $giftError.html('您输入的兑换码有误,兑换码必须为数字或字母,每个文本框里只能输入四个兑换码!'); Gift.suc2 = false; } else { $giftError.html(''); $('#giftCardCode3').focus(); Gift.suc2 = true; } }); $('#giftCardCode3').bind('blur keyup', function() { reg = /^[0-9a-zA-Z]{4,4}$/; if (!reg.test($('#giftCardCode3').val())) { $giftError.html('您输入的兑换码有误,兑换码必须为数字或字母,每个文本框里只能输入四个兑换码!'); Gift.suc3 = false; } else { $giftError.html(''); Gift.suc3 = true; } }); $('#captchaCode').bind('blur keyup', function() { code = $('#captchaCode').val(); if (code.length <= 0) { $codeError.html('请输入验证码!'); Gift.suc4 = false; } else { $codeError.html(''); Gift.suc4 = true; } }); }, checkForm: function() { if ($.trim($('#giftCardCode1').val()) === '' || $.trim($('#giftCardCode2').val()) === '' || $.trim($('#giftCardCode3').val()) === '') { $giftError.html('您输入的兑换码有误,兑换码必须为数字或字母,每个文本框里只能输入四个兑换码!'); return false; } if ($.trim($('#captchaCode').val()) === '') { $codeError.html('请输入验证码!'); return false; } return true; } }; //更换验证码 function refreshCaptcha() { var dt = new Date(); $('#imgcode').attr('src', '/home/gift/captcha?t=' + dt.getTime()); return false; } $('#sub-gift').on('click', function() { if (Gift.checkForm()) { $('#giftCardForm').submit(); } else { return false; } }); $(document).on('click', '#imgcode,.check-img', function() { refreshCaptcha(); }); $(function() { refreshCaptcha(); Gift.bindGiftCardForm(); }); }); define("js/home/validate", ["jquery"], function(require, exports, module){ /** * 个人中心页-账号安全验证 * @author: wsl<shuiling.wang@yoho.cn> * @date: 2016/02/23 */ var $ = require("jquery"); var $checkUser = $('.check-user'), $checkInput = $checkUser.find('input').not('input[type=button],input[type=hidden]'), canSend = true, stime = 60, sInt; // 身份校验 function checkForm(dom) { var val = dom.val(), len = val.length, $domParent = dom.parent(), $checkInfo = $domParent.find('.check-info'), inputName = dom.attr('name'), regular = ''; $checkInfo.html(''); if (inputName === 'oldpassword') { if (len === 0) { $checkInfo.html('<div class="form-error">密码不能为空!</div>'); dom.addClass('input-error'); return false; } else { $.get('/home/account/pass?pass=' + encodeURIComponent(val), function(data) { if (typeof data.code !== 'undefined' && data.code === 200) { $checkInfo.html('<div class="form-success"> </div>'); dom.removeClass('input-error'); return true; } else { $checkInfo.html('<div class="form-error">密码错误!</div>'); dom.addClass('input-error'); return false; } }); } } if (inputName === 'code') { $.get('/home/account/review?code=' + val, function(data) { if (typeof data.code !== 'undefined' && data.code === 200) { $checkInfo.html('<div class="form-success"> </div>'); dom.removeClass('input-error'); return true; } else { $checkInfo.html('<div class="form-error">验证码错误!</div>'); dom.addClass('input-error'); return false; } }); } if (inputName === 'newmail') { regular = '([a-zA-Z0-9]+)@([a-zA-Z0-9]+)[\.]([a-zA-Z0-9]+)'; if (val.match(regular) === null) { $checkInfo.html('<div class="form-error">邮箱错误!</div>'); dom.addClass('input-error'); return false; } else { $.get('/home/account/mail?mail=' + val, function(data) { if (typeof data.code !== 'undefined' && data.code === 200) { $checkInfo.html('<div class="form-success"> </div>'); dom.removeClass('input-error'); return true; } else { $checkInfo.html('<div class="form-error">邮箱已存在!</div>'); dom.addClass('input-error'); return false; } }); } } if (inputName === 'mobile') { regular = '^1[35847]{1}[0-9]{9}'; if (len === 0) { $checkInfo.html('<div class="form-error">手机号不能为空!</div>'); dom.addClass('input-error'); return false; } else if (val.match(regular) === null) { $checkInfo.html('<div class="form-error">手机号错误!</div>'); dom.addClass('input-error'); return false; } else { $.get('/home/mobile/exmobi?mobile=' + val, function(data) { if (typeof data.code !== 'undefined' && data.code !== 200) { dom.addClass('input-error'); $checkInfo.html('<div class="form-error">手机号已经存在!</div>'); return false; } else { dom.removeClass('input-error'); $checkInfo.html('<div class="form-success"> </div>'); return true; } }); } } if (inputName === 'password') { if (len < 6 || len > 20) { dom.addClass('input-error'); $checkInfo.html('<div class="form-error">密码长度为6-20字符</div>'); return false; } else { dom.removeClass('input-error'); $checkInfo.html('<div class="form-success"> </div>'); return true; } } if (inputName === 'confirm_password') { if ($('#password').val() !== val) { dom.addClass('input-error'); $checkInfo.html('<div class="form-error">两次密码不一致!</div>'); return false; } else if ($('#password').val() !== '') { dom.removeClass('input-error'); $('#password').next().html('<div class="form-success"> </div>'); $checkInfo.html('<div class="form-success"> </div>'); return true; } } return true; } // 校验表单 function checkAllForm() { var arr = []; $.each($checkInput, function(key, item) { arr.push(checkForm($(item))); }); if (arr.indexOf(false) >= 0) { return false; } else { return true; } } // 切换验证码 function changeCode() { var timestamp = (new Date()).getTime(); $('#the-code-img').attr('src', '/home/account/code?g=email_auth&time=' + timestamp); } // 重新发送倒计时 function code() { var sstring = ''; if (stime > 0) { sstring = '重新发送' + stime + '秒'; $('#sendButton').text(sstring); stime = stime - 1; } else { stime = 60; $('#sendButton').text('发送验证码'); clearInterval(sInt); canSend = true; } } // 发送手机验证码 function sendcode() { var $mobile = $('#mobilevalue'), $code = $('#inputcode'), $mcheckInfo = $mobile.next(), mobileV = $mobile.val(), $ccheckInfo = $code.parent().find('check-info'); if (canSend) { if (mobileV.match('^1[35847]{1}[0-9]{9}') === null) { $mcheckInfo.html('<div class="form-error">手机号错误!</div>'); $mobile.addClass('input-error'); return false; } $.get('/home/mobile/sendcode?mobile=' + mobileV, function(data) { if (typeof data.code !== 'undefined' && data.code === 200) { canSend = false; sInt = setInterval(function() { code(); }, 1000); $ccheckInfo.html(''); } else { $ccheckInfo.html('<div class="form-error">验证码发送失败</div>'); } }); } else { return false; } } //验证完成后倒计时跳转 function toHome() { window.location.href = '/home/account'; } $checkInput.blur(function() { checkForm($(this)); }); $('.sub-btn').on('click', function() { if (checkAllForm()) { $('#pwdform').submit(); } else { return false; } }); $('.the-code').on('click', function() { changeCode(); }); $('#send-mobile-code').on('click', function() { sendcode(); }); $('#inputcode').change(function() { var code = $('#inputcode').val(); if (code !== '') { $.get('/home/mobile/review?code=' + code, function(data) { if (typeof data.code !== 'undefined' && data.code === 200) { $('#codetip').html('<div class="form-success"> </div>'); } else { $('#codetip').html('<div class="form-error">验证码错误!</div>'); } }); } }); $(function() { var t = null; if ($('.res-info').length > 0) { t = setTimeout(function() { toHome(); }, 5000); } changeCode(); }); }); define("js/home/address", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * 个人中心页-地址管理 * @author: wsl<shuiling.wang@yoho.cn> * @date: 2016/02/24 */ var $ = require("jquery"), regionCode = require("js/home/common-address"), dialog = require("js/common/dialog"), Alert = dialog.Alert; var active; var $del = $('.address-del'), $edit = $('.address-modify'), $input = $('.input-1'); var address = { evil: function(fn) { var Fn = Function; return new Fn('return ' + fn)(); }, clearAddrForm: function() { $('#addressName').val(''); $('#address').val(''); $('#zipCode').val(''); $('#phone').val(''); $('#mobile').val(''); $('#email').val(''); $('#addrId').val(0); $('#btn-reset').hide(); $('#form-status').html('添加新地址'); }, editAddr: function(id) { $.getJSON('/home/address/editAddress?id=' + id, function(jsonData) { if (jsonData.code === 200) { $('#form-status').html('修改地址'); $('#addressName').val(jsonData.data.consignee); regionCode.loadAllData(jsonData.data.area_code, {}); $('#address').val(jsonData.data.address); $('#email').val(jsonData.data.email); $('#phone').val(jsonData.data.phone); $('#mobile').val(jsonData.data.mobile); $('#zipCode').val(jsonData.data.zip_code); $('#addrId').val(jsonData.data.address_id); $('#btn-reset').show(); } }); }, saveAddr: function(callbackFunc) { $.post('/home/address/saveAddress', $('#address-form').serialize(), function(data) { if (data.code === 200) { location.reload(); } else { active = new Alert(data.message); active.show(); } }, 'json'); }, // 删除地址 delAddr: function(addrId) { $.getJSON('/home/address/delAddress?id=' + addrId, function(jsonData) { if (jsonData.code === 200) { $('.address-list').find('li[addressId=' + addrId + ']').remove(); } else { active = new Alert('删除失败'); active.show(); } }); }, setDefaultAddr: function(addrId) { var oldBtn = $('.address-list').find('.default-btn'), oldLi = $('.address-list').find('.default-btn').parents('li'), curLi = $('.address-list').find('li[addressId=' + addrId + ']'), curBtn = curLi.find('.set-default-btn'); $.getJSON('/home/address/defaultAddress?id=' + addrId, function(jsonData) { if (jsonData.code === 200) { oldBtn.attr('class', 'btn-c3 set-default-btn'); oldLi.removeClass('preferred'); oldBtn.html('<span>设为常用地址</span>'); curBtn.attr('class', 'btn-c2 default-btn'); oldBtn.html('<span>设为常用地址</span>'); curLi.addClass('preferred'); } else { active = new Alert('设置失败'); active.show(); } }); } }; if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(obj, start) { var i, j; for (i = (start || 0), j = this.length; i < j; i++) { if (this[i] === obj) { return i; } } return -1; }; } // 获取地址id function getAddressId(dom) { var li = dom.parents('.address-content'), id = li.attr('addressId'); return id; } //表单焦点显示 function focusAction(opt) { var msg = ''; if (opt.inputName === 'addressName') { msg = '真实姓名在2到5个汉字之间'; } if (opt.inputName === 'address') { msg = '请填写详细地址'; } if (opt.inputName === 'zipCode') { msg = '请输入收货人所在地邮编号'; } if (opt.inputName === 'phone') { msg = '格式例如:0577-88888888'; } if (opt.inputName === 'mobile') { msg = '请输入手机号,如1360000000'; } if (opt.inputName === 'email') { msg = '用来接收订单提醒邮件,便于您及时了解订单状态'; } opt.$checkInfo.removeClass('form-prompt').addClass('form-focus').html(msg); } //表单失去焦点显示 function blurAction(opt) { var regular = '', res = true, msg = '输入正确', domClass = 'form-info form-success', value = opt.val; if (opt.inputName === 'addressName') { regular = /^[\u4e00-\u9fa5]{2,5}$/; if (opt.len < 1 || opt.len > 12) { msg = '真实姓名在2到5个汉字之间,请确认'; res = false; domClass = 'form-info form-error'; } else if (regular.test(opt.val) === false) { msg = '真实姓名至少2个中文,最多5个中文'; res = false; domClass = 'form-info form-error'; } } if (opt.inputName === 'address') { if (opt.len < 2) { msg = '请填写详细地址'; res = false; domClass = 'form-info form-error'; } } if (opt.inputName === 'zipCode') { regular = /^[0-9]{6}$/; if (opt.len === 0) { msg = '请输入收货人所在地邮编号'; res = false; domClass = 'form-info form-error'; } else if (regular.test(opt.val) === false) { msg = '你输入的邮编式不正确'; res = false; domClass = 'form-info form-error'; } } if (opt.inputName === 'phone') { regular = /^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/; if (opt.len === 0) { msg = '你真的不想留联系电话了吗?'; res = true; domClass = 'form-info form-success'; } else if (regular.test(opt.val) === false) { msg = '你输入的联系电话格式不正确'; res = false; domClass = 'form-info form-error'; } } if (opt.inputName === 'mobile') { regular = /^1[3|4|5|8|7][0-9]{9}$/; if (opt.len !== 11) { msg = '手机号码必须是11位的,请确认'; res = false; domClass = 'form-info form-error'; } else if (regular.test(opt.val) === false) { msg = '您输入的手机号格式不正确'; res = false; domClass = 'form-info form-error'; } } if (opt.inputName === 'email') { regular = '^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|' + 'edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$'; if (value.match(regular) === null || opt.len === 0) { msg = '你输入的邮件地址格式不正确'; res = false; domClass = 'form-info form-error'; } } opt.$checkInfo.removeClass().addClass(domClass).html(msg); return res; } // 地址表单验证 function checkAddressForm(dom, action) { var val = dom.val(), $domParent = dom.parent(), opt = { val: val, len: val.length, $domParent: dom.parent(), $checkInfo: $domParent.find('span'), inputName: dom.attr('name') }; if (action === 'focus') { focusAction(opt); } if (action === 'blur') { return blurAction(opt); } } function fullOneValidator() { var phone = $('#phone').next(), mobile = $('#mobile').next(); if (mobile.hasClass('form-success') && !phone.hasClass('form-error') && $('#phone').val().length === 0) { phone.removeClass().addClass('form-prompt form-info').html('请输入你的联系电话,可以为空哦'); return true; } else if (phone.html() === '输入正确' && !mobile.hasClass('form-error') && $('#mobile').val().length === 0) { mobile.removeClass().addClass('form-prompt form-info').html('填写手机号便于接收发货和收货通知'); return true; } else if (!mobile.hasClass('form-success') && phone.html() !== '输入正确') { phone.removeClass().addClass('form-success form-info').html('你真的不想留联系电话了吗?'); mobile.removeClass().addClass('form-prompt form-info').html('填写手机号便于接收发货和收货通知'); $('#mobile').focus(); return false; } } //校验所有内容 function checkAllForm() { var arr = []; $.each($input, function(key, item) { arr.push(checkAddressForm($(item), 'blur')); }); arr.push(fullOneValidator()); $.each($('.form-info'), function(key, item) { if ($(item).hasClass('form-error')) { $(item).prev().focus(); return false; } }); if (arr.indexOf(false) === -1) { return true; } else { return false; } } $(document).on('click', '.set-default-btn', function() { var id = getAddressId($(this)); address.setDefaultAddr(id); }); $del.on('click', function() { var id = getAddressId($(this)); address.delAddr(id); }); $edit.on('click', function() { var id = getAddressId($(this)); address.editAddr(id); $('#btn-reset').show(); }); $input.on('focus', function() { checkAddressForm($(this), 'focus'); }); $input.on('blur', function() { checkAddressForm($(this), 'blur'); }); $('#address-info').on('click', function() { if (checkAllForm()) { address.saveAddr(); } }); $(document).ready(function() { regionCode.loadAllData( 0, { provinceDomId: 'province', cityDomId: 'city', areaDomId: 'areaCode' } ); address.clearAddrForm(); $('#btn-reset').click(function() { address.clearAddrForm(); }); }); }); define("js/order/ensure", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * @description: 订单保存 * @time: 2015/12/21 */ var $ = require("jquery"); var address = require("js/order/address"); var dialog = require("js/common/dialog"); var Order = { /*业务数据(人民币)*/ Data: { product: 0,//商品价格 activity: 0,//活动 carriage: 0,//邮费 juan: 0,//优惠卷 yohocoin: 0//YOHO币 }, /*view 交互*/ UI: { e: { $pan: $('.pan'), $jc: $('#juancode'), $bp: $('#biprice'), $statistics: $('li', '.play-total'), $tobi: $('p em', '.play-bi-pan .play-pan'), $cancel: $('.cancel', '.btn-group'), $total: $('em', '.to-play'), $tbody: $('table tbody', '.pay-wapper'), //请填写并核对一下信息 $orderSelectionSave: $('.address-list h2 span'), $addAddress: $('.add-address'), $addressManage: $('.address-manage'), $spanPayTypeLegend: $('span.pay-type-legend'), $supportType: $('.support-type'), $existAddressListWrap: $('.exist-address-list'), $existAddressList: $('.exist-address-list').find('li'), $existAddress: $('.exist-address-list').find('input[name="exist-address"]'), $payTimeModify: $('.pay-time-modify'), $switchPayModify: $('.switch-pay-modify'), $modityPayInfo: $('.modity-pay-info'), $payTotal: $('.play-total'), $toPay: $('.to-play em') }, init: function() { var e = this.e, d = Order.Data, c = Order.Common; //初始化产品价格(表格中的价格) e.$tbody.find('tr').each(function(index) { var td = $(this).find('td'); var len = e.$tbody.find('tr').length; var subtotal = parseFloat(td.eq(1).html()) * parseInt(td.eq(3).html()); td.eq(1).html('¥' + td.eq(1).html()); if (td.hasClass('xforone')) { td.eq(4).find('del').html('¥' + c.strFixed(subtotal)); subtotal = 0; } else { td.eq(4).html('¥' + c.strFixed(subtotal)); } d.product += subtotal; if (!index) { td.last().attr('rowspan', len); } else { td.last().remove(); } if (index === len - 1) { e.$tbody.find('tr').eq(0).find('td').last().html('<strong>¥' + c.strFixed(d.product) + '</strong>'); } }); // 使用优惠券、使用yoho币点击展开 e.$pan.find('dt').click(function() { var pan = $(this).parent('dl.pan'); if (pan.find('dd').is(':hidden')) { c.winShow(pan); $(this).addClass('active'); } else { c.winHide(pan); $(this).removeClass('active'); } }); //请填写并核对一下信息 e.$orderSelectionSave.click(function() { var i = 0, $addressLi = $('.exist-address-list li'), liLen = $addressLi.length, notSelect = 0; if (!$(this).attr('expand')) { $(this).attr('expand', 'expand').text('[不保存并关闭]'); $('.exist-address-list li').removeClass('hide'); $('.save-btn').removeClass('hide'); e.$existAddressListWrap.addClass('address-expand'); if (liLen === 1) { e.$addressManage.removeClass('hide'); } } else { for (i = 0; i < liLen; i++) { if ($addressLi.eq(i).hasClass('address_select')) { notSelect++; } if (!$addressLi.eq(i).hasClass('address_select')) { $addressLi.eq(i).addClass('hide'); } } if (notSelect === 0) { $('.exist-address-list li:not(".use-new-address")').removeClass('hide'); } $(this).removeAttr('expand').text('[修改]'); $('.save-btn').addClass('hide'); e.$existAddressListWrap.removeClass('address-expand'); e.$addressManage.addClass('hide'); } }); //支付及送货时间 e.$switchPayModify.click(function() { console.log(1); if (e.$payTimeModify.hasClass('hide')) { e.$payTimeModify.removeClass('hide'); e.$modityPayInfo.addClass('hide'); $(this).text('[不保存并关闭]'); } else { e.$payTimeModify.addClass('hide'); e.$modityPayInfo.removeClass('hide'); $(this).text('[修改]'); e.$payTimeModify.find('input[name="pay-type"]').filter('.checked').attr('checked', 'checked'); e.$payTimeModify.find('input[name="pay-time-radio"]').filter('.checked').attr('checked', 'checked'); e.$payTimeModify.find('input[name="call-me"]').filter('.checked').attr('checked', 'checked'); } }); e.$spanPayTypeLegend.click(function() { $(this).toggleClass('active'); e.$supportType.toggleClass('hide'); }); $(document).on('click', '.exist-address-list li', function() { $('.exist-address-list li').removeClass('active'); $(this).addClass('active'); $(this).find('input').attr('checked', 'checked'); if ($(this).hasClass('use-new-address')) { e.$addressManage.removeClass('hide'); $('.address-manage input').val(''); $('.save-btn').removeAttr('data-id'); // 0表示获取所有省的列表,'000000'表示无匹配的区域码 address.newAddress(0, '000000'); } }); }, //渲染价格明细 render: function(data, tips) { // 下面这段是在服务端算价格 var e = this.e, i, dArr = data.promotion_formula_list, str = '', isExpress = ''; for (i = 0; i < dArr.length; i++) { if (dArr[i].promotion === '优惠券:') { dArr[i].promotion = tips + '<span class="juan-modify">[修改]</span>:'; } if (dArr[i].promotion === 'YOHO币:') { dArr[i].promotion = 'YOHO币<span class="bi-modify">[修改]</span>:'; } if (dArr[i].isExpress) { isExpress = 'total-express-w'; } else { isExpress = ''; } str += '<li class="' + isExpress + '">' + '<label>' + dArr[i].promotion + '</label>' + '<em>' + dArr[i].promotion_amount + '</em>' + '</li>'; } e.$payTotal.html(str); e.$toPay.html((data.last_order_amount).toFixed(2)); } }, /*公共方法*/ Common: { enterNUM: function(str1, str2) { str1 = str1.replace(/[^\d]/g, ''); if (str1 && str2) { str1 = parseInt(str1); str2 = parseInt(str2); if (str1 > str2) { str1 = str2; } } return str1; }, calucate: function() { var p = Order.Data; $.each(Order.Data, function(key, index) { p[key] = parseFloat(Order.Data[key]); }); return p.product - p.activity + p.carriage - p.juan - p.yohocoin; }, winShow: function(pan) { pan.find('dt').show(); pan.find('dd').show(); if (pan.attr('class').match(/(-bi-)|(-juan-)/g)) { pan.find('dt').hide(); } }, winHide: function(pan) { pan.find('dt').show(); pan.find('dd').hide(); /*if (pan.hasClass('play-juan-pan') && $('.juan-modify').length > 0) { pan.find('dt').hide(); } if (pan.hasClass('play-bi-pan') && $('.bi-modify').length > 0) { pan.find('dt').hide(); }*/ }, strFixed: function(str) { return parseFloat(str).toFixed(2); } }, /*业务逻辑*/ Bll: { e: { $juanok: $('#juansubmit'), $juantip: $('.errtip', '.play-juan-pan'), $biok: $('#bisubmit'), $carriageGroup: $('input[name="carriagegroup"]'), $selectExpress: $('.express-list input'), $bp: $('#biprice'), $errorTip: $('.errbitip'), $useEnvelopes: $('.use-envelopes'), $hasEnvelopes: $('.has-envelopes span'), $redEnvelopes: $('.red-envelopes'), $loading: $('.loading') }, init: function() { var e = this.e, u = Order.UI, options, c = Order.Common; function getSelectData(callback) { var $juangroupInput = $('.play-juan.is-select input[name="juangroup"]:checked'); var expressVal = $('.express-list input[name="carriagegroup"]').val(); var biVal = $('#biprice.is-select').val(); var codeVal = $juangroupInput.val(); var cartType = $('.address-manage').attr('cart-type'); var redEnvelopes = $('.use-envelopes input:checked').attr('data-use'); var resultData; codeVal = !!codeVal ? codeVal : $juangroupInput.closest('li').find('#juancode').val(); resultData = { cartType: cartType, deliveryWay: expressVal, couponCode: codeVal, yohoCoin: biVal }; if (!!redEnvelopes) { resultData.redEnvelopes = redEnvelopes; } callback(resultData); } // 选择快递 e.$selectExpress.click(function() { var expressId = $(this).val(); e.$loading.show(); getSelectData(function(d) { d.deliveryWay = expressId; options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { console.log(data); e.$loading.hide(); if (data.code === 200) { u.render(data.data); if (expressId === '1') { $('.express-list.sf').addClass('hide'); } else if (expressId === '2') { $('.express-list.sf').removeClass('hide'); } } else { new dialog.Alert(data.message).show(); } } }; $.ajax(options); }); }); //点击 优惠卷支付 确认按钮 e.$juanok.click(function() { var pan = $(this).parents('dl.pan'); var juanText = ''; $('.play-juan').addClass('is-select'); getSelectData(function(d) { var code = d.couponCode; if (!code) { e.$juantip.html('请选择或填写一个优惠券'); $('.play-juan').removeClass('is-select'); } else { e.$loading.show(); options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { e.$loading.hide(); if (data.code === 200) { juanText = $('.play-juan input[value="' + code + '"]').next().text(); u.render(data.data, juanText); //$('#juancode').val(code); c.winHide(pan); e.$juantip.html(''); //$('.play-juan-pan dt').hide(); } else { e.$juantip.html(data.message); $('.play-juan').removeClass('is-select'); } } }; $.ajax(options); } }); }); // 优惠券修改 $(document).on('click', '.juan-modify', function() { var $pan = $('.play-juan-pan'); c.winShow($pan); }); e.$biok.click(function() { var pan = $(this).parents('dl.pan'); var juanText; $('#biprice').addClass('is-select'); getSelectData(function(d) { if (!!d.couponCode) { juanText = $('.play-juan input[value="' + d.couponCode + '"]').next().text(); } if (d.yohoCoin * 1 === 0) { $('.errbitip').html('请填写一个正整数'); $('#biprice').removeClass('is-select'); } else if (d.yohoCoin * 1 > $('.play-pan em').text() * 1) { $('.errbitip').html('您的YOHO币不足'); $('#biprice').removeClass('is-select'); } else { e.$loading.show(); options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { e.$loading.hide(); if (data.code === 200) { u.render(data.data, juanText); c.winHide(pan); //$('.play-bi-pan dt').hide(); } else { $('.errbitip').html(data.message); $('#biprice').removeClass('is-select'); } } }; $.ajax(options); } }); }); // 修改yoho币 $(document).on('click', '.bi-modify', function() { var $pan = $('.play-bi-pan'); c.winShow($pan); }); e.$bp.keyup(function() { var val = $(this).val(); if (val * 1 < 0 || val.indexOf('.') > 0) { e.$errorTip.html('请输入一个正整数'); } else if (val * 1 > $(this).data('bi') * 1) { e.$errorTip.html('您的YOHO币不足'); } else { e.$errorTip.html('抵扣' + (val / 100).toFixed(2) + '元'); } }); // 取消yoho 币 $('.cancel-bi').click(function() { var $pan = $('.play-bi-pan'); var juanText; if ($('#biprice').hasClass('is-select')) { e.$loading.show(); getSelectData(function(d) { d.yohoCoin = 0; if (!!d.couponCode) { juanText = $('.play-juan input[value="' + d.couponCode + '"]').next().text(); } options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { e.$loading.hide(); if (data.code === 200) { u.render(data.data, juanText); c.winHide($pan); $('#biprice').val('0'); //$('.play-bi-pan dt').hide(); $('#biprice').removeClass('is-select'); $('.errbitip').html(''); } else { $('.errbitip').html(data.message); } } }; $.ajax(options); }); } else { c.winHide($pan); $('#biprice').val('0'); } }); // 取消优惠券 $('.cancel-code').click(function() { var $pan = $('.play-juan-pan'); if ($('.play-juan').hasClass('is-select')) { e.$loading.show(); getSelectData(function(d) { d.couponCode = ''; options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { e.$loading.hide(); if (data.code === 200) { u.render(data.data); c.winHide($pan); $('.play-juan').removeClass('is-select'); $('#juancode').val('') .siblings('input[name="juangroup"]').attr('checked', 'checked'); } else { e.$juantip.html(data.message); } } }; $.ajax(options); }); } else { c.winHide($pan); } }); // 红包 e.$useEnvelopes.find('input').click(function() { var $this = $(this); e.$loading.show(); getSelectData(function(d) { if (!!$this.attr('checked')) { d.redEnvelopes = $this.val(); } else { d.redEnvelopes = 0; } options = { type: 'POST', url: '/cart/index/orderCompute', data: d, success: function(data) { e.$loading.hide(); if (data.code === 200) { u.render(data.data); if (!!$this.attr('checked')) { e.$redEnvelopes.addClass('active'); e.$useEnvelopes.find('span').html('-¥' + ($this.val() * 1).toFixed(2)); e.$hasEnvelopes.html('¥0.00'); $this.attr('data-use', $this.val()); $this.val(0); } else { e.$useEnvelopes.find('span').html('-¥0.00'); e.$hasEnvelopes.html('¥' + ($this.attr('data-use') * 1).toFixed(2)); e.$redEnvelopes.removeClass('active'); $this.val($this.attr('data-use')); $this.attr('data-use', 0); } } else { new dialog.Alert(data.message).show(); } } }; $.ajax(options); }); }); //发票抬头和备注字数限制 function limitStrLen($obj, len) { var $this = $obj; $this.keyup(function() { if ($this.val().length > len) { $this.val($this.val().substr(0, len)); } }); } limitStrLen($('#piaodesc'), 30); limitStrLen($('#notedesc'), 100); } } }; Order.Data.activity = 0; Order.Data.carriage = 0; Order.UI.init(); Order.Bll.init(); address.getUserAddressList(); // 0表示获取所有省的列表,'000000'表示无匹配的区域码 address.newAddress(0, '000000'); address.modifyAddress(); address.saveAddress(); }); define("js/order/address", ["jquery","handlebars","source-map"], function(require, exports, module){ /** * @description: 地址管理 * @author: chenglong.wang@yoho.cn */ var $ = require("jquery"); var dialog = require("js/common/dialog"); var isProvinceChecked = false; var $addressManage = $('.address-manage'), $province = $addressManage.find('.text-input[name="province"]'), $city = $addressManage.find('.text-input[name="city"]'), $county = $addressManage.find('.text-input[name="county"]'), $selectList = $addressManage.find('.text-input[name="province"], .text-input[name="city"]'), $addressList = $('.address-list'), $name = $addressManage.find('.text-input[name="name"]'), $phone = $addressManage.find('.text-input[name="phone"]'), $mail = $addressManage.find('.text-input[name="mail"]'), $address = $addressManage.find('.text-input[name="address"]'), $code = $addressManage.find('.text-input[name="code"]'), $saveBtn = $('.save-btn'), $telCode = $addressManage.find('.text-input[name="tel-code"]'), $tel = $addressManage.find('.text-input[name="tel"]'), $useNewAddress = $('.use-new-address'), $existAddressList = $('.exist-address-list'), $loading = $('.loading'); var cartType = $addressManage.attr('cart-type'); // 构建select下拉选项 function structureOption($obj, data, selectId) { var i, optionHtml = '', defaultOption; for (i = 0; i < data.length; i++) { if (data[i].id === selectId) { optionHtml += '<option selected value="' + data[i].id + '">' + data[i].caption + '</option>'; } else { optionHtml += '<option value="' + data[i].id + '">' + data[i].caption + '</option>'; } } if ($obj.attr('name') === 'province') { defaultOption = '<option value="0">请选择省份</option>'; } else if ($obj.attr('name') === 'city') { defaultOption = '<option value="0">请选择城市</option>'; } else if ($obj.attr('name') === 'county') { defaultOption = '<option value="0">请选择区县</option>'; } $obj.html(defaultOption + optionHtml); } /** * @description: 改函数会返回地址信息 * d {Object} type: 'getProvince'获取省 type: 'getCity'获取城市 type: 'getCounty'获取县 * id: 0 && type: 'getProvince' 获取所有省,默认没有选中项 * id !== 0 && type: 'getProvince' 获取所有省,默认选中用户所在的省 */ function getAddress(d, callback) { var $obj; var selectId = d.selectId; if (d.type === 'getProvince') { //url = 'getProvince'; $obj = $province; } else if (d.type === 'getCity') { //url = 'getCity'; $obj = $city; } else if (d.type === 'getCounty') { //url = 'getCounty'; $obj = $county; } $.ajax({ type: 'GET', url: '/cart/index/getAreaList', dataType: 'json', data: { id: d.id * 1 } }).then(function(d) { structureOption($obj, d.data, selectId); if (typeof callback === 'function') { callback(); } }).fail(function() { //todo }); } // 修改地址时把用户信息带过来 function getUserInfo($obj) { $name.val($obj.attr('data-name')); $name.attr('data-id', $obj.attr('data-id')); $address.val($obj.attr('data-addressDesc')); $phone.val($obj.attr('data-mobile')); $mail.val($obj.attr('data-email')); $code.val($obj.attr('data-zipcode')); $telCode.val($obj.attr('data-phoneCode')); $tel.val($obj.attr('data-codeNum')); } // 更新地址列表状态 function refreshAddressStatus() { $useNewAddress.removeClass('active'); $existAddressList.find('li:not(".active")').addClass('hide'); $existAddressList.find('li.active').addClass('address_select'); $addressManage.addClass('hide'); $saveBtn.addClass('hide'); $existAddressList.removeClass('address-expand'); $('.order-selection h2 span').text('[修改]'); } //获取用户已经存在的地址列表 exports.getUserAddressList = function() { var addressData, i, addressStr = '', isChecked = '', isHide = '', addressText = '', hasDefault = 0; $.ajax({ type: 'GET', url: '/cart/index/getAddress', dataType: 'json' }).then(function(d) { if (d.code === 200) { addressData = d.data.list; if (!addressData) { $addressList.find('>h2').find('span').click(); $('.exist-address-list li').click(); $('.use-new-address').removeClass('active'); return; } for (i = 0; i < addressData.length; i++) { if (addressData[i].checked) { isChecked = 'checked'; isHide = 'active address_select'; hasDefault++; addressText = '默认地址'; } else { isChecked = ''; isHide = 'hide'; addressText = '设为默认地址'; } addressStr += '<li data-id="' + addressData[i].id + '" class="' + isHide + '" data-express="' + addressData[i].isSupport + '">' + '<input data-name="' + addressData[i].user + '" data-areaCode="' + addressData[i].areaCode + '" data-addressDesc="' + addressData[i].addressDesc + '" data-mobile="' + addressData[i].mobile + '" data-phoneNum="' + addressData[i].phoneNum + '" data-phoneCode="' + addressData[i].phoneCode + '" data-zipCode="' + addressData[i].zipCode + '" data-email="' + addressData[i].email + '" class="radio" type="radio" name="address" ' + isChecked + ' />' + '<label for="">' + '<strong>' + addressData[i].user + '</strong>' + addressData[i].address + '<a href="javascript:void(0);" class="default-address">' + addressText + '</a>' + '<div class="order-modify-btn">' + '<span class="address-modify">[修改]</span>' + '<span class="address-del">[删除]</span>' + '</div>' + '</label>' + '</li>'; } $('.use-new-address').before($(addressStr)); //说明用户的地址列表没有默认地址 if (hasDefault === 0) { //没有默认地址则把所有地址都显示出来 //$('.exist-address-list li:not(".use-new-address")').removeClass('hide'); $('.address-list h2 span').click(); } if ($('.active.address_select').attr('data-express') === 'N') { $('.express-list input[name="carriagegroup"][value="2"]').attr('disabled', 'disabled'); $('.express-list input[name="carriagegroup"][value="1"]').attr('checked', 'checked'); $('.express-list.sf').addClass('hide'); $('.is-sup').removeClass('hide'); } else { $('.express-list input[name="carriagegroup"][value="2"]').removeAttr('disabled'); $('.express-list.sf').removeClass('hide'); $('.is-sup').addClass('hide'); } } }); }; /* * 添加地址&修改地址 * id: 根据id获取省市区列表 * code: 根据code确定是否选中省市区 */ exports.newAddress = function(id, code) { var pId = id || 0; //如果没有传id则获取所有省列表 var addressCodeReg = /[0-9]{2}/gi; var codeId = !!code && code.match(addressCodeReg); //获取省 getAddress({ id: pId, type: 'getProvince', selectId: codeId[0] }, function() { var provinceId = $province.val(); if (provinceId !== '0') { //如果获取的省有默认选中项则获取市 getAddress({ id: provinceId, type: 'getCity', selectId: '' + codeId[0] + codeId[1] }, function() { var cityId = $city.val(); //如果获取的市有默认选中项则获取县 if (cityId !== '0') { getAddress({ id: cityId, type: 'getCounty', selectId: code }); } }); } else { $addressManage.find('select[name="city"]').html('<option value="0">请选择城市</option>'); $addressManage.find('select[name="county"]').html('<option value="0">请选择区县</option>'); } }); // 发生change事件时获取下一级地址 $selectList.change(function() { var $this = $(this); if ($this.attr('name') === 'province') { if ($this.val() === '0') { $addressManage.find('select[name="city"]').html('<option value="0">请选择城市</option>'); $addressManage.find('select[name="county"]').html('<option value="0">请选择区县</option>'); } else { getAddress({ id: $this.val(), type: 'getCity' }, function() { isProvinceChecked = true; }); $addressManage.find('select[name="county"]').html('<option value="0">请选择区县</option>'); } } if ($this.attr('name') === 'city' && isProvinceChecked) { if ($this.val() === '0') { $addressManage.find('select[name="county"]').html('<option value="0">请选择区县</option>'); } else { getAddress({ id: $this.val(), type: 'getCounty' }); } } }); }; //修改地址 exports.modifyAddress = function() { $addressList.click(function(event) { var $this = $(event.target), id = $this.closest('li').attr('data-id'), areaCode = $this.closest('li').find('.radio').attr('data-areaCode'); if ($this.hasClass('address-modify')) { $addressManage.removeClass('hide'); exports.newAddress(0, areaCode); getUserInfo($this.closest('li').find('.radio')); $('.address-list-inner .save-btn').removeClass('hide'); $saveBtn.attr('data-id', id); isProvinceChecked = true; } else if ($this.hasClass('address-del')) { $loading.show(); $.ajax({ type: 'POST', url: '/cart/index/delAddress', data: { id: id } }).then(function(d) { $loading.hide(); if (d.code === 200) { $this.closest('li').remove(); } else { new dialog.Alert(d.message).show(); } }).fail(function() { //todo }); } else if ($this.hasClass('default-address') && !$this.parents('li').hasClass('address_select')) { $loading.show(); // 设为默认地址 $.ajax({ type: 'post', url: '/cart/index/setDefaultAddress', data: { id: id } }).then(function(d) { $loading.hide(); if (d.code === 200) { $('.exist-address-list li').removeClass('address_select') .find('.default-address').text('设为默认地址'); $this.parents('li').addClass('address_select'); $this.text('默认地址'); } else { new dialog.Alert(d.message).show(); } }); } }); }; // 保存地址并送到这个地址 exports.saveAddress = function() { $saveBtn.click(function() { var $this = $(this); var name = $name.val(), province = $province.val(), city = $city.val(), county = $county.val(), address = $address.val(), phone = $phone.val(), telCode = $telCode.val(), tel = $tel.val(), mail = $mail.val(), code = $code.val(); var provinceText = $province.find('option[value="' + province + '"]').text(), cityText = $city.find('option[value="' + city + '"]').text(), countyText = $county.find('option[value="' + county + '"]').text(); var postData = { consignee: name, areaCode: county, address: address, email: mail, mobile: phone, zipCode: code, phoneCode: telCode, phoneNum: tel }; var addressStr; var $modifyLi; var hasCheckedAddress; var nameReg = /^[\u4e00-\u9fa5]{2,5}$/; var addressReg = /^[\s\S]{3,100}$/; var phoneReg = /^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/; var codeReg = /^[0-9]{6}$/; var emailReg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; var telCodeReg = /^[0-9]{3,5}$/; var telReg = /^[0-9]{5,10}$/; function hasText(val) { if (val === telCode) { if (!!val) { return val + '-'; } else { return ' '; } } else { if (!!val) { return val + ' '; } else { return ' '; } } } hasCheckedAddress = $('.exist-address-list li:not(".use-new-address")') .find('input[name="address"]:checked').length > 0; // 说明是送货到这个地址 if (!$('.add-address').attr('checked') && hasCheckedAddress && !$('.save-btn').attr('data-id')) { $('.exist-address-list li').removeClass('address_select'); $('.exist-address-list li.active').addClass('address_select') .find('input[name="address"]').attr('checked', 'checked'); $('.address-list span').removeAttr('expand'); refreshAddressStatus(); } //if (!!$('.add-address').attr('checked')) { if (!$('.address-manage').hasClass('hide')) { if (!nameReg.test(name)) { new dialog.Alert('真实姓名至少2个中文,最多5个中文').show(); return; } if (!addressReg.test(address)) { new dialog.Alert('你输入的地址格式不正确').show(); return; } if (!phoneReg.test(phone)) { new dialog.Alert('你输入的联系电话格式不正确').show(); return; } if ((!!telCode && !telCodeReg.test(telCode)) || (!!tel && !telReg.test(tel)) || (telCodeReg.test(telCode) && !telReg.test(tel)) || (!telCodeReg.test(telCode) && telReg.test(tel))) { new dialog.Alert('你输入的电话格式不正确').show(); return; } if (!!mail && !emailReg.test(mail)) { new dialog.Alert('你输入的邮箱格式不正确').show(); return; } if (!!code && !codeReg.test(code)) { new dialog.Alert('你输入的邮编格式不正确').show(); return; } // 如果存在data-id说明是修改,否则是新增 if (!!$saveBtn.attr('data-id')) { postData.id = $saveBtn.attr('data-id'); } $.ajax({ type: 'post', url: '/cart/index/saveAddress', data: postData }).then(function(d) { var addressData; if (d.code === 200) { addressData = d.data; console.log(addressData); if (addressData.is_support === 'Y') { $('.express-list input[name="carriagegroup"][value="2"]').removeAttr('disabled'); $('.express-list.sf').removeClass('hide'); $('.is-sup').addClass('hide'); } else { $('.express-list input[name="carriagegroup"][value="2"]').attr('disabled', 'disabled'); $('.express-list.sf').addClass('hide'); $('.is-sup').removeClass('hide'); } if (!!postData.id) { // 修改操作接口没有返回id addressStr = '<li class="active" data-id="' + postData.id + '" data-express="' + addressData.is_support + '">' + '<input data-name="' + postData.consignee + '" data-areaCode="' + postData.areaCode + '" data-addressDesc="' + postData.address + '" data-mobile="' + postData.mobile + '" data-phoneNum="' + postData.phoneNum + '" data-phoneCode="' + postData.phoneCode + '" data-zipCode="' + postData.zipCode + '" data-email="' + postData.email + '" checked="checked" class="radio" type="radio" name="address" />' + '<label>' + '<strong>' + name + '</strong>' + '<span>' + provinceText + ' ' + cityText + ' ' + countyText + ' ' + address + ' ' + hasText(code) + hasText(phone) + hasText(telCode) + hasText(tel) + '</span>' + '<a href="javascript:void(0);" class="default-address">设为默认地址</a>' + '<div class="order-modify-btn">' + '<span class="address-modify">[修改]</span>' + '<span class="address-del">[删除]</span>' + '</div>' + '</label>' + '</li>'; } else { //添加操作接口有返回id addressStr = '<li class="active" data-id="' + addressData.id + '" data-express="' + addressData.is_support + '">' + '<input data-name="' + addressData.consignee + '" data-areaCode="' + addressData.area_code + '" data-addressDesc="' + addressData.address + '" data-mobile="' + addressData.mobile + '" data-phoneNum="' + addressData.a + '" data-phoneCode="' + addressData.b + '" data-zipCode="' + addressData.zip_code + '" data-email="' + addressData.email + '" checked="checked" class="radio" type="radio" name="address" />' + '<label>' + '<strong>' + name + '</strong>' + '<span>' + provinceText + ' ' + cityText + ' ' + countyText + ' ' + address + ' ' + hasText(code) + hasText(phone) + hasText(telCode) + hasText(tel) + '</span>' + '<a href="javascript:void(0);" class="default-address">设为默认地址</a>' + '<div class="order-modify-btn">' + '<span class="address-modify">[修改]</span>' + '<span class="address-del">[删除]</span>' + '</div>' + '</label>' + '</li>'; } // 如果dataID存在说明是修改操作 if (!!$this.attr('data-id')) { $modifyLi = $('.exist-address-list li[data-id="' + $this.attr('data-id') + '"]'); $modifyLi.after($(addressStr)).remove(); } else { $('.use-new-address').before($(addressStr)); } $('.address-list span').removeAttr('expand'); refreshAddressStatus(); } else { new dialog.Alert(d.message).show(); } }); } if ($('.exist-address-list li').find('input[name="address"]:checked').length === 0) { new dialog.Alert('请选择一个地址').show(); return; } }); }; // 支付及送货时间选择 $('.pay-time-modify .pay-btn').click(function() { var $payInfoBox = $('.modity-pay-info'), $payTime = $('.pay-time-modify'), payTypeVal = $payTime.find('input[name="pay-type"]:checked').val(), payTypeText = $payTime.find('input[name="pay-type"]:checked').next('label').text(), payTimeText = $payTime.find('input[name="pay-time-radio"]:checked').next('label').text(), payTimeVal = $payTime.find('input[name="pay-time-radio"]:checked').val(), isCall = $payTime.find('input[name="call-me"]:checked').next('label').text(), callMeVal = $payTime.find('input[name="call-me"]:checked').val(); $loading.show(); $.ajax({ type: 'POST', url: '/cart/index/orderCompute', dataType: 'json', data: { cartType: cartType, paymentType: payTypeVal } }).then(function(d) { $loading.hide(); if (d.code === 200) { $payInfoBox.find('li').eq(0).find('span').text(payTypeText); $payInfoBox.find('li').eq(1).find('span').text(payTimeText); $payInfoBox.find('li').eq(2).find('span').text(isCall); $('.pay-time-modify').addClass('hide') .find('input[name="pay-type"][value=' + payTypeVal + ']').addClass('checked') .end().find('input[name="pay-time-radio"][value=' + payTimeVal + ']').addClass('checked') .end().find('input[name="call-me"][value=' + callMeVal + ']').addClass('checked'); $('.modity-pay-info').removeClass('hide'); $('.switch-pay-modify').text('[修改]'); } else { new dialog.Alert(d.message).show(); } }); }); function getYohoBiList() { var $juanUl = $('.play-juan ul'), juanStr = '', dLen, data, i; $.ajax({ type: 'GET', dataType: 'json', url: '/cart/index/getCouponList' }).then(function(d) { if (d.code === 200) { data = d.data; dLen = data.length; for (i = 0; i < dLen; i++) { juanStr += '<li>' + '<input name="juangroup" type="radio" value="' + data[i].code + '">' + '<label>' + data[i].desc + '</label>' + '</li>'; } $juanUl.prepend($(juanStr)); } }); } getYohoBiList(); // 把Y、N转换成bool function ytoTrue(val) { if (val === 'N') { return false; } else { return true; } } // 去支付 $('.to-play input.submit').click(function() { var addressId = $('.exist-address-list input[name="address"]:checked').closest('li').attr('data-id'), deliveryTimeId = $('.pay-time-modify input[name="pay-time-radio"]:checked').val(), deliveryWayId = $('.pay-time-modify input[name="carriagegroup"]:checked').val(), invoiceTitle = $('#piaodesc').val(), invoiceId = $('#piaotype').val(), paymentType = $('.pay-time-modify input[name="pay-type"]:checked').val(), paymentId = $('.pay-time-modify input[name="pay-type"]:checked').data('pay'), remark = $('#notedesc').val(), yohoCoin = $('#biprice').val(), isPreContact = $('.pay-time-modify input[name="call-me"]:checked').val(), isPrintPrice = $('.pay-time-modify input[name="isPP"]:checked').val(), redEnvelopes = $('.use-envelopes input:checked').attr('data-use'), $juangroupInput = $('.play-juan.is-select input[name="juangroup"]:checked'), codeVal = $juangroupInput.val(), juanCode = !!codeVal ? codeVal : $juangroupInput.closest('li').find('#juancode').val(); $loading.show(); $.ajax({ type: 'POST', dataType: 'json', url: '/cart/index/orderSub', data: { addressId: addressId, cartType: cartType, deliveryTimeId: deliveryTimeId, deliveryWayId: deliveryWayId, invoiceTitle: invoiceTitle, invoiceId: invoiceId, paymentId: paymentId, paymentType: paymentType, remark: remark, couponCode: juanCode, yohoCoin: yohoCoin, isPreContact: ytoTrue(isPreContact), isPrintPrice: ytoTrue(isPrintPrice), redEnvelopes: redEnvelopes } }).then(function(d) { $loading.hide(); if (d.code === 200) { window.location.href = d.data.payUrl; } else { new dialog.Alert(d.message).show(); } }); }); });