我有一个php脚本,它随机生成一个图像。类似这样的东西:
<?php
$image = imagecreatetruecolor(400,200);
// process image
// rendering image
header("Content-type: image/jpeg");
imagejpeg($image);
?>
我的html看起来像这样:
<img id="image" src="/models/plugins/image.php"/>
<button id="button">Get new image</button></body>
然后我有一个jquery文件来处理对按钮的点击,这样当点击按钮时就会加载一个新的随机图像:
$(function(){
$('#button').click(function(){
$.ajax({
url: 'models/plugins/image.php',
success: function(data){
$('#image').html('<img src="' + data + '">')
}
})
})
})
我使用firebug,我可以看到请求确实被发送了,响应也被成功接收了,但图像没有改变。
我做错了什么?我该如何解决?
我添加了另一个答案,因为我认为前面的答案都没有解决问题。我想,OP唯一想要的就是在点击按钮时更新(!)图像。因此,不需要Ajax请求,只需重新加载图像即可。您可以通过在图像的src属性中附加一个随机查询字符串来实现这一点。
$('#button').click(function() {
var $image = $('#image');
var plainSrc = $image.attr('src').split("?")[0]; // disregard previous query string
$image.attr('src', plainSrc + "?" + (new Date().getTime()));
});
图像标记的src
属性实际上需要一个URL,而不是实际的JPEG数据。
试试这个:
$(function(){
$('#button').click(function(){
$('#image').attr('src', 'models/plugins/image.php?rand=' + Math.floor(Math.random()*1000) );
});
});
要在src
属性中使用图像,您需要提供一个有效的URI,例如数据URI:
<?php
$image = imagecreatetruecolor(400,200);
// process image
// create image URI
ob_start();
imagejpeg($image);
echo "data:image/jpeg;base64,", base64_encode(ob_get_clean());
?>
我曾经为一个类似的问题整理了一个更详细的答案。
生成的图像必须经过base64编码才能像这样包含在内。
因此,您需要执行以下操作:
- 编辑图像
- 获取数据字符串中的结果图像
- 要获取图像字符串,您可以将其存储到文件系统并通过file_get_contents()读取(对缓存有用),也可以使用不带位置的imagejpeg(),将图像放在输出缓冲区中。要从输出缓冲区获取值,请使用ob_start()和ob_get_contents()
- 将图像的数据字符串转换为base64(使用base64_encode())
- 将此字符串返回到浏览器
- 将image"src"字段设置为"data:image/png;base64,[BBASE64]",其中[BAS64]是从PHP返回的字符串
浏览器正在缓存您正在调用的图像,请在图像url的末尾使用查询字符串,让浏览器处理它的新图像,并且不应使用缓存版本。
类似这样的东西:
$(function(){
$('#button').click(function(){
$.ajax({
url: 'models/plugins/image.php?t='+((new Date).getTime()),
success: function(data){
$('#image').html('<img src="' + data + '">')
}
})
})
})
尝试$('#image').attr('src', data);
而不是$('#image').html('<img src="' + data + '">')