src 소스 이미지를 찾을 수 없을 때“이미지를 찾을 수 없음”아이콘을 자동으로 숨기는 방법


91

이미지 파일을 찾을 수 없을 때 렌더링 된 HTML 페이지에서 클래식 "이미지를 찾을 수 없음" 아이콘 을 숨기는 방법을 알고 있습니까?

JavaScript / jQuery / CSS를 사용하는 작업 방법이 있습니까?


Andy의 대답은 정확하지만 대신 style.vsibility를 사용할 수 있습니다. 가시성을 설정하면 요소가 문서에서 여전히 공간을 유지하므로 문서가 재미있게 이동하지 않습니다.
— Christian

나는 요점을 보지 못한다. HTML 코드에서 기존 리소스에 도달하지 않으려 고하면 안됩니다. javascript를 사용하여 잘못 처리 된 자원을 숨기는 것은 나에게 못생긴 해결책 인 것 같습니다.
— Boris Delormas

1
@Kaaviar 당신은 요점을 놓치고 있습니다. 게시물 당시 이미지를 사용할 수 있지만 몇 달 후에는 사용할 수 없다는 사실로 인해 Stack Overflow에서 여기에 깨진 핫 링크 이미지가 많이 있습니다. 이 이미지는 조용하고 부드럽게 숨겨져 있습니다.
— systempuntoout

1
@systempuntoout : 왜 두 가지가 다르게 취급되는지 잘 모르겠습니다. Firefox와 Chrome에서 깨진 이미지 를 테스트 했지만 Firefox에는 표시되지 않지만 Chrome에서는 깨진 것으로 표시됩니다. 어떤 스타일도 영향을 미치지 않는 것으로 보이기 때문에 이것이 Firefox가 자체적으로 결정하는 것임이 분명합니다. btw, StackPrinter에 대한 훌륭한 작업입니다.
— Andy E

