본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

JavaScript 링크·외부 파일 — href · alert · 이미지 교체 완전 정리

by 왕진 2026. 7. 3.
반응형

 

 

Web Development · JavaScript

JavaScript 링크에서 실행 —
href="javascript:..."와 외부 JS 완전 정리

a 태그의 href에 자바스크립트를 직접 넣는 방법과, 코드를 lib.js로 분리해 재사용하는 이유
시작 오늘 분석할 코드

링크(<a>)는 원래 다른 페이지로 이동시키는 태그다. 그런데 href에 URL 대신 javascript:로 시작하는 문자열을 넣으면, 페이지 이동 대신 자바스크립트 코드가 그 자리에서 실행된다. 아래는 클릭하면 alert() 창을 띄우는 가장 단순한 예제와, 이미지를 마우스오버로 바꿔주는 lib.js 파일이다.

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>URL에 자바스크립트 작성</title> </head> <body> <h3>링크의 href에 자바스크립트 작성</h3> <hr> <a href="javascript:alert('클릭하셨어요?')"> 클릭해보세요</a> </body> </html>
lib.js — 마우스오버 이미지 교체 함수
function over(obj) { obj.src = "media/banana.png"; } function out(obj) { obj.src = "media/apple.png"; }
실제 출력 미리보기

화면에는 밑줄 쳐진 텍스트 링크 하나만 보인다. 클릭하는 순간 페이지 이동 없이 브라우저 알림창이 뜬다.

클릭해보세요 ← 실제로는 여기 클릭 시 아래 알림창이 뜸

이 페이지의 내용
클릭하셨어요?
확인
용어 용어 정리
hrefa 태그가 이동할 목적지를 적는 속성 (URL 또는 javascript:)
javascript:URL이 아니라 "이 뒤는 스크립트다"를 알리는 특수 스킴(prefix)
alert()브라우저 기본 알림창을 띄우는 내장 함수
외부 JS 파일.js 확장자로 분리해 여러 페이지에서 불러와 쓰는 스크립트
<script src>외부 .js 파일을 현재 HTML에 연결하는 태그
onmouseover마우스 포인터가 요소 위에 올라갔을 때 실행되는 이벤트 속성
onmouseout마우스 포인터가 요소를 벗어났을 때 실행되는 이벤트 속성
this이벤트가 발생한 그 요소 자기 자신을 가리키는 키워드
obj.src이미지 요소의 실제 표시 경로 — 바꾸면 즉시 이미지 교체
addEventListenerHTML과 JS를 분리해 이벤트를 등록하는 현대적 방식

1 href="javascript:..." — 왜 이게 동작하는가
href는 원래 "어디로 갈지"를 적는 자리다

<a href="...">의 href는 본래 이동할 주소, 즉 URL을 적는 자리다. http://, https://, #처럼 브라우저가 알아듣는 여러 스킴(scheme) 중 하나가 바로 javascript:다. 브라우저는 href 값이 javascript:로 시작하면 "이건 페이지 주소가 아니라 실행할 코드구나"라고 판단하고, 링크 이동 대신 그 뒤에 적힌 코드를 그대로 실행한다.

※ 즉 <a href="javascript:alert('안녕')">는 "안녕이라는 코드로 이동해줘"가 아니라 "페이지 이동은 하지 말고 alert('안녕')을 실행해줘"라는 뜻이다.

2 alert() — 가장 쉬운 확인 도구
alert는 왜 학습 초반에 자주 등장하는가?

alert()는 브라우저가 기본으로 제공하는 팝업창 함수다. 괄호 안에 넣은 문자열을 그대로 화면에 띄워준다. 별도의 CSS나 HTML 요소를 만들 필요 없이 "지금 이 코드가 실행됐다"를 즉시 눈으로 확인할 수 있어서, 자바스크립트가 실제로 동작하는지 테스트할 때 가장 먼저 배우는 함수다.

