我创建了一个使用提供的示例here使用turn.js查看动态生成内容的示例。
这是我到目前为止的代码部分:
<body>
<div id="paper">
</div>
</body>
<script type="text/javascript">
$(window).ready(function() {
$('#paper').turn({pages: 12});
});
$('#paper').bind('turning', function(e, page) {
var range = $(this).turn('range', page);
for (page = range[0]; page<=range[1]; page++)
addPage(page, $(this));
});
function addPage(page, book) {
// Check if the page is not in the book
if (!book.turn('hasPage', page)) {
// Create an element for this page
var element = $('<div />').html('Loading…');
// Add the page
book.turn('addPage', element, page);
// Get the data for this page
$.ajax({url: "getPage?filename=abcd&page="+page})
.done(function(data) {
element.html(data);
});
}
}
</script>
getPage是一个jsp,它根据ajax请求返回<div class="page"><img src="docs/local/abcd_1.png" alt="" /></div>
或任何其他页码。
我遇到的问题是,在请求时,Web服务器上可能会提供请求的png,也可能没有。它们将在几秒(或有时很多)之后可用。因此,如果png不可用,我希望能够显示一些默认的“Loading ...”类型内容,并定期刷新(即每隔x秒)直到实际的png变为可用。如果需要,我在更改getPage的输出时没有问题。
答案 0 :(得分:1)
我已经设法通过进行以下更改来完成这项工作:
如果请求的png不可用, getPage现在返回<div class="loader"><img src="docs/local/ajax-loader.gif" alt="" /></div>
。
在调用页面中,我更改了我的代码以检查'loader'字符串,如果找到(这意味着png不可用),那么我调用setTimeout,在给定的时间后重试获取图像:
<body>
<div id="paper">
</div>
</body>
<script type="text/javascript">
$(window).ready(function() {
$('#paper').turn({pages: <s:property value='pages'/>});
});
$('#paper').bind('turning', function(e, page) {
var range = $(this).turn('range', page);
for (page = range[0]; page<=range[1]; page++)
addPage(page, $(this));
});
function addPage(page, book) {
// Check if the page is not in the book
if (!book.turn('hasPage', page)) {
// Create an element for this page
var element = $('<div />').html('Loading…');
// Add the page
book.turn('addPage', element, page);
// Get the data for this page
refreshPage(element,page);
}
}
function refreshPage( element, page )
{
$.ajax({url: "getPage?filename=<s:property value='filename'/>&page="+page})
.done(function(data) {
if( data.indexOf( "loader") > -1 )
{
setTimeout(function() {
refreshPage(element,page);
}, 5000);
}
element.html(data);
});
}
也许有更好的方法来实现这一目标,但至少它是有效的。