product-event.js 2.91 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();

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