product-event.js 3.32 KB
/**
 *Description: 商品自定义事件
 *Author: chenglong.wang@yoho.cn
 *Date: 2015/12/3
 */

var $ = require('yoho-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();

    var delayFunc,
        loadInfo;

    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);

                delayFunc = setTimeout(function() {
                    loadInfo = true;
                    $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
                    });
                }, 150);
                break;
            case 'mouseleave':
                if (!loadInfo) {
                    if (delayFunc) {
                        clearTimeout(delayFunc);
                    }
                    pMouseHover.fire({
                        type: 'MouseLeave'
                    });
                }
                loadInfo = false;
                break;
            default:
                break;
        }
    }

    $o.bind({
        mouseenter: handleEvent,
        mouseleave: handleEvent
    });

    return pMouseHover;
};