domGetPointFromEvent.mjs

import size from 'lodash-es/size.js'
import get from 'lodash-es/get.js'


/**
 * 前端DOM元素事件取得使用者滑鼠或第一觸控點座標
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/domGetPointFromEvent.test.mjs Github}
 * @memberOf wsemi
 * @param {HTEMLEvent} e 輸入dom事件物件
 * @returns {Object} 回傳座標物件,其內有clientX、clientY、pageX、pageY,clientX、clientY代表基於顯示區(viewport)之x與y座標,pageX、pageY代表基於內容區(page)之x與y座標
 * @example
 * need test in browser
 *
 * window.addEventListener('mousemove', (e) => {
 *   console.log(domGetPointFromEvent(e))
 * })
 *
 */
function domGetPointFromEvent(e) {

    //check
    let cx = get(e, 'clientX', null) //距離顯示區(viewport)左上角之x座標, 代表隨捲軸改變
    let cy = get(e, 'clientY', null) //距離顯示區(viewport)左上角之y座標, 代表隨捲軸改變
    let px = get(e, 'pageX', null) //距離內容區(page)左上角之x座標, , 代表不隨捲軸改變
    let py = get(e, 'pageY', null) //距離內容區(page)左上角之y座標, , 代表不隨捲軸改變
    if (cx !== null && cy !== null && px !== null && py !== null) {
        return {
            clientX: cx,
            clientY: cy,
            pageX: px,
            pageY: py,
        }
    }

    //check
    let touches = get(e, 'changedTouches', []) //touchend時touches長度為0, 故需改用changedTouches
    if (size(touches) !== 1) {
        return null
    }

    //p
    let p = touches[0]

    return {
        clientX: get(p, 'clientX', null),
        clientY: get(p, 'clientY', null),
        pageX: get(p, 'pageX', null),
        pageY: get(p, 'pageY', null),
    }
}


export default domGetPointFromEvent