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