任何人都可以帮助我如何做到这一点,如果数据库只有一些更改,我的脚本只能自动执行....在我当前的脚本中,它根据var timer
{{1}一直执行如果我在没有刷新页面的情况下更改数据库中的值,或者再次单击该按钮执行脚本,则自动更新setInterval
的输出。
我想做的是,只有在数据库中的表中有一些值更改时才会再次执行...有人知道怎么做吗?
脚本代码:
textboxes
search.php代码:
<script>
$(document).ready(function(){
var timer ;
$('#send_search_form').click(function(event){
event.preventDefault();
$(".search_form_input").val('');
$(".empty_batchcode").html("Doesn't exist!");
clearInterval(timer);
updateTextboxes();
});
var $funiq_id = $('#funiq_id'),
$t_region = $('#t_region'),
$t_town = $('#t_town'),
$t_uniq_id = $('#t_uniq_id'),
$t_position = $('#t_position'),
$t_salary_grade = $('#t_salary_grade'),
$t_salary = $('#t_salary');
function updateTextboxes(){
$.ajax({
url:"search.php",
type:"GET",
data: { term : $('#query').val() },
dataType:"JSON",
success: function(result) {
var ii = 1;
for (var i = 0; i < result.length; i++) {
$funiq_id.html(result[i].value).show(); // reference
$t_region.val(result[i].region).show(); // reference
$t_town.val(result[i].town).show(); // reference
$t_uniq_id.val(result[i].uniq_id).show(); // reference
$t_position.val(result[i].position).show(); // reference
$t_salary_grade.val(result[i].salary_grade).show(); // reference
$t_salary.val(result[i].salary).show(); // reference
$('#id'+ii+'').val(result[i].atid).show();
$('#aic'+ii+'').val(result[i].atic).show();
$('#name'+ii+'').val(result[i].atname).show();
$('#other_qual'+ii+'').val(result[i].other_sum).show();
$('#interview'+ii+'').val(result[i].interview_sum).show();
ii++;
}
if(timer == 1){
timer = setTimeout(updateTextboxes,1000);
}
}
});
timer = setInterval(updateTextboxes,50000);
}
});
</script>
答案 0 :(得分:0)
很难,但你可以做到。 (这就是想法和计算机的问题:答案总是肯定的,它只需要一段时间才能实现......)
假设您可以让ajax检索结果并将其显示给用户。现在,如果你再次执行ajax请求,你应该得到更新的结果。你甚至可以在循环中做到这一点!但这对于流量和用户系统来说效率不高。相反,为什么不让服务器尽可能地延迟其答案,同时它会定期检查(例如每两秒一次)数据库是否给出不同的结果?
这称为长轮询。搜索结果很复杂,所以让我们从更简单的角度来看一下。让我们说ajax调用想要咳出最新/最新的数据库条目,所以它请求一个执行这个SQL查询的PHP文件:
SELECT * FROM table ORDER BY `id` DESC LIMIT 1
PHP文件只返回id
。并允许附加调试timestamp
以区分各个请求。如果一切顺利,您只会在timestamp
时看到id
更改。
现在PHP做了(伪代码)
// Settings
$oldid = $_GET['oldid'];
$delay = 2; // in seconds
$timeout = 20; // in seconds, must be below server and browser timeout.
// Check until different, or timeout.
$timer = 0;
while (1) {
// TODO: Execute query and populate $id
// If different, return as JSON.
if ($id!=$oldid) {
die('{"ajax": {"poll": "OK","id": '.$id.',"timestamp": '.time().'}');
}
// If taking to long, stop.
if ($timer>$timeout) { die('{"ajax": {"poll": "timeout"}}'); }
$timer += $delay;
// The artificial delay.
sleep($delay);
}
现在,如果你使用somefile.php?oldid=3
来调用它,并且最新的数据库条目也是3,那么你会在20秒内恢复timeout
。除非在那段时间内id
改为其他值。
现在,执行AJAX的客户端不应该在第一个AJAX请求完成之前启动下一个AJAX请求。所以不要使用setinterval()
,而是使用settimeout()
。如果回复是timeout
,您可能不想更新页面内容。
就是这样! 搜索结果也是如此,但您应该考虑制作散列,CRC,时间戳或其他低CPU方法,以查看结果是否与新查询结果不同。
当web-socket在所有市长浏览器中得到标准化并实现时,这可能是更好的选择。它的使用基本上就像长时间轮询一样,具有更高的超时,因此没有多少收益。