<img>
태그의 src
에 넣은 이미지의 로딩에 실패할 때가 있다. MDN에 따르면 아래의 경우들이다.
<img>
요소의 속성에도 크기를 지정하지 않음.이럴 때, 브라우저는 우리가 alt
속성에 넣어둔 대체 텍스트를 보여주지만,
onerror 이벤트 핸들러를 이용해 대체 이미지를 보여주는 방법도 있다.
<img
src="이미지 경로"
alt="대체 텍스트"
onerror="this.onerror=null; this.src='대체 이미지 경로'"
>
this.onerror=null
을 하는 이유?이미지 로딩 에러에 대처하기 위한 대체 이미지까지 로딩에 실패할 경우,
로딩 에러 -> error 이벤트 fire -> this(img)의 src에 대체 이미지 경로 넣기 -> 대체 이미지 로딩 에러 -> error 이벤트 fire -> ...반복
이처럼 무한 로딩으로 인해 아래와 같은 무한 깜빡임 현상이 생길 수 있으므로, this.onerror=null
을 해주어야 한다.
// 일반 함수
const img = document.createElement('img');
img.src = '이미지 경로';
img.onerror = function () => {
this.onerror = null;
this.src = '대체 이미지 경로';
};
화살표 함수를 사용한다면 this가 window(엄격 모드에선 undefined)이므로 event 객체에서 target을 뽑아와서 사용한다.
// 화살표 함수
const img = document.createElement('img');
img.src = '이미지 경로';
img.onerror = ({ target }) => {
target.onerror = null;
target.src = '대체 이미지 경로';
};