【发布时间】:2014-03-17 19:46:09
【问题描述】:
我正在从事一个 Web 开发项目,在该项目中我设计了水平选项卡式设计,然后单击每个选项卡后,我正在显示表格。
目前我的设计中只有两个标签。当我点击TEST1 标签时,它会显示Table1,但如果我点击TEST2 标签,它会显示另一个具有不同列和数据的表格Table2,它工作正常。
这是我的jsfiddle。
这是我的 test4.jsp 设计 -
<div id='headerDivDash'>
<h1 id='topHeaderDash'>
some_image
</h1>
</div>
<ul id="tabs">
<li><a href="#" name="tab1">TEST1</a></li>
<li><a href="#" name="tab2">TEST2</a></li>
</ul>
<div id="content">
<div id="tab1">
<h2>Test 1</h2>
<div class="container">
<c:forEach var="e" items="${testing.machines}">
<div class="component">
<h3>
For
<c:out value="${e.key}" />
</h3>
<table class="overflow-y">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Address</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<c:forEach var="m" items="${e.value}">
<tr>
<th>${m.fName}</th>
<td class="color-changer">${m.lName}</td>
<td>${m.address}</td>
<td>${m.email}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</c:forEach>
</div>
</div>
<div id="tab2">
<h2>Test 2</h2>
<div class="container">
<c:forEach var="e" items="${testing.machines}">
<div class="component">
<h3>
For
<c:out value="${e.key}" />
</h3>
<table class="overflow-y">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Address</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<c:forEach var="m" items="${e.value}">
<tr>
<th>${m.fName}</th>
<td class="color-changer">${m.lName}</td>
<td>${m.address}</td>
<td>${m.email}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</c:forEach>
</div>
</div>
</div>
<div class="footer">© Some value</div>
我正在将数据从控制器传递到 jsp 页面。现在我想做的是-
- 我想使用 AJAX 刷新每 30 秒刷新一次
tab1 div和tab2 div两个选项卡。最初,在任何刷新之前,我想将我的背景变灰,然后显示刷新图像。刷新完成后,该刷新图像将消失,两个 divtab1 div和tab2 div应该会被刷新。 - 另外,如果我在
TEST1选项卡上,然后正在刷新,那么它应该在TEST1选项卡上,但假设我在TEST2选项卡上,然后正在刷新,那么它应该在TEST2标签上。
我已经尝试按照我的 jsfiddle 和下面的 jquery 所示进行编码,我编写的代码只尝试刷新 tab1 div 但不知何故 tab1 div 没有反映最新数据。它总是显示我第一次点击 url 时看到的旧数据。而且我不确定我在那里做错了什么?
$(document).ready(function(){
// Create overlay and append to body:
$('<div id="overlay"/>').css({
position: 'fixed',
top: 0,
left: 0,
width: '100%',
height: $(window).height() + 'px',
opacity:0.4,
background: 'lightgray url(http://bradsknutson.com/wp-content/uploads/2013/04/page-loader.gif) no-repeat center'
}).hide().appendTo('body');
// Execute refresh with interval:
setInterval(refresh, 30 * 1000);
});
//Create a refresh function:
function refresh(){
// SHOW overlay
$('#overlay').show();
// Retrieve data:
$.ajax({
url: 'test4.jsp',
type: 'GET',
success: function(data){
var content = $($.parseHTML(data)).filter("#tab1");
//Replace content inside the div
$('#tab1').replaceWith(content); # this is not updating my tab div with latest data
// HIDE the overlay:
$('#overlay').hide();
}
});
}
我根本看不到我的tab1 div 正在刷新。我可以看到刷新图像显示,但不知何故 tab1 总是保存我第一次看到点击 url 的旧数据。我的 jquery 有什么问题吗?
还有如何为我的两个标签添加刷新?
更新:-
我注意到一件很奇怪的事情,如果我删除 content div and tab1 div 并刷新 container div 然后我可以在刷新后看到我更新的数据并且它工作正常但是如果我添加 content and tab1 div 并尝试刷新container div,那么它根本不起作用。所以肯定有问题..
【问题讨论】:
-
首先将数据的加载和数据的显示分开——这两种方法应该能够独立工作。然后考虑每条数据仅在可见时才需要。即单击选项卡:停止所有刷新。如果此选项卡的数据存在且不超过 30 秒,则加载数据,否则显示现有数据。仅为此选项卡的数据启动刷新循环。
-
@Popnoodles:感谢您的建议。我的代码没有分离出来吗?如果可能的话,你能提供一个例子吗?
-
你到底在处理什么文件?或者刷新什么文件?
-
@Wilmer:我在 test4.html 中拥有一切,一般来说,它是一个 jsp 页面,其中包含所有那些 html 和 jquery 的东西。所以一旦我将一个对象从控制器传递到 jsp,它应该显示在那里..所以我在那个test4.html(test4.jsp)页面中有一个刷新方法。
-
嗯,我看不出刷新功能有什么“错误”,也许可以简化一点,但就是这样。