본문 바로가기
개발자 전향 프로젝트

자바스크립트를 HTML과 분리했는데 작동하지 않는 경우

by 샘오리 2022. 10. 14.

보통 HTML과 자바스크립트를 따로 분리하는 게 보기 편하고

보기 편하기 때문에 유지보수가 더 용이한데

그 분리작업이 쉬울 것 같은데? 생각보다는 쉽지 않다. 

 

오늘은 외부로 분리한 나의 자바스크립트 파일이 왜 작동하지 않는지

그 원인을 알아보고 해결책에 대해 소개해보려고 한다.

 

원인 & 해결책


1. VIEW 단에서 경로를 제대로 설정하지 않아서 컴파일러가 찾지 못하는 경우

->본인이 사용하는 템플릿 엔진에 맞게 외부 자바스크립트 파일을 놓아야 하고

    그 경로를 본인이 사용하는 템플릿 엔진에 맞게 설정해주어야 합니다.

 

EX: 타임리프라는 템플릿 엔진을 사용중이라면 다음과 같은 폴더에 저장하면 됩니다.

resources->static->js->html이름->js이름

 

호출할 때는 

<script type="text/javascript" th:src="@{/js/html이름/자바스크립트 이름.js}"></script>

2. jQuery 를 사용중이라면 jQuery보다 뒤에 호출되어야지만 작동을 하는데 그 순서를 맞춰주지 않은 경우

-> 본인이 jQuery를 cdn으로 head에 호출하도록 설정해놓았다면 컴파일러가 위에서 아래로 순서대로 읽으므로 jquery보다 밑에 설정해두면 된다. 하지만 보통은 안전하게 모든 cdn을 다운로드하고 읽은 뒤 방해받지 않게 작동하도록 body태그가 끝날 때 적어두면 좋다.

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
...
...
...
...
<script type="text/javascript" th:src="@{/js/html이름/자바스크립트 이름.js}"></script>
</body>
</html>

 

3. 자바스크립트가 정적인 id나 class를 찾는 로직으로 되어있는데 view단은 동적으로 생겨서 찾지 못하고 이벤트 바인딩이 되지 않는 경우

-> 이럴 땐 강제로 모든 html이 다 불러와지고 나서 자바스크립트를 실행하도록 그 순서를 제일 뒤로 미뤄야하는데

그때 쓰는 함수가 아래와 같습니다.

 

$(function(){
  // 실행할 기능을 정의해주세요.
});

혹은

window.onload = function(){
// 실행할 기능을 정의해주세요.
}

둘의 차이점

DOM 생성 후 바로 호출되는 $(function() 과는 달리

window.onload는 DOM 생성 후 리소스 호출까지 완료된 후에 실행 됩니다.

 

 

클릭 하는 이벤트인 경우

$(document).on('click', '.클래스 이름', function () {
// 실행할 기능을 정의해주세요.
});

$(document).on('click', '#아이디 이름', function () {
// 실행할 기능을 정의해주세요.
});

바꾸는 이벤트인 경우

$(document).on('change', '.클래스 이름', function () {
// 실행할 기능을 정의해주세요.
});

$(document).on('change', '#아이디 이름', function () {
// 실행할 기능을 정의해주세요.
});