所以我知道有很多免费的图像旋转器等,使用 jQuery 之类的东西。然而,我的问题是,有没有办法在不刷新网站页面的情况下动态更新图像旋转器?
所以基本上你正在显示十张图片,然后 1 小时后你有一个脚本删除旧图片添加十张新图片和一个新的 xml 文件,你需要刷新页面吗?或者脚本是否总是动态检查 xml 文件,因此您不必进行刷新。
ps 它不必在 jQuery 中,可以是 HTML5 或类似的 - 我只想能够从文件夹中添加和删除图像,并让旋转器自动更新以使用文件夹中的内容
我认为,如果可能的话,最好不要对画廊进行任何可能需要重新初始化的操作。下面的方法旨在通过替换图库图像而不替换 img 节点本身来实现这一目标。
首先,让我们假设服务器端代码已经启动并且可以正常工作,并以任何方式返回 json,当解码后相当于:
[
"images/aaa.jpg",
"images/bbb.jpg",
"images/ccc.jpg",
"images/ddd.jpg",
"images/eee.jpg",
etc.
]
然后:
$(function(){
var $galleryImgs = $('#myGallery img');//gallery img nodes in a jQuery wrapper.
var updateGallery = function() {
$.ajax({
url: 'getImageUrls.php', //or whatever
data: {
n: $galleryImgs.length //specify how many new image urls to fetch
},
dataType: 'json',
success: function(data) {
$.each(data, function(i, url) {
if($galleryImgs[i]) { //safety
$galleryImgs[i].src = url; //replace each gallery image in turn
}
});
}
});
};
var galleryInterval = setInterval(updateGallery, 60*60*1000);//60*60*1000 for one hour; 30*60*1000 for half an hour
});
因此,画廊插件将(希望)继续它的旋转,幸福地不知道它的图像已被更改。一些画廊插件可能比其他插件更适合这一点 - 需要进行实验。
就删除和替换文件而言,您必须在服务器端进行。你没有提到服务器语言,所以我建议在另一个问题中打开它。一旦你弄清楚了,你可以让你的脚本使用 ajax 轮询服务器以获取更新。
查询看起来(有点)像这样:
refreshShow = function() {
$.ajax({
url: 'imagefeed.json',
dataType: 'json',
type: 'post',
data: {
gallery: 'homeGallery'
},
success: function(data) {
$('#homeGallery img').remove();
$.each(data, function(i, image){
$('#homeGallery').append(
$('<img />').attr('href', image.path)
)
});
}
});
};
然后你的民意调查:
$(function(){
setTimeout(function(){ refreshShow() }, 30000); //polls every 30 seconds for updates
});
JSON 提要会提供一些路径,也许还有标题。您可以在 SO 上找到一大堆关于以不同语言创建 JSON 输出的问题。请记住,这是示例代码,大多数幻灯片都比这稍微复杂一些。
我假设文件夹中的图像具有不同的名称,因此您可能需要提供一个 URL,您可以轮询该 URL 以获取新文件名,可能如下所示:
它返回这样的json:
{
images: ["i1.jpg", "i1.jpg", "i1.jpg", "i1.jpg", "i1.jpg"],
version: 12
}
然后,您可以频繁地向该 url 发出 ajax 请求,查看版本号是否被碰撞,然后替换图像轮播中的图像。如果您没有找到可以让您动态更改图像的工具,那么编写起来应该很简单。
这是一种方法,您只需要添加自动旋转: http ://sorgalla.com/projects/jcarousel/examples/dynamic_flickr_api.html
我已经实现了这个并且可以正常工作,但是我只是没有图像自动更改。我使用 ajax 请求
/basic_stats/graph.png?graph.type=IMAGE
其中 /basic_stats/graph.png 只是我配置到特定视图的路线。您的图像滑块不会关心您是否在图像链接中传递参数,只要该路由返回它所期望的 png 或 jpg。在我的情况下,我有一个自动化进程,它在后台运行统计信息,然后将图像存储到一个 Redis 层,该层的视图为 /basic_stats/graph.png? 配置为轮询。然后我只查询 request.params['some_key_value'] 并返回一个图像作为响应对象。然后你根本不需要做任何 ajax 魔术,只需生成正确的响应对象。
config.add_route('ImageSlider', '/images/ImageSlider.png')
@view_config(route_name='ImageSlider')
def ImageSlider(request):
imgData = None
if 'graph.type' in request.params:
if request.params['image.name'] == 'ImageSlider1':
r_server = redis.Redis('127.0.0.1')
imgDataObj = r_server.get('ImageSlider1')
del r_server
imgData = pickle.loads(imgDataObj)
elif request.params['image.name'] == 'ImageSlider2':
r_server = redis.Redis('127.0.0.1')
imgDataObj = r_server.get('ImageSlider2')
del r_server
imgData = pickle.loads(imgDataObj)
return Response(body_file=imgData, content_type='image/png')
此示例使用 Redis 存储序列化图像数据,但您可以使用 PIL ex 从 FS 轻松加载文件
imgData = Image.open("/images/ImageSlider1.png")
您现在可以让视图在这些特定位置使用您想要的任何图像进行响应。然后只需将您的图像位置传递给您的滑块
src="/images/ImageSlider.png?image.name=ImageSlider1"
src="/images/ImageSlider.png?image.name=ImageSlider2"
只需让您的视图调整它动态响应的图像。Redis 允许您超时您的密钥,并让外部进程在侦听时重新填充密钥,以将新图像提供给您的网络服务器。请注意,这可能不会随着您移动的图像数据而扩展,而是用于基本统计报告的内部应用程序,这就是我使用它的原因,它很棒,而且无缝快速。我还没有对它进行负载测试以查看上限是多少,但我们不会有很多并发用户。
不管你使用什么框架,这个例子应该是完成你的任务的一个选项。
我想在 Backbone.js 中链接视图渲染调用以在任意更新期间更改图像 src 也可能有效,但我还没有深入 Backbone.js 兔子洞,而且这个概念可能仅限于 Backbone.js。
类似的事情可以通过使用服务器端语言和 Ajax 来完成。你没有提到一个,所以我只是以 PHP 为例,但这个概念几乎是:
A) 启动旋转器并加载文件夹中的图像。
B) 使用 setTimeout(); 创建一个函数,该函数将使用 Ajax 调用检查目录的 PHP 页面,并返回检查目录中图像名称的 json。
C) 删除旋转器的当前图像,然后使用 JSON 中的新信息重新填充它。
一个例子是:
[PHP]
$listOfImages = new array();
foreach( glob("/uploads/*.jpg") as $file ){
array_push( $listOfImages, $file ); // gets an array of all the jpgs in the uploads directory
}
return json_encode( $listOfImages );
[jQuery]
<script type='text/javascript'>
$(function($){
var slider = new Slider(); //Pseudo-class for a slider
setTimeout(function(){
$.ajax({
url:"update-slider-with-images.php",
type:"post",
dataType:"json",
success:function(data){
slider.clearAllImages(); //pseudo function to remove images from slider
var images = JSON.parse( data );
for(image in images){
slider.addImage( image ); //Psuedo function to add image to the rotation queue
}
slider.slide(); // Pseudo function to start the slider
}
});
},300000); // check every 6 minutes
});
</script>
这可能不是您所需要的一切,因为您需要创建滑块类或以其他方式在我的示例中重新实现该代码,但只要您了解 PHP,就足以让您入门。如果您不这样做,我认为将其转换为其他东西不会太难。我知道 Rails 可以处理文件系统的东西,我相信 ASP.Net 也可以。
我有一个您可能感兴趣的简单jQuery方法。
示例中使用的 Image Rotator 是JW Image Rotator,它使用 XSPF、RSS 和 ASX 标签格式的外部文件。
它也可能只是可下载演示提供的简单的xml 文本文件。您可以考虑使用 Flicker,然后访问这些 RSS 源来简化播放列表。
对于您提到的第一个问题,在演示中通过简单的 setTimeout 显示在不刷新网页的情况下更新图像旋转器。它重新加载之前更新过的相同 playlist.xml文件或使用不同的播放列表文件。
为了解决您的第二个问题,playlist.xml文件在指定时间重新加载自己时使事情变得容易,因为它会自动强制更新您在图像文件夹中的内容(例如,如果不使用 RSS URL 提要)。
每当您覆盖文件时,例如01.jpg 到 10.jpg ,然后在重新加载事件期间,由于JW Image Rotator检索它们,它将抓取新文件。
这意味着没有时间戳或其他黑客来强制重新加载。更进一步,您可以拥有一系列播放列表,这些播放列表可以自动循环以实现完全自动化的过程。
演示
中有很多注释和一些控制台日志消息来解释发生了什么,以便您可以将演示的方法调整到任何其他图像旋转器或图像插件。
这是jsFiddle 上
的一个DEMO,它是教程版本。
这个jsFiddle 上的 DEMO 不包含任何注释或控制台,因此您可以清楚地看到代码。
这是可下载的教程版本的pastebin。
要在本地试用这个DEMO,您需要开源 JW Image Rotator,当前版本为 v3.18,现在有 JW 水印,但 v3.17没有...它压缩在这里,它包括所有源文件,包括.fla Flash 文件。
演示还包含一个指向JW Image Rotator JavaScript API命令的链接,这些命令甚至没有使用过……但可以随时用于进一步定制!