2
@systempuntoout : 파이어 폭스가 어떻게 작동하는지에 대해 좀 더 많은 정보를 찾았습니다. 참조 업데이트 바이올린 과 [독점 의사 클래스 :-moz-broken( developer.mozilla.org/en/CSS/:-moz-broken을 ). 나는 이전에 의사 클래스가 깨진 이미지를 스타일링하는 데 유용 할 것이라고 생각했습니다.
— Andy E

답변:


102

onerrorJavaScript 의 이벤트를 사용하여 이미지로드에 실패 할 때 작동 할 수 있습니다 .

var img = document.getElementById("myImg");
img.onerror = function () { 
    this.style.display = "none";
}

질문 이후 jQuery에서 :

$("#myImg").error(function () { 
    $(this).hide(); 
});

또는 모든 이미지의 경우 :

$("img").error(function () { 
    $(this).hide();
    // or $(this).css({visibility:"hidden"}); 
});

당신은 사용해야하는 visibility: hidden대신 .hide()이미지를 숨기는 것은 레이아웃을 변경할 수있는 경우. 웹의 많은 사이트는 기본 "이미지 없음"이미지를 대신 사용 src하여 지정된 이미지 위치를 사용할 수 없을 때 해당 이미지를 속성으로 가리 킵니다 .


1
andy-모든 이미지에 적용 할 '글로벌'솔루션은 무엇입니까 ?? ... 단지 문서의 모든 이미지에 대해 궁금 - 나는 그들이 같은 사업부의 모든한다면 쉽게 충분하다 생각하고 있어요
— 짐 tollan

@jAndy : 나는 그것이 확실하다고 확신했지만, 당신의 의견은 나를 다시 확인하게 만들었습니다. 빠른 Google이이 w3schools 페이지를 반환했습니다 (이 글을 읽고 있다면 David, 죄송합니다). 크로스 브라우저 지원을 나타냅니다.
— Andy E

2
@jim : jQuery를 사용하는 경우 모든 이미지에 이벤트를 적용 할 수 있습니다. 태그 선택기를 사용하십시오 (예 :) $("img").error(function () { /*...*/ });.
— Andy E

@Andy E : 좋아요, +1. 다음 흥미로운 질문은 " error"가 live()또는로 제한 될 수 있다는 것 delegate()입니다.
— jAndy

3
visibilitydisplay레이아웃을 깨뜨릴 수 있기 때문에 더 좋을 것 입니다.
— gblazex 2010

114
<img onerror='this.style.display = "none"'>

불행히도 Json을 통해 타사 웹 사이트에서 html 콘텐츠를 다운로드하고 편집 할 수 없기 때문에이 솔루션을 사용할 수 없습니다. 어쨌든 감사합니다.
— systempuntoout

9
대단해, 내가 필요했던 것. 간단하고 방해가되지 않는 템플릿에 적합합니다!
— Max

이미 꽤 오래되었지만 이것은 훌륭합니다! 이제 숨겨진 이미지를 둘러싼 <a> 태그도 숨길 수있는 방법이 있습니까?
— SJDS

9

Gary Willoughby가 제안한 솔루션을 약간 수정했습니다. 깨진 이미지 아이콘이 간략하게 표시되기 때문입니다. 내 솔루션 :

    <img src="..." style="display: none" onload="this.style.display=''">

내 솔루션에서 이미지는 처음에는 숨겨져 있으며 성공적으로로드 된 경우에만 표시됩니다. 단점이 있습니다. 사용자는 하프로드 된 이미지를 볼 수 없습니다. 그리고 사용자가 JS를 비활성화하면 이미지를 볼 수 없습니다.


1
... JavaScript가 비활성화되어 있으면 사용자에게 아무것도 표시되지 않습니다!
— yckart

4
@yckart 음, 사용자는 ... 자바 스크립트 비활성화, 가장 유용한 웹 애플리케이션 어쨌든 작동하지 않을 경우
— 경외

<img src="..." onerror="this.style.display = 'none'"/>하프로드 및 비 js 브라우저의 경우 더 잘 작동 할 수 있습니까?

6

모든 이미지 오류를 숨기려면 페이지 하단 (닫는 body 태그 바로 앞에)에 다음 자바 스크립트를 추가하세요.

(function() {
    var allimgs = document.images;
    for (var i = 0; i < allimgs.length; i++) {
        allimgs[i].onerror = function() {
            this.style.visibility = "hidden"; // Other elements aren't affected. 
        }
    }
})();

이것은 이미지에 오류가 발생하기 전에 onerror 이벤트가 바인딩되고 각 이미지 태그에 onerror 속성을 추가 할 필요가 없도록하기 때문에 제가 선호하는 접근 방식입니다. 이 코드는 모든 이미지 태그 뒤에 있지만 <body>에있는 다른 자바 스크립트 앞에 두어야합니다. 그렇지 않으면 외부 JS로드를 차단하면 이미지 오류가 발생한 후 실행될 수 있습니다.
— 갈라디아서

이것은 갈라디아 인들의 조언과 함께 나를 위해 작동합니다.이 JS를 지연시킬 수있는 것보다 먼저 실행해야합니다.
— Adamz

이것은 원래 질문에 대한 답이지만 단방향 프로세스입니다. 나중에로드되는 이미지를 다시 표시하려면 onload 이벤트도 추가하십시오. allimgs [i] .onload = function () {this.style.visibility = "visible"; };
— TRT 1968

5

대답하기에는 조금 늦었지만 여기에 내 시도가 있습니다. 같은 문제에 직면했을 때 이미지 크기의 div를 사용하고 배경 이미지를이 div로 설정하여 문제를 해결했습니다. 이미지를 찾을 수없는 경우 div는 투명하게 렌더링되므로 모든 작업이 자바 스크립트 코드없이 자동으로 수행됩니다.


4

Andy E 의 대답 에 대한 빠른 조사를 수행하면 live()바인딩 할 수 없습니다 error.

// won't work (chrome 5)
$('img').live('error', function(){
     $(this).css('visibility', 'hidden');
});

그래서 당신은 같이 가야합니다

$('<img/>', {
  src:    'http://www.notarget.com/fake.jpg',
  error:  function(e){
    $(this).css('visibility', 'hidden');
  }
}).appendTo(document.body);

error event handler새 요소를 만들 때 직접 바인딩합니다 .


2
+1, 그 이유는 onerror DOM 이벤트가 버블 링되지 않기 때문입니다. 이벤트 핸들러를 DOM 계층 구조보다 더 위로 배치하고 버블 링되는 이벤트를 캡처하여 라이브 및 위임 작업을 수행합니다. 물론, jQuery를 개발자들과 같은 몇 가지 이벤트에 대해이 문제를 해결 일한 초점 및 흐림
— 앤디 E에게

@Andy E : 예, 그들은 이미 그 문제를 해결했습니다 error. 비슷한 일을하기에 최악의 아이디어가 아닐 수도 있습니다 . nice to have나를위한 것 같은데 .
— jAndy 2010-07-13

3

나는 ng-srcAngular.js에서 지시문을 사용할 때 여전히 작동하면서 정확하게 이것을 수행하는 멋진 방법을 찾았습니다 .

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='"
  />

기본적으로 가장 짧은 투명 GIF입니다 ( http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82% 참조) D0 % B5 % D1 % 80 / [20121112] % 20The % 20smallest % 20transparent % 20pixel.html )

물론이 gif는 일부 전역 변수 안에 보관할 수 있으므로 템플릿을 엉망으로 만들지 않습니다.

<script>
  window.fallbackGif = "..."
</script>

그리고 사용

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src=fallbackGif"
  />

기타


0

단순한 CSS 사용

.AdminImageHolder {
display: inline-block;
min-width: 100px;
max-width: 100px;
min-height: 100px;
max-height: 100px;
background: url(img/100x100.png) no-repeat;
border: 1px solid #ccc;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.