alert('클릭하셨어요?'); → 화면 중앙에 "클릭하셨어요?" 팝업 + 확인 버튼
※ alert는 사용자가 확인 버튼을 누르기 전까지 페이지 전체가 멈춘다(blocking). 실제 서비스에서는 자연스러운 UI가 아니므로 학습·디버깅용으로만 쓰고, 실무에서는 모달·토스트 UI로 대체한다.

3 코드를 왜 lib.js로 따로 빼는가
HTML 안에 직접 쓰면 안 되는 건 아니지만…

함수 하나 정도는 HTML 안 <script>에 그냥 써도 동작한다. 하지만 같은 함수를 여러 페이지에서 반복해서 써야 한다면 이야기가 다르다. 페이지마다 같은 코드를 복사-붙여넣기 하면, 나중에 함수 하나만 고쳐도 모든 페이지를 일일이 찾아다니며 수정해야 한다. 이럴 때 함수를 lib.js 같은 외부 파일로 분리해두면, 파일 하나만 고치면 그 파일을 불러 쓰는 모든 페이지에 수정 사항이 한 번에 반영된다.

HTML에 직접 작성
페이지마다 같은 함수 중복
수정 시 모든 페이지 다시 열어야 함
파일이 길어지고 관리 어려움
lib.js로 분리
함수는 한 곳에만 존재
여러 페이지가 같은 파일 공유
lib.js 하나만 고치면 전체 반영
※ 외부 파일 분리의 이득
  • 재사용 — 함수를 한 번 만들어 여러 페이지에서 호출
  • 유지보수 — 버그 수정·기능 추가가 파일 하나로 끝남
  • 가독성 — HTML은 구조만, JS는 동작만 담당해 코드가 깔끔해짐

 

반응형

 

4 <script src> — 외부 파일 불러오기
lib.js를 실제로 연결하는 법

외부 .js 파일을 만들었다고 저절로 실행되지는 않는다. HTML의 <head><body> 안에서 <script src="lib.js"></script>처럼 src 속성으로 경로를 지정해야, 브라우저가 그 파일을 읽어와서 안의 함수들을 현재 페이지에서 쓸 수 있게 등록한다.

<head> <meta charset="UTF-8"> <script src="lib.js"></script> </head>
src="lib.js"는 현재 HTML 파일과 같은 폴더에 lib.js가 있다는 뜻이다. 다른 폴더에 있다면 js/lib.js처럼 상대 경로를 정확히 맞춰줘야 한다.

5 over/out 함수 — 마우스오버 이미지 교체
obj.src를 바꾸면 이미지가 바로 바뀐다

lib.js의 over(), out() 함수는 매개변수로 받은 obj(이미지 요소)의 src 속성을 바꾼다. <img> 태그는 src가 가리키는 경로의 그림을 화면에 그리는데, 자바스크립트로 이 src 값을 실시간으로 바꾸면 브라우저가 즉시 새 이미지를 다시 불러와 화면을 갱신한다. 이 원리를 마우스 이벤트와 연결하면 "마우스를 올리면 그림이 바뀌는" 효과가 만들어진다.

<img src="media/apple.png" onmouseover="over(this)" onmouseout="out(this)">

마우스를 올리기 전 / 올린 상태를 이미지 대신 색상 블록으로 표현

apple.png
기본 상태 (out)
→ 마우스 올림 →
banana.png
호버 상태 (over)

6 this — "이 요소 자신"을 함수에 넘기기
obj가 왜 필요한가?

lib.js의 함수는 obj라는 매개변수를 받아서 obj.src를 바꾼다. 그런데 함수 안에는 "어떤 이미지를 바꿀지" 정보가 없다. 그 정보를 채워주는 것이 호출할 때 넘기는 this다. onmouseover="over(this)"에서 this는 이벤트가 걸린 바로 그 <img> 태그 자신을 의미하므로, 여러 개의 이미지가 있어도 각자 자기 자신만 바뀐다.

