일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JS setTimeout
- JS 숫자
- JS typeof연산자
- HTML기초
- JS 삼항연산
- JS 데이터타입
- JS clearInterval
- JS preventDefault
- js 변수
- CSS기초
- JS setInterval
- JS value속성
- JS append
- JS classList
- JS 기초
- JS localStorage
- JS form action
- CSS속성정리
- JS 함수
- JS appendChild
- JS 스코프
- JS 타이머기능
- JS 화살표함수
- JS 연산
- JS redirection
- git 협업셋팅
- JS prompt
- JS 형변환
- JS null undefined
- JS form
공부기록용
script의 올바른 위치? 본문
❓script의 권장되는 위치는 하단이라는 것을 처음에 배워서 인식은 하고 있지만 다른 위치에서 사용했을 때 올바르게 사용하는 방법도 알고 싶었다.
1. <head> 내부
but, 요소를 먼저 읽어올 수 있는 작업이 필요하다.
- "load"는 HTML 문서의 모든 리소스 (이미지, 스크립트, 스타일 등)가 로드되고 렌더링이 완료되었을 때 발생하는 이벤트로 이벤트 핸들러 내의 코드는 문서가 완전히 로드된 후에 실행한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css">
<title>Document</title>
<script>
window.addEventListener("load", function(){
})
</script>
</head>
<body></body>
</html>
- "DOMContentLoaded" 이벤트는 HTML 문서의 모든 DOM 요소가 완전히 로드되고 파싱되었을 때 발생하는 이벤트로 즉, 스타일시트, 이미지 및 하위 프레임 로드가 완료되기 전에 발생시킨다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Document</title>
<script>
window.addEventListener("DOMContentLoaded", function () {
});
</script>
</head>
<body></body>
</html>
외부에서 script를 작성하고 head안에서 연결을 해줄 때 사용하는 속성인데, 개인적으로 이 속성들을 사용했을 때 이유는 정확하지 않지만 원하는 순서로 작동하지 않았던 기억들이 많아서 사용하지는 않는 방법이라 좀 더 공부가 되야 할 듯 한 부분이다.
2. <body>제일 하단
요소를 먼저 다 읽은 후 작동되도록 가장 하단에 작성해서 <head>내부에 작성할 때처럼 load나 DOMContentLoaded와 같은 이벤트를 사용하지 않아도 된다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Document</title>
</head>
<body>
<button class="add">Click</button>
<script>
const btn = document.querySelector(".add");
function clickHandler() {
console.log("Hi");
}
btn.addEventListener("click", clickHandler);
</script>
</body>
</html>
❌ 한가지 짚고 넘어가자면 위 script에서는 btn과 clickHandler가 전역변수로 사용되어서 다양한 사람이 작업시 변수명이 겹쳐질 위험이 있다. 그래서 전역변수로 사용되는 것을 지양해야 한다.
해결을 위한 방법으로 겉에 함수를 하나 더 씌워서 불러주면 된다.
다만 이때 함수에 또 이름을 부여하고 그 함수를 호출하면 그게 또 전역이 되는 것이므로
⭕ 이름없는 함수를 만들어서 원하는 코드를 작성해주고 불러주면된다.(초기화로 알면 될 듯) 이름 없는 함수를 불러 주기 위해서 만들어준 이름 없는 함수를 ( )로 묶어주고 호출을 위한 ( )를 붙여주면 된다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Document</title>
</head>
<body>
<button class="add">Click</button>
<script>
(function () {
const btn = document.querySelector(".add");
function clickHandler() {
console.log("Hi");
}
btn.addEventListener("click", clickHandler);
})();
</script>
</body>
</html>
🫥위 방법이 가장 좋은 방법은 아니고 이 외에도 다양한 방법이 존재하고 프로젝트마다 이를 위한 규칙이 있을 것이다. 홀로 코드들을 작성하고 만들어보다보니 다른 사람과의 작업시 변수가 겹친다는 점을 생각을 해보지 못했었다. 이번에 짚고 넘어감으로써 좀 더 디테일하게 관리할 수 있는 방법을 알게 된 것 같아서 규모가 커질 경우에 따로 변수를 아주 비슷하게 사용할 경우 늘리지 않고 이렇게 사용해봐도 괜찮을 것 같다는 생각이 들었다.
'💡깨달음💡 > Javascript' 카테고리의 다른 글
요소의 크기와 위치, Scroll / Wheel event (0) | 2024.06.25 |
---|---|
슬라이드 만들기(slick.js 만들어보기03) (0) | 2024.04.08 |
슬라이드 만들기(slick.js 만들어보기02) (0) | 2024.04.04 |
슬라이드 만들기(slick.js 만들어보기01) (0) | 2024.04.04 |
생성자 함수 (0) | 2024.03.27 |