Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果html的src属性为<;img>;无效吗?_Html_Image - Fatal编程技术网

如果html的src属性为<;img>;无效吗?

如果html的src属性为<;img>;无效吗?,html,image,Html,Image,有没有办法在属性无效(仅使用HTML)的HTML中呈现默认图像?如果不是,你会用什么轻量级的方法来解决这个问题 <style type="text/css"> img { background-image: url('/images/default.png') } </style> img{ 背景图像:url('/images/default.png') } 请确保输入图像的尺寸,以及您是否希望图像平铺。您要求的是仅HTML的解决方案 对象测试 使用J

有没有办法在属性无效(仅使用HTML)的HTML
中呈现默认图像?如果不是,你会用什么轻量级的方法来解决这个问题


<style type="text/css">
img {
   background-image: url('/images/default.png')
}
</style>
img{ 背景图像:url('/images/default.png') }
请确保输入图像的尺寸,以及您是否希望图像平铺。

您要求的是仅HTML的解决方案


对象测试


使用Jquery,您可以执行以下操作:

$(document).ready(function() {
    if ($("img").attr("src") != null)
    {
       if ($("img").attr("src").toString() == "")
       {
            $("img").attr("src", "images/default.jpg");
       }
    }
    else
    {
        $("img").attr("src", "images/default.jpg");
    }
});
 window.onload = function() {
    fixBrokenImages('example.com/image.png');
 }

这对我很有效。也许您想使用JQuery来钩住事件

 <img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';">
演示:


