【问题标题】:Changing <img src="XXX" />, js event when new image has finished loading?新图像加载完成时更改 <img src="XXX" />,js 事件?
【发布时间】:2010-03-25 20:23:48
【问题描述】:

我有一个照片库网页,其中单个 &lt;img src="XXX" /&gt; 元素的 src 使用 javascript 更改(单击)以显示下一张图片 - 我猜是穷人的 ajax。当新图像几乎立即出现时,在更快的连接上效果很好。即使加载需要几秒钟,我测试过的每个浏览器都会保留旧图像,直到新图像完全加载。

不过,在慢速连接上等待那几秒钟有点令人困惑,我想知道在新图像加载完成时是否会触发一些 javascript 事件,让我可以稍微工作.. . 动画 gif 或其他东西。

我知道我可以真正使用 AJAX(我已经在使用 jQuery),但这是一个非常好的和简单的解决方案。除了这种滞后,还有什么其他原因我应该远离这种改变图像的方法吗?

谢谢。

【问题讨论】:

    标签: javascript jquery html javascript-events


    【解决方案1】:

    您可以在“加载”事件上设置处理程序。

    $('img.whatever')
      .load(function() { /* do stuff */ })
      .attr('src', newURL);
    

    其实我猜你想用“live()”来做这个:

    $('img.reloadable').live('load', function() { $(this).show(); });
    // ...
    $('img#someId').hide().attr('src', newURL);
    

    edit — 哇,那一年去哪儿了?好吧,事实证明,我在回溯时输入的“实时”方法的一个问题是“加载”事件没有冒泡。然而,现在您可以做的是利用“图像”对象(与&lt;img&gt; DOM 元素相反)的行为方式。基本上,更改 URL 的函数可以使用“图像”元素作为保存处理程序的位置。 更改 real &lt;img&gt; 标记的实际“src”属性的代码也会更新“Image”对象实例的“src”。浏览器只会真正加载一次图像(假设缓存控制很酷),但浏览器仍然会调用“图像”的“onload”处理程序:

    (function() {
      var imageObj = new Image();
    
      imageObj.onload = function() {
        // code to run when image loads from server 
      };
    
      $('#hypotheticalButton').click(function() {
        $('#imgToUpdate').attr('src', newURL);
        imageObj.src = newURL;
      });
    })();
    

    【讨论】:

    • 谢谢,就是这样。对其他人来说非常清楚:当 src="xxx" 用 js 更改时,$.load() 在新图像完成加载后触发。
    • 这似乎对我不起作用。请参阅示例:jsfiddle.net/fGmbN 永远不会显示警报。
    • hmm ... @Tauren 好吧,让我玩它,看看我能不能弄清楚发生了什么。
    • @Tauren 啊——“加载”不会冒泡,它会出现。因此,如果您尝试使用“live”或“delegate”,事情可能无法正常工作(可能在某些浏览器中,但可能不会)。我会更新答案;谢谢,很抱歉造成混乱。
    • 感谢您提供解决方案并说明为什么它不起作用!
    【解决方案2】:

    您只需使用 jQuery 预加载图像,这样当用户单击时,下一个图像已经加载并且不应该有延迟......除非用户转到您的页面并开始点击加载之前的图像。

    http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript

    【讨论】:

    • 是的,我考虑过这一点,但有大约 100 张全尺寸图片等待加载,而且大多数人不会查看所有图片。
    【解决方案3】:
    var slideimg = $('#slideimage');
    slideimg.click(function(){
        var img = new Image();
        var url = 'url_to_next_image.jpg';
        $(img).bind('load',function(){
            $('#loading').hide();
            slideimg.attr('src',url);
        }).attr('src',url);
        $('#loading').show();
    });
    

    即使是 IE 的疯狂缓存处理,这也应该可以工作。

    【讨论】:

    • 唯一的问题是它会在每次点击时绑定一个新的负载处理程序。
    猜你喜欢
    • 2013-11-24
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多