2010-07-13 14 views
79

क्या आप जानते हैं कि क्लासिक "छवि नहीं मिली" आइकन किसी फ़ाइल फ़ाइल को नहीं मिला है?जब स्रोत स्रोत नहीं मिला है तो स्रोत स्रोत नहीं मिला है जब "स्रोत नहीं मिला" आइकन चुपचाप छिपाने के लिए

जावास्क्रिप्ट/jQuery/सीएसएस का उपयोग कर कोई भी कामकाजी विधि?

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

jQuery में (जब से तुम से पूछा):

+0

मुझे बिंदु नहीं दिखाई देता है। आपको बस अपने एचटीएमएल कोड से मौजूदा संसाधनों तक पहुंचने की कोशिश नहीं करनी चाहिए। खराब सौदा संसाधनों को छिपाने के लिए जावास्क्रिप्ट का उपयोग करना मेरे लिए एक बदसूरत समाधान प्रतीत होता है। –

+1

@ कवियार आप इस बिंदु को याद कर रहे हैं। इस तथ्य के कारण छवियां उपलब्ध हो सकती हैं कि स्टैक ओवरफ़्लो पर बहुत सारी हॉटलिंक छवियां टूट गई हैं, लेकिन कुछ महीने बाद अनुपलब्ध हैं। ये छवियां चुपचाप और धीरे-धीरे छिपी हुई हैं। – systempuntoout

+0

@systempuntoout: प्रश्नों में पोस्ट की गई टूटी हुई छवियां मेरे लिए टूटी हुई छवि आइकन दिखाती हैं। मैंने अभी इसका परीक्षण किया। –

उत्तर

89

आप जब एक छवि को लोड करने में विफल रहता है कार्य करने के लिए जावास्क्रिप्ट में onerror घटना का उपयोग कर सकते

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

या सभी छवियों के लिए:

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

आपको .hide() के बजाय visibility: hidden का उपयोग करना चाहिए यदि छुपाएं ई छवियों लेआउट बदल सकता है। वेब पर कई साइटें डिफ़ॉल्ट छवि स्थान अनुपलब्ध होने पर उस छवि पर src विशेषता को इंगित करते हुए डिफ़ॉल्ट "कोई छवि" छवि का उपयोग नहीं करती हैं।

+0

वह क्रॉसब्रोसर है? – jAndy

+1

एंडी - सभी छवियों पर लागू करने के लिए 'वैश्विक' समाधान क्या होगा ?? मैं सोच रहा हूं कि यह काफी आसान होगा अगर वे सभी एक ही div में थे - बस दस्तावेज़ में सभी छवियों के बारे में सोचते थे ... –

+0

@jAndy: मुझे काफी यकीन था कि यह है, लेकिन आपकी टिप्पणी ने मुझे दोबारा जांच की। एक त्वरित Google ने यह [w3schools पृष्ठ] (http://www.w3schools.com/jsref/event_img_onerror.asp) लौटाया (क्षमा करें डेविड, यदि आप इसे पढ़ रहे हैं) क्रॉस ब्राउज़र समर्थन का संकेत देते हैं। –

4

एंडी ई के जवाब पर एक त्वरित अनुसंधान कर, 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, इसका कारण यह है कि * आतंक * डोम घटना बुलबुला नहीं है। * लाइव * और * प्रतिनिधि * ईवेंट हैंडलर को डीओएम पदानुक्रम को आगे बढ़ाकर और ईवेंट को कैप्चर करते हुए काम करते हुए काम करते हुए काम करते हैं। बेशक, jQuery देवताओं ने * फोकस * और * ब्लर * –

+0

@ एंडी ई: यय जैसे कुछ कार्यक्रमों के लिए इस पर काम किया है, वे पहले ही काम कर चुके हैं, शायद 'त्रुटि' के लिए एक ही चीज़ करने के लिए सबसे बुरे विचार नहीं हो सकते हैं। मेरे लिए 'अच्छा है' की तरह लगता है। – jAndy

100
<img onerror='this.style.display = "none"'> 
+0

अनजाने में मैं इस समाधान का उपयोग नहीं कर सकता क्योंकि एचटीएमएल सामग्री जेसन के माध्यम से किसी तीसरे पक्ष की वेबसाइट से डाउनलोड की जाती है और मैं इसे संपादित नहीं कर सकता। फिर भी धन्यवाद। – systempuntoout

+7

बहुत बढ़िया, बस मुझे क्या चाहिए। सरल और unobstructive, यह एक टेम्पलेट में फिट बैठता है! – Max

+4

सौंदर्य की बात !!!!!! धन्यवाद @gary – malcolmX

4

हर छवि त्रुटि को छुपाने के लिए, बस अपने पेज (बस से पहले बंद करने शरीर टैग) के तल पर इस JavaScript जोड़ें:

(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. 
     } 
    } 
})(); 
+0

