如何在jQuery中重新加载/刷新元素(图像)


262

是否可以使用jQuery从服务器重新加载具有相同文件名的图像?

例如,我在页面上有一个图像,但是,物理图像可以根据用户操作而改变。注意,这并不意味着文件名更改,而是实际的文件本身。

即:

  • 用户查看默认页面上的图像
  • 用户上传新图片
  • 页面上的默认图像未更改(我认为这是由于文件名相同,浏览器使用了缓存的版本)

无论下面的代码被调用的频率如何,相同的问题仍然存在。

$("#myimg").attr("src", "/myimg.jpg");

在jQuery文档中,如果“加载”函数具有触发事件的默认方法,而不是将回调函数绑定到元素的成功/完成加载,则该函数将是完美的。

非常感谢您的协助。


1
@Alexis,您的问题是该图像已缓存在浏览器中,并且在服务器上更改后不会更新吗?
杰伊

1
@jeerose,我认为这是问题所在,因为文件实际上确实发生了更改(相同的文件名),并且如果您执行整页刷新,则会反映在页面上。
亚历克西斯·艾伯里

Answers:


551

听起来好像是您的浏览器在缓存图像(我现在注意到您在问题中写道)。您可以通过传递一个额外的变量来强制浏览器重新加载图像,如下所示:

d = new Date();
$("#myimg").attr("src", "/myimg.jpg?"+d.getTime());

1
添加查询字符串变量完全使我的主意。这样就解决了,图像现在可以根据要求重新加载。
亚历克西斯·艾伯里

45
黑帮技巧,喜欢它
Dave Jellison

4
它有效,这是一个不错的解决方法,但仍然是解决方法!是否有其他方法来获取图像以告知浏览器忘记缓存的图像?
spuas

我有一个非常挑剔的网络摄像头,它似乎禁止任何对包含参数的静态图像的请求。啊。否则,这是一个很好的解决方案。
dangowans 2014年

3
@TomasGonzalez B / C可能会获得了碰撞的机会random,并且应该永远不会Date,除非你真的很快速。; ^)在客户端上获取日期并不占用大量资源,并且您可以一次重用所需数量的图像,因此请继续执行步骤4。获利。
鲁芬2015年

57

这可能不是最好的方法,但是我过去已经通过使用JavaScript将时间戳附加到图像URL来解决了这个问题:

$("#myimg").attr("src", "/myimg.jpg?timestamp=" + new Date().getTime());

下次加载时,时间戳记设置为当前时间,并且URL不同,因此浏览器对图像进行GET而不是使用缓存的版本。


2
这对我有用了很多年,但是今天,如果文件名不正确,我的图像服务器(不受我控制)开始返回断开的链接。如果有人有其他解决方法,将不胜感激。不幸的是,该线程中的每个答案都是对此的变体。
felwithe

@felwithe,可能这台服务器仅在查询末尾查找扩展名吗?因此,您可以尝试测试这种方法:imagename.jpg?t=1234567&q=.jpgimagename.jpg#t1234567.jpg
FlameStorm

26

这可能是您提到的两个问题之一。

  1. 服务器正在缓存图像
  2. jQuery不会触发或至少不会更新属性

老实说,我认为这是第二。如果我们可以看到更多的jQuery,将会容易得多。但首先,请尝试先删除该属性,然后再次设置它。只是看看是否有帮助:

$("#myimg").removeAttr("src").attr("src", "/myimg.jpg");

即使可行,也请发布一些代码,因为这不是最佳选择,imo :-)


@Kordonme,有人在这里评论“不好的” jQuery吗?(我在开玩笑,我在开玩笑);)
jay

@Kordonme,它实际上保存在事件处理程序中,目前是唯一的代码行。我在此行之前添加了一个警报,以确认事件确实在触发。事件触发时没有错误。
亚历克西斯·艾伯里

3
我有一个非常挑剔的网络摄像头,它似乎禁止任何对包含参数的静态图像的请求。啊。对于我的独特案例,这是一个很好的解决方案。谢谢。
dangowans 2014年

如果您不希望/需要残差参数,这是最佳答案
RafaSashi

感谢此帮助(它仅在Chrome中为我缓存了)
Daniel Resch,

14

