관련지식
html, img

쇼핑몰을 이용하다보면 img 태그에 사용한 이미지의 링크가 존재하지 않아 흉하게 보이는 경우를 본적이 있을것입니다.
요즘같이 외부 이미지 호스팅 서비스를 사용하는 경우가 많고, 쇼핑몰처럼 주요 컨텐츠가 이미지인 사이트에선 이미지의 링크 관리가 매우 중요할것 같습니다. onerror 이벤트를 이용한 몇가지 처리 방법을 적어보겠습니다.

대체 이미지 보여주기

이미지가 링크가 없어졌을때 “이미지가 없습니다” 라는 대체 이미지를 보여주고 싶다면, onerror 에서 src 속성을 대체 url로 바꿔주도록 하면 됩니다. 아래는 네이버 로고로 대체하도록 되어있습니다.

  1. <img src="noimg.jpg" onerror="this.src='https://s.pstatic.net/static/www/img/uit/2019/sp_search.svg';"/>

숨기기

대체 이미지를 보여주는것이 적당하지 않다고 생각될때는 그냥 숨길수도 있습니다. 이미지가 깨진 상태로 보이는것보다 훨신 깔끔하겠죠.

  1. <img src="noimg.jpg" onerror="this.style.display='none';"/>

이미지를 숨기는것이 아니라 DOM 자체를 삭제할수도 있습니다. IE에서는 removeNode() 함수를 사용해야 합니다.

  1. <img src="noimg.jpg" onerror="this.remove ? this.remove() : this.removeNode();"/>

이미지 링크 관리하기

이미지 컨텐츠가 엄청나게 많을 경우 모든 이미지를 매일 직접 확인하는것은 어려운 일입니다. 그러나 쇼핑몰에선 매우 중요한 상황이겠죠. 아래처럼 이미지 링크에 문제가 있을 경우 서버로 해당 링크를 전송시키면 문제가 있는 링크를 관리할 수 있습니다.
error.jsp 에서는 response header 의 referer 값으로 전달 받은 url(문제가 있는 이미지 url)이 어디서 사용되는 이미지인지 쉽게 알아낼수 있습니다.

  1. <img src="noimg.jpg" onerror="sendError(this.src);"/>
  2. <script>
  3. function sendError(url) {
  4. $.ajax({
  5. url : 'error.jsp',
  6. data : 'url=' + encodeURIComponent(url)
  7. });
  8. }
  9. </script>

최종샘플

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title></title>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  8. <style>
  9. div { border:1px solid black; width:200px; height:300px; float:left; }
  10. </style>
  11. </head>
  12. <body>
  13. <div>
  14. <img src="noimg.jpg"/>
  15. </div>
  16. <div>
  17. <img src="noimg.jpg" onerror="this.src='https://s.pstatic.net/static/www/img/uit/2019/sp_search.svg';"/>
  18. </div>
  19. <div>
  20. <img src="noimg.jpg" onerror="this.style.display='none';"/>
  21. </div>
  22. <div>
  23. <img src="noimg.jpg" onerror="this.remove ? this.remove() : this.removeNode();"/>
  24. </div>
  25. <div>
  26. <img src="noimg.jpg" onerror="sendError(this.src);"/>
  27. </div>
  28. <script>
  29. function sendError(url) {
  30. $.ajax({
  31. url : 'error.jsp',
  32. data : 'url=' + encodeURIComponent(url)
  33. });
  34. }
  35. </script>
  36. </body>
  37. </html>