All files / src/utils/event single.js

67.85% Statements 19/28
50% Branches 2/4
42.85% Functions 3/7
70.37% Lines 19/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 537x 7x   7x 199x     7x                   7x 199x 199x   199x 3x 3x     3x         3x   199x               199x 199x 199x 199x 199x              
const eventsData = {};
let token = 0;
 
const getDataName = function (name, type) {
    return `${name}_${type}`;
};
 
const off = function (name, element, type, token) {
    const eventDataName = getDataName(name, type);
    const eventData = eventsData[eventDataName];
    delete eventData.data[token];
    if (!Object.keys(eventData).length) {
        delete eventsData[eventDataName];
        element.removeEventListener(type, eventData.listener, eventData.options);
    }
};
 
const initEvent = function (name, element, type, listener, options) {
    const eventDataName = getDataName(name, type);
    let eventData = eventsData[eventDataName];
 
    if (!eventData) {
        const listenerBack = listener;
        listener = function (e) {
            listenerBack(e, eventsData[eventDataName].data);
        };
        eventData = eventsData[eventDataName] = {
            listener,
            options,
            data: {},
        };
        element.addEventListener(type, listener, options);
    }
    return eventDataName;
};
 
/**
 * 避免多次绑定同一事件,方便添加 data
 */
export default {
    on(name, data, element, type, listener, options) {
        const eventDataName = initEvent(name, element, type, listener, options);
        token++;
        eventsData[eventDataName].data[token] = data;
        const i = token;
        return () => off(name, element, type, i);
    },
    off,
    getToken() {
        return token;
    },
};