반응형
Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

동글이의 STORY

jQuery Sortable 기능 클릭시 기능 동작 막는 처리 본문

Javascript

jQuery Sortable 기능 클릭시 기능 동작 막는 처리

dongling 2024. 7. 2. 18:30
728x90
반응형
SMALL

[ 문제 상황 ]

- jQuery의 Srotable 기능을 사용하여 순서 변경 기능을 사용하고 있다.

- handle을 통해 제어되고 있는데 drag&drop이 아닌 클릭 이벤트로도 sortable이 start 되었고 이 동작에서 오류를 가져오게 되어 클릭시 sortable이 동작하는 것을 막으려고 한다.

$(".test").sortable({
    helper: "clone",
    placeholder: "highlight",
    opacity: 0.35,
    cursor: "grabbing",
    forceHelperSize: true,
    handle: ".handle",
    items: ".item",
    axis: "y",
});

현재 동작되고 있는 예시이다.

 

[ 시도해 볼 수 있는 방법 ] 

1. sortable 옵션에서 distance와 delay 옵션을 사용할 수 있다.

distance

  • 정렬을 시작할 시점에 대한 허용 범위(픽셀).
  • 지정된 경우 마우스를 거리 너머로 드래그한 후에야 정렬이 시작됩니다.
  • 핸들 내의 요소를 클릭할 수 있도록 사용할 수 있습니다.

delay

  • 정렬을 시작할 시간을 정의하는 밀리초 단위 시간입니다.
  • 지연을 추가하면 요소를 클릭할 때 원치 않는 끌림을 방지하는 데 도움이 됩니다.

 

2. start이벤트 내에서 cancel 기능 사용

문제 : this.helper is null 오류 발생

원인 : jQuery UI 설명서를 읽어보면, 취소 작업은 stop 및 receive 이벤트에서만 지원된다는 것.. 기본적으로 사용자가 드래그를 시작하면 새 위치에 항목을 놓을 때까지 되돌릴 수 없다.

 

3. 마우스 이벤트 내에서 제어하는 방법

sortable("option", "disabled", true); // sortable 기능 비활성화

sortable("option", "disabled", false); // sortable 기능 활성화

또는

sortable("cancel") 이용

 

 

[해결 방법]

결론적으로 해결된 방법은 3번. 마우스 이벤트내에서 제어하는 방법이였다.

설정된 handle에서 drag&drop으로 옮겼을 때는 마우스이벤트가 mousedown만 동작한다 하지만 click을 했을때는 mousedown 이후 mouseup 이벤트가 실행되기 때문에 이 차이를 이용하여 해결하였다.

let isMouseUpEvent = false;

// mouseup event
$("body").on("mouseup", ".handle", () => {
    isMouseUpEvent = true;
});

// mousedown event
$("body").on("mousedown", ".handle", () => {
    isMouseUpEvent = false;
});

// mousemove event
$("body").on("mousemove", () => {
    if (isMouseUpEvent) {
        self.$editorBody.sortable("cancel");
    }
});

 

handle에 클릭하였을때는 순서 변경 동작이 되지 않도록 sortable("cancel")을 사용하여 처리하였다.

* mouseup 이벤트 내에서 sortable("cancel")을 하지 않은 이유 :  handle에 mousedown 이벤트가 들어오면 해당 아이템의 영역에서 포인트가 벗어나면 sortable이 start 되었다.

그래서 mousemove에 sortable("cancel") 되도록 처리했다.

 


더 많은 sortable의 기능들은 아래의 URL을 참고하면 좋다.

https://api.jqueryui.com/sortable/

 

 

728x90
반응형
LIST

'Javascript' 카테고리의 다른 글

[javascript] Canvas 이미지 자르기  (1) 2024.06.26
[javascript] Canvas 태그  (0) 2024.06.26