1

javascript와 Jquery를 사용하여 기본 변환기를 작성하기 위해 양식의 텍스트 입력을 확인하려고합니다. addEventListener 함수를 사용하면 Select 태그에서 "2", "10"및 "16"옵션에 해당하는 스위치 케이스를 호출 할 수있었습니다.Select 태그에서 addEventListener를 기반으로하는 스위치가 작동하지 않습니다.

문제는 선택 태그의 첫 번째 "변경"이벤트와베이스에서 감소 할 때만 작동한다는 것입니다. 예 : 기본 2를 선택하고 10 또는 16으로 변경하면 16 또는 10으로 변경하는 동안 0 또는 1 문자 만 허용합니다. 어떻게 해결할 수 있습니까?

$(document).ready(function() { 
 

 
    var getFromBase = document.getElementById('frombase-select'); 
 

 
    getFromBase.addEventListener('change', function() { 
 

 
    switch(getFromBase.value) { 
 

 
     case '2': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 49) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
     case '10': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 57) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
     case '16': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 57) && (key.charCode < 97 || key.charCode > 102) && (key.charCode < 65 || key.charCode > 70) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
    } // End switch 
 

 
    }); // End addEventListener 
 

 
}); // End document.ready
.wrapper { 
 
    height: 90vh; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
} 
 
form { 
 
    font-size: 20px; 
 
    width: 300px; 
 
    text-align: center; 
 
    border: 1px solid black; 
 
    padding: 20px; 
 
} 
 
form > * { 
 
    margin: 10px 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="wrapper"> 
 
    <form action="index.php" method="post"> 
 

 
    <div class="form-group flex-center"> 
 
     <label>From Base:</label> 
 
     <select id="frombase-select" name="frombase"> 
 
     <option selected disabled hidden>Enter a base</option> 
 
     <option>2</option> 
 
     <option>10</option> 
 
     <option>16</option> 
 
     </select> 
 
    </div> 
 

 
    <div class="form-group flex-center"> 
 
     <label>Number:</label> 
 
     <input type="text" id="number" name="number"> 
 
    </div> 
 

 
    </form> 
 
</div>

+1

'# frombase-select' 엘리먼트의 각'change' 이벤트에서'.keypress()'이벤트를'# number' 엘리먼트에 붙입니다. – guest271314

+1

고마워요. 확실히 코드를 깨끗하게 만들었습니다. Heres는 다음과 같이 업데이트되었습니다. http://codepen.io/guizo/pen/ORByaQ – guizo

답변

1

문제는 이벤트 핸들러가 말뚝이다 :

여기 내 코드입니다. 따라서 첫 번째 선택된 기본에 대한 유효성 검사가 언 바운드되지 않으므로 핸들러를 재설정하지 않습니다. 이로 인해 이벤트는 첫 번째 선택한 사례의 콜백 만 트리거합니다.

off을 사용하면 이전 핸들러를 제거 할 수 있습니다. 문서에서 :

설명 : 이벤트 처리기를 제거하십시오.

.off(event)

이벤트

유형 :

jQuery.Event 객체 이벤트

.

이벤트 핸들러를 제거하기 위해 이벤트 이름을 문자열로 전달할 수 있습니다. 데모 off 이벤트 핸들러를 제거합니다 :

$("#number").off("keypress"); //Callback is optional 

Here's 업데이트 된 바이올린.

+0

@guizo - 사용하지 않는 방법을 권장하지 않기 위해 수정 한 내용을 검토하십시오. – Li357

+0

감사합니다. 이로 인해 문제가 해결되었습니다. 그러나 나는 더 큰 기지에서 작은 기지로 변화하는 것이 사건이 구속력을 발휘하지 못했지만 왜 여전히 효과가 있었는지 이해하지 못합니다. – guizo

+0

@guizo 안됩니다. 첫 번째 선택에서 이벤트 핸들러를 설정하고 결코 재설정하지 않으므로 첫 번째 선택을 제외한 다른 이벤트 핸들러에서는 작동하지 않아야합니다. – Li357

관련 문제