[Nexacro N] 이벤트 객체(Event Object) 파헤치기

Nexacro N 이벤트 핸들러의 파라미터 obj와 e(이벤트 객체)의 속성과 활용법을 상세히 정리합니다. prevalue, postvalue, keycode, shiftkey 등 실무에서 자주 쓰는 속성을 예제와 함께 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 이벤트를 등록하는 방법을 살펴봤습니다. 이번 글에서는 이벤트 핸들러가 호출될 때 전달되는 **두 파라미터 obje**를 집중적으로 다룹니다. 이 두 객체를 잘 이해하면 컴포넌트 상태를 정확히 파악하고, 키보드 입력이나 값 변경에 정밀하게 대응할 수 있습니다.

핸들러 파라미터의 기본 구조

Nexacro N의 이벤트 핸들러는 기본적으로 두 개의 파라미터를 받습니다.

this.btn_ok.onclick = function(obj, e) {
    // obj: 이벤트가 발생한 컴포넌트 (sender)
    // e  : 이벤트 상세 정보 객체
};

obj는 이벤트를 발생시킨 컴포넌트 자체를 가리킵니다. e는 이벤트 종류, 마우스 버튼 상태, 키 입력 정보, 값 변경 내역 등 이벤트에 관한 부가 정보를 담고 있습니다.

이벤트 객체 주요 속성

obj 객체 활용

obj를 통해 이벤트가 발생한 컴포넌트의 속성을 읽고 변경할 수 있습니다. 동일한 핸들러를 여러 컴포넌트가 공유할 때 obj.id로 어느 컴포넌트에서 왔는지 판별합니다.

// 하나의 핸들러를 여러 버튼이 공유
function btn_common_onclick(obj, e) {
    var sId = obj.id;

    if (sId === "btn_search") {
        fn_search();
    } else if (sId === "btn_save") {
        fn_save();
    } else if (sId === "btn_delete") {
        fn_delete();
    }
}

// Studio에서 각 버튼의 onclick을 모두 "btn_common_onclick"으로 설정

Grid 컴포넌트에서는 obj에 Grid 전용 속성이 추가됩니다.

this.grd_list.oncellclick = function(obj, e) {
    var nRow = obj.currentrow;       // 클릭한 행 인덱스
    var nCol = obj.currentcol;       // 클릭한 열 인덱스
    var oDs  = obj.getBindDataset(); // 바인딩된 Dataset
    var sVal = oDs.getColumn(nRow, "PROD_NM");

    trace("클릭: " + nRow + "행, 값=" + sVal);
};

e 객체 활용 — 변경 이벤트

onchanged 이벤트의 e 객체에는 변경 전후의 값이 담겨 있습니다. 값 유효성 검사나 연동 처리에 자주 활용합니다.

이벤트 객체 실전 활용 코드

this.edt_qty.onchanged = function(obj, e) {
    var nPre  = e.prevalue;   // 변경 전 값
    var nPost = e.postvalue;  // 변경 후 값 (= obj.value)

    if (parseInt(nPost) < 0) {
        obj.value = nPre;  // 변경 전 값으로 복구
        alert("수량은 0 이상이어야 합니다.");
        return;
    }

    // 총액 재계산
    var nPrice = this.edt_price.value;
    this.edt_total.value = parseInt(nPost) * parseInt(nPrice);
};

e.prevaluee.postvalue는 문자열 타입이므로, 숫자 비교가 필요하면 parseInt() 또는 parseFloat()으로 변환해야 합니다.

e 객체 활용 — 키보드 이벤트

onkeydown / onkeyup 이벤트의 e 객체에는 키코드와 보조키 상태가 담겨 있습니다.

this.edt_search.onkeydown = function(obj, e) {
    // Enter 키 (keycode: 13) → 즉시 검색
    if (e.keycode === 13) {
        fn_search();
    }

    // Ctrl+A → 전체 선택 방지 (예시)
    if (e.ctrlkey && e.keycode === 65) {
        // keycode 65 = 'A'
        e.cancel = true;
    }
};

자주 사용하는 키코드 목록입니다.

keycode
Enter13
Escape27
Tab9
F5116
Delete46
Backspace8

e 객체 활용 — 마우스 이벤트

마우스 이벤트에서는 어떤 버튼을 눌렀는지, 어느 위치인지를 알 수 있습니다.

this.grd_list.onrclick = function(obj, e) {
    // 우클릭 컨텍스트 메뉴 표시
    if (e.rightbutton) {
        this.pop_context.trackPopupMenu(e.screenx, e.screeny);
    }
};

Dataset 이벤트의 e 객체

Dataset의 oncurrentchanged 이벤트는 행 변경 정보를 제공합니다.

this.dsList.oncurrentchanged = function(obj, e) {
    var nNewRow = e.newrow;  // 새로 선택된 행 인덱스
    var nOldRow = e.oldrow;  // 이전 행 인덱스

    trace("행 변경: " + nOldRow + " → " + nNewRow);

    // 디테일 조회
    fn_loadDetail(nNewRow);
};

obj와 e를 활용한 범용 핸들러 패턴

대규모 프로젝트에서는 동일한 UI 패턴의 핸들러를 재사용하는 경우가 많습니다. obj.id로 컴포넌트를 구분하고, Dataset 메서드로 현재 행 값을 읽는 패턴을 공통 함수로 만들어두면 코드 중복을 줄일 수 있습니다.

// 여러 Grid에서 공통으로 사용하는 더블클릭 핸들러
function cmn_gridDblClick(obj, e) {
    var oDs   = obj.getBindDataset();
    var nRow  = obj.currentrow;

    // 팝업 호출 또는 상세 조회
    var sKey  = oDs.getColumn(nRow, "KEY_CD");
    fn_openDetail(sKey);
}

이처럼 obje를 잘 활용하면 컴포넌트별로 핸들러를 따로 만들지 않고도 다양한 상황에 대응할 수 있습니다. 다음 글에서는 핸들러 내부에서 this가 무엇을 가리키는지, 그리고 컨텍스트 문제를 어떻게 해결하는지 살펴봅니다.


지난 글: 이벤트 등록 방법 — Studio vs 스크립트

다음 글: this 컨텍스트 이해와 활용


읽어주셔서 감사합니다. 😊