正如fiddle所示,损坏的图像本身不会被删除,但这可能会解决大多数情况下没有任何JS或CSS的问题。如果您需要在不同的位置应用不同的图像,只需使用class:
进行区分。我的特例img:before{…

我认为仅仅使用HTML是不可能的。但是使用javascript这应该是可行的。基本上,我们在每个图像上循环,测试它是否完整,如果它的自然宽度为零,那么这意味着找不到它。代码如下:

fixBrokenImages = function( url ){
    var img = document.getElementsByTagName('img');
    var i=0, l=img.length;
    for(;i<l;i++){
        var t = img[i];
        if(t.naturalWidth === 0){
            //this image is broken
            t.src = url;
        }
    }
}

在Chrome和Firefox中测试任何图像,只需使用以下javascript代码:

if (ptImage.naturalWidth == 0)
    ptImage.src = '../../../../icons/blank.png';

其中,
pImage
是通过
文档获得的
标记地址。getElementById()

在第三版的Spring中找到了此解决方案

更新:
这不是唯一的HTML解决方案…
onerror
是javascript

如果您使用的是Angular/jQuery,那么这可能会有所帮助…

<img ng-src="{{item.url}}" altSrc="{{item.alt_url}}" onerror="this.src = $(this).attr('altSrc')">

解释

假设
item
有一个属性
url
可能为空,当它为空时,图像将显示为已损坏。这将触发执行
onerror
属性表达式,如上所述。您需要如上所述覆盖
src
属性,但需要jQuery访问altSrc.Co不能让它与香草JavaScript一起工作


可能看起来有点粗糙,但在我的项目上节省了时间。

上述解决方案不完整,它缺少属性
src

this.src
this.attribute('src')
不一样,第一个包含对图像的完整引用,例如
http://my.host/error.jpg
,但该属性仅保留原始值,
error.jpg

正确的解决方案

<img src="foo.jpg" onerror="if (this.src != 'error.jpg' && this.attribute('src') != 'error.jpg') this.src = 'error.jpg';" />


没有办法确定无数的客户(浏览器)会试图查看你的页面。考虑的一个方面是电子邮件客户端是事实上的Web浏览器,可能无法处理这样的骗局…… 同样地,您还应该包括一个默认宽度和高度的alt/text,如下所示。这是一个纯HTML解决方案

alt="NO IMAGE" width="800" height="350"
因此,另一个好的答案将稍微修改如下:

<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';" alt="NO IMAGE" width="800" height="350">

我对Chrome中的object标签有问题,但我想这也适用于它

您可以进一步设置alt/文本的样式,使其非常大

所以我的答案是使用Javascript,并提供一个很好的alt/text回退


我还发现了一个有趣的问题:

一个带有JQuery的模块化版本,在文件末尾添加以下内容:

<script>
    $(function() {
        $('img[data-src-error]').error(function() {
            var o = $(this);
            var errorSrc = o.attr('data-src-error');

            if (o.attr('src') != errorSrc) {
                o.attr('src', errorSrc);
            }
        });
    });
</script>
角度2:

<img src="{{foo.url}}" onerror="this.src='path/to/altimg.png'">

仅限HTML的解决方案,其中唯一的要求是您知道要插入的图像的大小。不适用于透明图像,因为它使用
背景图像作为填充

我们可以成功地使用
背景图像
链接给定图像丢失时出现的图像。然后唯一的问题是损坏的图标图像-我们可以通过插入一个非常大的空字符将其删除,从而将内容推到
img
的显示之外

img{
背景图像:url(“http://placehold.it/200x200");
溢出:隐藏;
}
img:以前{
内容:“;
字体大小:1000px;
}
缺少此图像:

并且正在显示占位符

一个简单的img元素不是很灵活,所以我将它与一个picture元素结合起来。这样就不需要CSS。当出现错误时,所有srcset都设置为备用版本。不会显示断开的链接图像。它不会加载不需要的图像版本。picture元素支持r浏览器不支持的类型的响应式设计和多个回退

<picture>
    <source id="s1" srcset="image1_not_supported_by_browser.webp" type="image/webp">
    <source id="s2" srcset="image2_broken_link.png" type="image/png">
    <img src="image3_fallback.jpg" alt="" onerror="this.onerror=null;document.getElementById('s1').srcset=document.getElementById('s2').srcset=this.src;">
</picture>

如果您使用的是Angular 1.x,则可以包含一条指令,允许您回退到任意数量的图像。回退属性支持单个url、数组中的多个url或使用范围数据的角度表达式:

<img ng-src="myFirstImage.png" fallback="'fallback1.png'" />
<img ng-src="myFirstImage.png" fallback="['fallback1.png', 'fallback2.png']" />
<img ng-src="myFirstImage.png" fallback="myData.arrayOfImagesToFallbackTo" />

谷歌把这个页面扔到了“image fallback html”关键字上,但由于上面没有帮助我,我一直在寻找“9以下IE的svg fallback支持”,我继续搜索,我发现:

<img src="base-image.svg" alt="picture" />
<!--[if (lte IE 8)|(!IE)]><image src="fallback-image.png" alt="picture" /><![endif]-->

这可能是离题了,但它解决了我自己的问题,也可能会帮助其他人。

好吧!! 我觉得这样很方便,检查image的height属性是否为0,然后可以用默认image覆盖src属性:

image.setAttribute('src','../icons/.png');
//检查高度属性。如果图像可用,则默认情况下它将
//是100还是0
如果(image.height==0){
image.setAttribute('src','../icons/default.png');
}
除了精彩的答案之外,对于那些正在寻找跨平台angular js解决方案的人来说,这里是:

<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
    <!-- any html as a fallback -->
</object>


下面是我试图找到正确解决方案的一个例子:

如果您创建了动态Web项目,并将所需的图像放置在WebContent中,则可以访问该图像
angular.module('app.services', [])
    .directive('fallback', ['$parse', function ($parse) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                var errorCount = 0;

                // Hook the image element error event
                angular.element(element).bind('error', function (err) {
                    var expressionFunc = $parse(attrs.fallback),
                        expressionResult,
                        imageUrl;

                    expressionResult = expressionFunc(scope);

                    if (typeof expressionResult === 'string') {
                        // The expression result is a string, use it as a url
                        imageUrl = expressionResult;
                    } else if (typeof expressionResult === 'object' && expressionResult instanceof Array) {
                        // The expression result is an array, grab an item from the array
                        // and use that as the image url
                        imageUrl = expressionResult[errorCount];
                    }

                    // Increment the error count so we can keep track
                    // of how many images we have tried
                    errorCount++;
                    angular.element(element).attr('src', imageUrl);
                });
            }
        };
    }])
<img src="base-image.svg" alt="picture" />
<!--[if (lte IE 8)|(!IE)]><image src="fallback-image.png" alt="picture" /><![endif]-->
 image.setAttribute('src','../icons/<some_image>.png');
  //check the height attribute.. if image is available then by default it will 
  //be 100 else 0
  if(image.height == 0){                                       
       image.setAttribute('src','../icons/default.png');
  }
<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
    <!-- any html as a fallback -->
</object>
<img src="Refresh.png" alt="Refresh" height="50" width="50">
<img src="img/Refresh.png" alt="Refresh" height="50" width="50">
<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">
<img src="some_image.tiff"
    onerror="fallBackImg(this);"
    data-fallIndex="1"
    data-fallback1="some_image.png"
    data-fallback2="some_image.jpg">
function fallBackImg(elem){
    elem.onerror = null;
    let index = +elem.dataset.fallIndex;
    elem.src = elem.dataset[`fallback${index}`];
    index++;
    elem.dataset.fallbackindex = index;
}