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.