यह मेरा पसंदीदा दृष्टिकोण है क्योंकि यह बहुत अधिक सुनिश्चित करता है कि छवियों की गलती से पहले आतंकवादी घटनाएं बाध्य हैं और आपको प्रत्येक छवि टैग पर आतंक विशेषताओं को जोड़ने की आवश्यकता नहीं है। इस कोड को अपने सभी छवि टैग के बाद रखना सुनिश्चित करें, लेकिन किसी भी अन्य जावास्क्रिप्ट से पहले जो में है, अन्यथा अवरुद्ध बाहरी जेएस लोड छवि त्रुटि के बाद निष्पादन का कारण बन सकता है। – galatians

+0

यह मेरे लिए काम करता है, गैलाटियंस की सलाह के साथ, इस जेएस को कुछ भी करने से पहले इसे निष्पादित करने की आवश्यकता है। – Adamz

4

यह थोड़ा देर से जवाब देने के लिए हो सकता है, लेकिन यहाँ है मेरा प्रयास जब मुझे एक ही समस्या का सामना करना पड़ा, तो मैंने इस div में छवि & सेटिंग पृष्ठभूमि-छवि के आकार का एक div का उपयोग करके इसे ठीक किया। अगर छवि नहीं मिली है, तो div को पारदर्शी प्रदान किया जाता है, इसलिए यह सब जावा-स्क्रिप्ट कोड के बिना चुपचाप किया जाता है।

3

मैं, वास्तव में यह करने के लिए एक गंधा विधि पाया है, जबकि अभी भी कार्यात्मक जा रहा है जब की तरह Angular.js में ng-src निर्देशों का उपयोग और ...

<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" 
    /> 

आदि

4

मैं थोड़ा समाधान गैरी Willoughby ने सुझाव दिया संशोधन किया है, क्योंकि यह कुछ समय के लिए टूटी हुई छवि को दर्शाता है।मेरा समाधान:

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

मेरी समाधान छवि में प्रारंभ में छिपा हुआ है और इसे सफलतापूर्वक लोड होने पर ही दिखाया जाता है। इसका नुकसान है: उपयोगकर्ताओं को आधा लोड छवियां नहीं दिखाई देगी। और यदि उपयोगकर्ता ने जेएस को अक्षम कर दिया है तो उसे कभी भी कोई छवियां नहीं दिखाई देगी

+1

... और यदि जावास्क्रिप्ट अक्षम है, तो उपयोगकर्ता कुछ भी नहीं देखेंगे! – yckart

+0

@yckart ठीक है, अगर उपयोगकर्ताओं के पास जावास्क्रिप्ट अक्षम है, तो सबसे उपयोगी वेब एप्लिकेशन वैसे भी काम नहीं करेंगे ... – awe

+0

' 'आधा लोड और गैर-जेएस ब्राउज़र मामलों के लिए बेहतर काम कर सकता है? – JoeRocc

संबंधित मुद्दे