jQuery로 변경 이벤트를 발생시키지 않고 HTML 선택 옵션을 재구성하는 방법

웹 애플리케이션에서 여러 HTML 선택 요소를 사용할 때, 한 드롭다운에서 옵션을 선택하면 다른 드롭다운의 사용 가능한 옵션에 영향을 미치는 상황에 놓일 수 있습니다. 일반적인 시나리오는 한 선택에서 선택했을 때 다른 선택에서 해당 옵션이 사라지는 것입니다. 그러나 이렇게 하면 원하지 않는 변경 이벤트가 발생할 수 있어 논리를 복잡하게 만들 수 있습니다. 이번 포스트에서는 jQuery를 사용하여 원치 않는 변경 이벤트를 발생시키지 않고 선택 옵션을 동적으로 재구성하는 방법에 대해 다루겠습니다.

문제

두 개의 드롭다운(선택 요소)이 서로 의존하는 상황을 상상해보세요. 한 드롭다운에서 옵션을 선택하면 두 번째 드롭다운에서 해당 옵션이 제거되는 시스템을 구현하고 싶어합니다. 이로 인해 사용자가 두 드롭다운에서 동일한 옵션을 선택할 수 없도록 해야 합니다. 하지만 기본 jQuery 동작으로, 하나의 선택 옵션을 변경하면 해당 선택의 변경 이벤트도 호출되어 애플리케이션에서 예상치 못한 동작을 초래할 수 있습니다.

예제 시나리오

드롭다운을 설명하는 간단한 HTML 구조는 다음과 같습니다:

<select id="one">
  <option value="1">one</option>
  <option value="2">two</option>
  <option value="3">three</option>
</select>
<select id="two">
  <option value="1">one</option>
  <option value="2">two</option>
  <option value="3">three</option>
</select>

첫 번째 드롭다운("#one")에서 “one"을 선택하면 두 번째 드롭다운("#two")에서 “one"이 제거되는 것이 목표입니다. 이후 "#two"에서 “two"를 선택하면 같은 동작이 역으로 발생해야 합니다.

해결책

선택 옵션을 재구성하는 동안 변경 이벤트를 발생시키지 않으려면 두 단계의 접근 방식이 필요합니다: 이벤트 핸들러를 일시적으로 분리하고 플래그를 사용하여 변경 이벤트가 처리되어야 하는지 판단합니다.

1단계: JavaScript 로직 수정

jQuery 함수를 다음과 같이 설정합니다:

$(function () {
    var $one = $("#one");
    var $two = $("#two");

    var selectOptions = [ 
        $("option", $one).clone(), 
        $("option", $two).clone() 
    ];

    var isChanging = false; // 변경 이벤트 방지를 위한 플래그

    $one.change(function () {
        if (isChanging) return; // 이미 변경 중이면 무시
        
        isChanging = true; // 옵션 변경 전에 플래그 설정
        var selectedValue = $("option:selected", this).val();
        $two.find("option[value='" + selectedValue + "']").remove();
        repopulateOptions($two, selectOptions[1]); // 옵션 재구성
        isChanging = false; // 플래그 초기화
    });
    
    $two.change(function () {
        if (isChanging) return; // 이미 변경 중이면 무시
        
        isChanging = true; // 옵션 변경 전에 플래그 설정
        var selectedValue = $("option:selected", this).val();
        $one.find("option[value='" + selectedValue + "']").remove();
        repopulateOptions($one, selectOptions[0]); // 옵션 재구성
        isChanging = false; // 플래그 초기화
    });

    function repopulateOptions($select, options) {
        options.each(function() {
            if (!$select.find("option[value='" + this.value + "']").length) {
                $select.append(this); // 이미 존재하지 않을 경우에만 추가
            }
        });
    }
});

2단계: 주요 구성 요소 설명

  • isChanging 플래그: 이 불리언 플래그는 이벤트 핸들러가 실행될지 무시될지를 추적하여 옵션 조작 중 우발적인 이벤트 발생을 방지합니다.
  • 재구성 함수: 이 함수는 선택을 다시 동기화하여 이전에 사용 가능했던 옵션을 복원하며, 사용자는 다른 드롭다운에서 이미 선택되지 않은 모든 선택지를 이용할 수 있도록 합니다.
  • 옵션 복제: 원본 옵션을 복제하여 모든 사용 가능한 선택지를 참조로 유지할 수 있으므로 화면에 표시되는 내용을 관리하기가 용이합니다.

결론

상호 의존적인 선택 옵션을 관리하는 것은 까다로울 수 있습니다, 특히 원하지 않는 이벤트 트리거를 방지하려고 할 때 더욱 그렇습니다. 이 포스트의 지침을 따르면, 선택 선택지가 실시간으로 동적으로 조정되며 이벤트 발생에 따른 문제 없이 원활한 사용자 경험을 구현할 수 있습니다. 이 솔루션은 예상치 못한 동작을 방지할 뿐만 아니라 옵션이 명확하고 사용자가 몰입할 수 있도록 유지합니다!

jQuery와 동적 드롭다운에 대해 궁금한 점이 있다면 아래에 댓글을 남겨 주시기 바랍니다!