list.js 8.68 KB
/**
 * 商品列表页
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/10/20
 */

var $ = require('yoho.zepto'),
    lazyLoad = require('yoho.zeptolazyload');

//品牌页参数
var $brandHeader = $('#brand-header'),
    $introBox = $('#intro-box');

var filter = require('../plugin/filter');

var tip = require('../plugin/tip');

var $goodsContainer = $('#goods-container'),
    $ngc = $goodsContainer.children('.new-goods'),
    $pgc = $goodsContainer.children('.price-goods'),
    $dgc = $goodsContainer.children('.discount-goods');

var winH = $(window).height();

//默认筛选条件
var defaultOpt = {
    gender: $('#gender').val(),
    brand: $('#brand').val(),
    sort: $('#sort').val(),
    color: $('#color').val(),
    size: $('#size').val(),
    price: $('#price').val(),
    discount: $('#discount').val(),
    query: $('#query').val()
};

var $listNav = $('#list-nav'),

    //导航数据信息
    navInfo = {
        newest: {
            order: 1,
            reload: false,
            page: 1,
            end: false
        },
        price: {
            order: 0,
            reload: true,
            page: 0,
            end: false
        },
        discount: {
            order: 0,
            reload: true,
            page: 0,
            end: false
        }
    },
    $pre = $listNav.find('.active'), //纪录进入筛选前的active项,初始为选中项
    searching;

/**
 * 筛选注册的回调,筛选子项点击后逻辑
 * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载
 * @param opt {type, id}
 */
function search(opt) {
    var setting = {},
        ext,
        att,
        nav, navType,
        page;

    if (opt) {

        //筛选项变更则重置reload为true
        for (att in navInfo) {
            if (navInfo.hasOwnProperty(att)) {
                navInfo[att].reload = true;
            }
        }

        //处理active状态
        $listNav.children('.active').removeClass('active');
        $pre.addClass('active');

        switch (opt.type) {
            case 'gender':
                ext = {
                    gender: opt.id
                };
                break;
            case 'brand':
                ext = {
                    brand: opt.id
                };
                break;
            case 'sort':
                ext = {
                    sort: opt.id
                };
                break;
            case 'color':
                ext = {
                    color: opt.id
                };
                break;
            case 'size':
                ext = {
                    size: opt.id
                };
                break;
            case 'price':
                ext = {
                    price: opt.id
                };
                break;
            case 'discount':
                ext = {
                    discount: opt.id
                };
                break;
        }

        $.extend(defaultOpt, ext); //扩展筛选项
    }

    if (searching) {
        return;
    }

    //导航类别
    if ($pre.hasClass('new')) {
        navType = 'newest';
    } else if ($pre.hasClass('price')) {
        navType = 'price';
    } else if ($pre.hasClass('discount')) {
        navType = 'discount';
    }

    nav = navInfo[navType];

    page = nav.page + 1;
    if (nav.reload) {
        page = 1;
    } else if (nav.end) {

        //不需要重新加载并且数据请求结束
        return;
    }

    $.extend(setting, defaultOpt, {
        type: navType,
        order: nav.order,
        page: page
    });

    searching = true;

    $.ajax({
        type: 'GET',
        url: '/index/search/search',
        data: setting,
        success: function(data) {
            var noResult = '<p class="no-result">未找到相关搜索结果</p>',
                $container;

            switch (navType) {
                case 'newest':
                    $container = $ngc;
                    break;
                case 'price':
                    $container = $pgc;
                    break;
                case 'discount':
                    $container = $dgc;
                    break;
            }

            if (data === ' ') {
                nav.end = true;

                if (nav.reload) {
                    $container.html(noResult);
                }
            } else {
                if (nav.reload) {
                    $container.html(data);
                } else {
                    $container.append(data);
                }

                lazyLoad($container.find('.lazy'));
            }

            nav.reload = false;
            nav.page = page;

            searching = false;
        }
    });

}

lazyLoad($('.lazy'));

filter.registerCbFn(search);

//导航栏点击逻辑说明:
//1.点击非active项时切换active状态
//2.价格和折扣active状态时继续点击切换排序
//3.筛选无active时点击展开筛选面板
//4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态
//5.当前active为筛选并且点击其他项时,隐藏筛选面板
$listNav.delegate('li', 'tap', function() {
    var $this = $(this),
        nav,
        navType,
        $active;

    if ($this.hasClass('filter')) {

        //筛选面板切换状态
        if ($this.hasClass('active')) {
            filter.hideFilter();

            //点击筛选钱的active项回复active
            $pre.addClass('active');
            $this.removeClass('active');
        } else {
            $pre = $this.siblings('.active');

            $pre.removeClass('active');
            $this.addClass('active');

            filter.showFilter();
        }
    } else {

        if ($this.hasClass('new')) {
            navType = 'newest';
        } else if ($this.hasClass('price')) {
            navType = 'price';
        } else if ($this.hasClass('discount')) {
            navType = 'discount';
        }

        nav = navInfo[navType];

        if ($this.hasClass('active')) {

            //最新无排序切换
            if ($this.hasClass('new')) {
                return;
            }

            if ($this.hasClass('price') || $this.hasClass('discount')) {

                // 价格/折扣切换排序状态
                $this.find('.icon > .iconfont').toggleClass('cur');
                $pre = $this; //更新pre为当前项
                nav.reload = true; //重置reload,HTML会被替换为逆序的HTML
                nav.order = nav.order === 0 ? 1 : 0; //切换排序
            }
        } else {
            $active = $this.siblings('.active');

            $pre = $this; //$pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项

            if ($active.hasClass('filter')) {

                //若之前active项为筛选,则隐藏筛选面板
                filter.hideFilter();
            } else {

                //切换container显示
                $goodsContainer.children('.container:not(.hide)').addClass('hide');

                switch (navType) {
                    case 'newest':
                        $ngc.removeClass('hide');
                        break;

                    case 'price':
                        $pgc.removeClass('hide');
                        break;

                    case 'discount':
                        $dgc.removeClass('hide');
                        break;
                }
            }

            $active.removeClass('active');
            $this.addClass('active');
        }

        if (nav.reload) {
            search();
        }
    }
});

$(window).scroll(function() {

    //当scroll到1/4$goodsContainer高度后继续请求下一页数据
    if ($(window).scrollTop() + winH >
        $(document).height() - 0.25 * $goodsContainer.height()) {
        search();
    }
});

//品牌介绍
$brandHeader.children('.btn-intro').bind('tap', function() {
    $introBox.removeClass('hide');
});

$('.close-intro, .brand-intro-box').tap(function() {
    $introBox.addClass('hide');
});

$('#brand-intro').tap(function(e) {
    e.stopPropagation();
});

//品牌收藏
$brandHeader.children('.btn-col').bind('tap', function() {
    var $this = $(this);

    var id = $brandHeader.data('id'),
        opt;

    if ($this.hasClass('coled')) {
        opt = 'cancel';
    } else {
        opt = 'ok';
    }

    $.ajax({
        type: 'POST',
        url: '/product/opt/favoriteBrand',
        data: {
            id: id,
            opt: opt
        },
        success: function(data) {
            if (data.code === 200) {
                $this.toggleClass('coled');
            } else if (data.code === 400) {
                tip.show('未登录');
            }
        },
        error: function() {
            tip.show('网络断开连接了~');
        }
    });
});