只用一行就不用担心将图像src硬编码到javascript中了(感谢您的想法:

$("#myimg").attr("src", $("#myimg").attr("src")+"?timestamp=" + new Date().getTime());

13
请注意,因为这将无限地在URL末尾添加越来越多的字符
Alfo 2012年

9

要绕过缓存避免在图像URL中添加无限时间戳,请在添加新时间戳之前先去除之前的时间戳,这就是我的方法。

//refresh the image every 60seconds
var xyro_refresh_timer = setInterval(xyro_refresh_function, 60000);

function xyro_refresh_function(){
//refreshes an image with a .xyro_refresh class regardless of caching
    //get the src attribute
    source = jQuery(".xyro_refresh").attr("src");
    //remove previously added timestamps
    source = source.split("?", 1);//turns "image.jpg?timestamp=1234" into "image.jpg" avoiding infinitely adding new timestamps
    //prep new src attribute by adding a timestamp
    new_source = source + "?timestamp="  + new Date().getTime();
    //alert(new_source); //you may want to alert that during developement to see if you're getting what you wanted
    //set the new src attribute
    jQuery(".xyro_refresh").attr("src", new_source);
}

6

这很棒!但是,如果您多次重新加载src,则时间戳也将串联到url中。我已经修改了可接受的答案以解决该问题。

$('#image_reload_button').on('click', function () {
    var img = $('#your_image_selector');
    var src = img.attr('src');
    var i = src.indexOf('?dummy=');
    src = i != -1 ? src.substring(0, i) : src;

    var d = new Date();
    img.attr('src', src + '?dummy=' + d.getTime());
});

3

您是否尝试过重置图像容器html。当然,如果是浏览器在缓存,那将无济于事。

function imageUploadComplete () {
    $("#image_container").html("<img src='" + newImageUrl + "'>");
}

2

有时实际上是这样的解决方案-

$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

也无法正确刷新src,请尝试一下,它对我有用->

$("#Image").attr("src", "dummy.jpg");
$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

1

使用“#”作为分隔符可能很有用

我的图像保存在“ www”上方的“隐藏”文件夹中,因此仅允许登录用户访问它们。出于这个原因,我不能使用普通的,<img src=/somefolder/1023.jpg>但是我向服务器发送请求的方式是类似的<img src=?1023>,它通过发送回以名称“ 1023”保存的图像作为响应。

该应用程序用于图像裁剪,因此在ajax请求裁剪图像后,该内容将作为服务器上的内容更改,但保留其原始名称。为了查看裁剪的结果,在完成ajax请求之后,从DOM中删除第一个图像,并插入一个具有相同名称的新图像<img src=?1023>

为避免套现,我在请求中添加了以“#”开头的“ time”标签,因此它变成了<img src=?1023#1467294764124>。服务器会自动过滤掉请求的哈希部分,并通过发送回我保留为“ 1023”的图像来正确响应。因此,我总是在没有太多服务器端解码的情况下获得映像的最新版本。


1
为什么要经历所有麻烦才能提供图像?似乎毫无意义的麻烦
lucasreta '17

0

我可能不得不多次重新加载图像源。我发现Lodash的解决方案对我来说很有效:

$("#myimg").attr('src', _.split($("#myimg").attr('src'), '?', 1)[0] + '?t=' + _.now());

现有的时间戳将被截断并替换为新的时间戳。


-1

基于@kasper Taeymans的回答。

如果您只是需要重新加载映像(而不是用新的smth替换它的src),请尝试:

$(function() {
  var img = $('#img');

  var refreshImg = function(img) {
    // the core of answer is 2 lines below
    var dummy = '?dummy=';
    img.attr('src', img.attr('src').split(dummy)[0] + dummy + (new Date()).getTime());

    // remove call on production
    updateImgVisualizer();
  };


  // for display current img url in input
  // for sandbox only!
  var updateImgVisualizer = function() {
    $('#img-url').val(img.attr('src'));
  };

  // bind img reload on btn click
  $('.img-reloader').click(function() {
    refreshImg(img);
  });

  // remove call on production
  updateImgVisualizer();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<img id="img" src="http://dummyimage.com/628x150/">


<p>
  <label>
    Current url of img:
    <input id="img-url" type="text" readonly style="width:500px">
  </label>
</p>

<p>
  <button class="img-reloader">Refresh</button>
</p>


-2

我只是在html中执行此操作:

<script>
    $(document).load(function () {
        d = new Date();
        $('#<%= imgpreview.ClientID %>').attr('src','');
    });
</script>

并在下面的代码中重新加载图像,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        image.Src = "/image.jpg"; //url caming from database
    }

}


1
重新加载页面并在asp.NET WebForms中进行设置不是这里的主题。
乔纳斯·斯滕维德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.