【问题标题】:Using AJAX / jQuery to refresh an image使用 AJAX / jQuery 刷新图像
【发布时间】:2012-06-10 20:10:29
【问题描述】:

这可能是一个简单的问题,但我很困惑,只是不知道从哪里开始。

我有一个返回图像 URL 的 PHP 脚本 (image_feed.php)。每次调用此 URl 时,它都会返回可用的最新图像(图像每几秒钟更改一次)。

我想要发生的是,当页面加载时,有一个对 image_feed.php 的 AJAX 调用,它返回最新的 url。然后将此 URl 插入到 HTMl 中,替换相应的图像 src。

5 秒后,我希望重复该过程并更新图像。但是,我不希望在完成加载之前交换图像,并且我希望避免在新图像加载之前出现空白。

目前我有以下 jQuery,它只是将 image_feed.php 的返回值直接加载到一个名为#image1 的 div 中。 image_feed.php 的格式正确,可提供 html 图片标签。

    $(document).ready(function(){
    var $container = $("#image1");
    $container.load('image_feed.php?CAMERA_URI=<?=$camera_uri;?>')
    var refreshId = setInterval(function()
    {
        $container.load('image_feed.php?CAMERA_URI=<?=$camera_uri;?>');
    }, 5000);

}); 

这可行,但有一个问题。每次图像刷新时,我都会在 IE 和 Firefox 中得到一个与图像大小相同的空白,因为图像需要一段时间才能下载。

我知道我需要让 image_feed.php 将纯 URL 返回到图像。然后我使用一些 jQuery 来请求这个 URL,预加载它,然后用现有的图像交换它。

但是,我仍然难以到达任何地方。有人可以给我一些指点/帮助吗?

【问题讨论】:

    标签: php jquery html ajax


    【解决方案1】:

    你可以。当您想重新加载某些内容时,您只需附加一个搜索查询,以便刷新源。

    例如,当有一个经常变化的图像(比如验证码)并且你想重新加载它,而不刷新浏览器,你可以这样做:

    初始代码:

    <img src="captcha.png" alt="captcha" />
    

    刷新代码:

    <img src="captcha.png?1" alt="captcha" />
    

    这里使用的脚本只是:

    var d = new Date();
    $('img').attr('src', $('img').attr('src') + '?_=' + d.getMilliseconds());
    

    希望这会有所帮助! :)

    【讨论】:

    • 您好,感谢您的帮助。我了解如何使用 .attr 替换图像。但是,我正在努力解决的是获取最新图像 URL 的 AJAX 请求,以及如何将该响应加载到变量中,然后将其输入到交换图像 src 的语句中。
    • @jakew009 您应该获取的最新图像 URL 是变化的还是不变的?我要问的是,一直都是image.png 还是一次eghkasdf.png 和下一次sdjlhkg.png?
    • Praveen,它每次都在变化。它看起来像 ZHWABRKJIY_2012-06-06_20-18-24_041.jpg
    • 哦,在这种情况下,您可以使用 jQuery AJAX 加载来获取新 URL。让我在几分钟内把它放在一个不同的答案中...... :)
    • 检查一下。希望有帮助。 :)
    【解决方案2】:

    我建议你使用jQuery 'onImagesLoad' Plugin 这会在图像加载完成时为您提供回调。

    当您从服务器接收到新的图像 URL 时,您会创建一个带有 src="new_url_from_server" 的新 &lt;img 对象并将 'onImagesLoad' 回调附加到它。当您的回调被调用时,您的图像已完成下载。

    现在您可以将旧 img 对象的 'src' 属性替换为 new_url_from_server。 由于新图片已经在缓存中可用,所以不会再次下载,会立即显示!

    另外,您可以隐藏旧图像并将此新图像添加到 DOM(如果上述工作正常,则不需要)

    一些简单的骨骼样本可能是这样的:

    <!DOCTYPE html> 
    <html> 
    <body> 
    <img id='bla' src="10.jpg" />
    
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript" src="jquery.onImagesLoad.js"></script> 
    <script type="text/javascript"> 
        $(function(){ 
            var img = $('<div><img src="http://myserverbla/images/verybig.jpg"></img></div>');
            img.onImagesLoad({ 
                    all : allImgsLoaded 
                });
    
            function allImgsLoaded($selector){ 
                var allLoaded = ""; //build a string of all items within the selector 
                $selector.each(function(){ 
                    $('#bla').attr('src','http://myserverbla/images/verybig.jpg');
                }) 
            } 
        }); 
    </script> 
    
    </body> 
    </html>
    

    【讨论】:

    • 感谢您的回答。我之前确实玩过这个插件,但不确定如何使用回调功能。现在说得通了——非常感谢。
    【解决方案3】:
    $(document).ready(function() {
        var $img = $('#image1');
        setInterval(function() {
            $.get('image_feed.php?CAMERA_URI=<?=$camera_uri;?>', function(data) {
                var $loader = $(document.createElement('img'));
                $loader.one('load', function() {
                    $img.attr('src', $loader.attr('src'));
                });
                $loader.attr('src', data);
                if($loader.complete) {
                    $loader.trigger('load');
                }
            });
        }, 5000);
    });
    

    未经测试。上面的代码应该在后台加载新图像,然后在加载时设置旧图像的 src 属性。

    加载的事件处理程序将只执行一次。 .complete 检查对于可能缓存了要加载的图像的浏览器是必需的。在这种情况下,这些浏览器可能会也可能不会触发load 事件。

    【讨论】:

    • 很好的答案,只是在加载图像需要几秒钟的情况下,这将不起作用。也许在 onload 之后在调用自身的函数中使用 setTimeout(而不是 setInterval)?
    • 这立即完美运行!极好的!现在我只需要稍微编辑它,因为它不会在加载第一张图像之前等待 5 秒。谢谢!
    • @darma 这绝对是一个问题。然后你必须处理下一张图片永远不会加载的问题,但很容易。
    【解决方案4】:

    考虑一下,如果您必须再次从服务器获取 URL,对于新的图像 URL,您可以这样做:

    $.ajax({
      url: 'getnewimageurl.php',
      success: function(data) {
        $('img').attr('src', data);
      }
    });
    

    服务器应该只返回一个新的图像名称。例如,PHP 代码应该是这样的:

    <?php
        $images = array("jifhdfg", "jklduou", "yuerkgh", "uirthjk", "xcjhrii");
        die($images[date('u') % count($images)] . ".png"); // Get the random milliseconds mod by length of images.
    ?>
    

    【讨论】:

    • 感谢 Praveen - 这是我一整天都在努力实现的目标,现在开始变得有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多