I have a piece of code that refreshes an HTML table every 5 seconds using AJAX calls
I am basically emptying out the HTML table and then appending all of its data again every 10 seconds to achieve this
Something like this –
$('#_appendHere').html('')
$('#_appendHere').append(response);
where _appendHere
is the id
attribute of the table
This is my HTML code – (the data is being passed from my Django view to this page)
<body>
<div>
<div>
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names..">
</div>
</div>
<br>
<br>
<br>
<br>
<table id="_appendHere" class="table table-striped table-condensed">
<tr>
<th>Username</th>
<th>Email</th>
<th>Gender</th>
</tr>
{% for item in info_data %}
<tr>
<td>{{item.username}}</td>
<td>{{item.email}}</td>
<td>{{item.gender}}</td>
</tr>
{% endfor %}
</table>
</body>
The CSS –
<style>
table, td, th {
border: 1px solid #ddd;
text-align: left;
}
table {
border-collapse: collapse;
width: 100%;
}
th, td {
padding: 15px;
}
</style>
And this is the javascript section –
var append_increment = 0;
setInterval(function() {
$.ajax({
type: "GET",
url: {% url 'App1:tempPage' %}, // URL to your view that serves new info
data: {'append_increment': append_increment},
})
.done(function(response) {
$('#_appendHere').html('')
$('#_appendHere').append(response);
append_increment += 10;
});
}, 5000)
The GET request is being made to this URL in a Django view which renders the same page –
from django.contrib import admin
from django.urls import path,include
from App1 import views
app_name = 'App1'
urlpatterns = [
path('temp/', views.tempPage,name="tempPage"),
]
The views.py file –
from django.shortcuts import render
from App1.models import Info
# Create your views here.
def tempPage(request):
info_data = Info.objects.all()
context={"info_data":info_data}
return render(request, 'App1/temp1.html', context)
For some reason, this code appends the input tag (the search box) as well.. but does it only once
And I am not sure why this is happening
I tried putting the input
tag in a different div
but that also does the same thing
Any help would be highly appreciated!! Thanks!!
Advertisement
Answer
I suspect your AJAX response contains the full Django response each time – it looks like you also have all those line-breaks <br>
as well as the search form in the AJAX response.
You need to create a version that just supplied the inner HTML you want to put inside the element (specifically, just the table rows).
<tr>
<th>Username</th>
<th>Email</th>
<th>Gender</th>
</tr>
{% for item in info_data %}
<tr>
<td>{{item.username}}</td>
<td>{{item.email}}</td>
<td>{{item.gender}}</td>
</tr>
{% endfor %}
With just the rows in the response, you can replace them “in one hit” with:
$('#_appendHere').html(response);
Alternatively, you can handle receiving the full response by loading it into jQuery and then selecting out the table specifically.
var div = document.createElement('div');
div.innerHTML = response;
var html = div.querySelector('#_appendHere').innerHTML;
$('#_appendHere').html(html);