【问题标题】:Append img if exists如果存在则附加 img
【发布时间】:2015-12-26 09:53:57
【问题描述】:

为了不使 html 文件太重,并且为了简单快速地阅读 porpuses,我想“动态”创建 img 元素,但前提是它们存在于服务器中,这就是我所期望的结果,所以我在这里尝试了两种解决方案:Question
error() mehode 的解决方案不起作用:Demo
控制台说$(...).error不是函数,我不知道为什么
我尝试使用标志

$('ul').each(function() {
  for (i = 2; i < 10; i++) {
    var flag = true
    image = new Image()
    image.src = $(this).find('img').attr('src').replace(/\d/, i)
    $(image).error(function() {
      flag = false
    })
    if (flag /*or i can just write: flag==true*/ ) {
      //do nothing
    } else {
      $(this).append('<li>' + $(image) + '</li>')
    }
    //or just => flag ? return : $(this).append('<li>' + $(image) + '</li>')
  }
})

但它不适用于我尝试的所有选项 我也尝试不使用.error() 而只使用if(image.width!=0)if($(image).width()!=0) 但它们都不起作用,当我尝试在控制台中获取宽度时,它显示为0(对于第一个选项)或未定义

Ajax 的第二种解决方案也不起作用:Demo
我不知道 success 是否是正确使用的参数,我检查了 jquery 网站中的文档,这是唯一对我有意义的参数
我觉得我做错了很多,请指导我 提前致谢

【问题讨论】:

  • 您忘记了var 用于iimage。不要创建全局变量:)
  • 对于i ?我没有名为 i 的变量
  • 在你的 for 循环中这样做。

标签: jquery html ajax


【解决方案1】:

jQuery 并没有真正的.error() 方法(在 1.8 中已弃用),它是原生的 image.onerror,但如果你使用 $(image).on('error', function() {...,jQuery 将支持它。 p>

但为什么不改用image.onload 事件

$('ul').each(function(index, elem) {
    for (var i = 2; i < 10; i++) {
        (function(image) {

             image.onload = function() { // image loaded successfully
                 $(elem).append( $('<li />').append(image) );
             }

             image.src = $(elem).find('img').attr('src').replace(/\d/, i);
        })(new Image());
    }
});

【讨论】:

  • 注意,有些图片可能会缓存在浏览器中,不会触发加载事件。有关详细信息,请参阅this answer。此外,有时使用image.attachEventListener('load', ...) 而不是直接分配给onload 更为明智,因为它会覆盖任何其他潜在的加载事件。
  • @Quantastical - 这是我们刚刚创建的全新图像,它没有任何其他处理程序。 image.complete 主要是旧 IE 版本的旧 hack,它并不总是在缓存图像时触发 onload 处理程序,它不再需要它,除非只需要支持旧 IE。
  • 你能提供一个Demo吗?因为它不起作用。至于 .error() 如果您想访问,我已经提供了文档的链接,我认为 onerror 是纯 javascript 而 .error() 是 jquery,它们都是一样的。
  • 你提供的代码太高级了,但是谢谢大声笑,一个用两个括号括起来的函数,紧跟在两个括号和new Image()之后,我明白了this我明白这一点参数,但我不知道传递给 indexelem 的内容,哈哈。你的演示工作正常,但我没有数组中的链接,链接是使用.replace()动态生成的我不知道如何更新你的演示,我试过但它说不能替换未定义,非常感谢你的帮助我
  • 该函数是一个 IIFE,它通过创建一个作用域来确保变量不会在下一次迭代中被覆盖。
【解决方案2】:

你需要使用onerror,例如:

function checkImage(src, good, bad) {
  var img = new Image();
  img.onload = good;
  img.onerror = bad;
  img.src = src;
}


var imageExist = "http://jsfiddle.net/img/logo.png";
var imageNotExist = "foo.gif";

checkImage(imageExist, function() {
  alert(this.src + " " + "good");
}, function() {
  alert("bad");
});

checkImage(imageNotExist, function() {
  alert("good");
}, function() {
  alert(this.src + " " + "bad");
});

【讨论】:

  • 在 for 循环中使用 onload 时会出现问题,即它仅在 for 循环完全完成后执行,我不明白为什么!这是demo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多