※ this를 안 넘기면 생기는 문제
  • 함수가 "어떤 img인지" 알 수 없어 에러 발생
  • this 대신 고정된 id를 써버리면 이미지가 하나만 있을 때는 되지만, 여러 개로 늘리면 재사용이 안 됨
  • this(obj)를 넘기는 방식이라야 같은 함수 하나로 몇 개든 이미지를 처리 가능

7 요즘은 javascript: 링크를 왜 지양하는가
더 현대적인 대안 — addEventListener

href="javascript:..."onmouseover="..."처럼 HTML 태그 속성 안에 직접 코드를 적는 방식을 "인라인 이벤트 핸들러"라고 부른다. 배우기는 쉽지만, HTML(구조)과 JS(동작)가 뒤섞여 코드가 지저분해지고, 링크가 실제로는 아무 데도 이동하지 않아 스크린 리더 등 접근성 도구가 혼란을 겪을 수 있다. 요즘은 HTML에는 순수한 구조만 남기고, 동작은 별도의 script에서 addEventListener로 연결하는 방식을 권장한다.

과거 방식
<a href="javascript:alert(...)">
<img onmouseover="over(this)">
HTML과 JS가 한 줄에 섞임
현대적 방식
<a href="#" id="btn">
btn.addEventListener('click', ...)
HTML과 JS가 분리되어 관리 쉬움
※ href="javascript:..."는 링크를 "가짜 이동 주소"로 오염시킨다. href에는 실제 이동할 곳(또는 최소한 "#")을 넣고, 클릭 동작은 JS 이벤트 리스너로 처리하는 편이 구조적으로 더 깔끔하다.
코드가 실행되는 순서를 흐름으로 보면

과거 방식이든 현대적 방식이든, 결국 "이벤트 발생 → 함수 실행"이라는 흐름 자체는 같다. 차이는 그 연결을 어디에 적어두느냐뿐이다.

사용자 클릭/호버
이벤트 발생
연결된 함수 실행
화면 변화(alert / 이미지 교체)

8 자주 하는 실수
실수 증상 해결
href="javascript:"를 아무 링크에나 남발 실제 이동 주소가 없어 접근성·SEO 저하, 우클릭 "새 탭에서 열기"도 무의미 가능하면 addEventListener + 실제 href(또는 #) 사용
<script src="lib.js"> 경로가 틀려 함수 not defined 에러 파일 실제 위치 확인, 상대 경로 재점검(js/lib.js 등)
따옴표 중첩 오류 href="javascript:alert("안녕")" 처럼 큰따옴표 두 번 사용 시 문자열이 중간에 끊김 바깥은 큰따옴표, 안쪽 문자열은 작은따옴표로 구분
onmouseover="over()" 처럼 this 생략 어떤 이미지를 바꿀지 몰라 함수 내부에서 오류 onmouseover="over(this)"로 자기 자신을 넘김
<script src="lib.js">를 head 맨 위에 배치 본문 로딩보다 먼저 실행돼 페이지 렌더링 지연 body 끝 또는 defer 속성으로 로딩 시점 조정

핵심 한 줄 요약

href="javascript:..."이동 대신 그 자리에서 JS 코드를 실행시키는 특수 스킴
alert()간단한 팝업으로 코드 실행 여부를 즉시 확인하는 함수
lib.js 분리함수를 한 곳에 모아 여러 페이지에서 재사용·일괄 유지보수
<script src>외부 .js 파일을 현재 HTML에 연결하는 태그
over(this)/out(this)obj.src 교체로 마우스오버 이미지 스왑 구현
현대적 대안인라인 이벤트 대신 addEventListener로 HTML·JS 분리

Tags

#JavaScript #하이퍼링크 #javascript링크 #href #alert #외부JS #libjs #함수재사용 #이벤트 #자바스크립트기초 #onmouseover #addEventListener #JS #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
JavaScript, 하이퍼링크, javascript링크, href, alert, 외부JS, libjs, 함수재사용, 이벤트, 자바스크립트기초, onmouseover, addEventListener, JS, 웹개발, 티스토리
반응형

댓글