使用ajax从php获取结果并重新加载页面
所以我已经为此工作了好几个小时了,我读了很多StackOverflow的帖子,但我仍然没有运气 我有一个页面,它有两个部分,这取决于数据库中的int值,取决于在什么时候显示哪个部分 我的目标是让页面查看数据库状态是否已从当前状态更改,然后刷新页面,如果未更改,则只需每隔10秒重新运行一次 我在页面顶部运行PHP,从数据库获取int使用ajax从php获取结果并重新加载页面,php,jquery,ajax,Php,Jquery,Ajax,所以我已经为此工作了好几个小时了,我读了很多StackOverflow的帖子,但我仍然没有运气 我有一个页面,它有两个部分,这取决于数据库中的int值,取决于在什么时候显示哪个部分 我的目标是让页面查看数据库状态是否已从当前状态更改,然后刷新页面,如果未更改,则只需每隔10秒重新运行一次 我在页面顶部运行PHP,从数据库获取int $online_status = Online_status::find_by_id(1); 然后,我使用HTML将状态加载到jquery可以访问的内容中 &l
$online_status = Online_status::find_by_id(1);
然后,我使用HTML将状态加载到jquery可以访问的内容中
<input type="hidden" id="statusID" value="<?php echo $online_status->status; ?>">
<span id="result"></span>
然后转到另一个运行以下代码的PHP页面
if(isset($_POST['search'])){
$current_status = $_POST['search'];
$online_status = Online_status::find_by_id(1);
if($current_status != $online_status->status){
echo "<script>location.reload();</script>";
}else{
}
}
if(isset($\u POST['search'])){
$current_status=$_POST['search'];
$online_status=online_status::按_id查找_(1);
如果($current_status!=$online_status->status){
回显“location.reload()&semi;”;
}否则{
}
}
jquery然后加载到HTML部分,id为“result”,如前所示。我知道这是一个非常糟糕的方法,因此,它在一开始就可以工作,但是你把它留在页面上的时间越长,页面变得越慢,直到它冻结
如果有人能给我指出一个合适的方法,我将非常感激。
谢谢 您的页面正在变慢,因为每次调用
liveCheck
函数时都会创建一个新的间隔。随着时间的推移,您会有许多时间间隔同时运行并向PHP文件发送请求。您可以通过在浏览器中打开开发人员控制台并监视“网络”选项卡来验证此行为
您应该做的是设置一次间隔,并在该间隔内执行$.ajax
调用。此外,如果当前请求处于挂起状态,最好不要发送新请求,方法是实现一个布尔值
状态变量,该变量在请求处于挂起状态时为true,在请求完成时为false
您的函数的预期行为似乎是在$online\u status->status
更改时重新加载页面,对吗?如果是这样,请将您的PHP更改为echotrue
或1
(任何真正的内容),并将您的JS重写为:
function liveCheck() {
if (liveCheckPending == true)
return;
liveCheckPending = true;
var search = $('#statusID').val();
$.ajax({
url:'check_live.php',
data:{search:search},
type:'POST'
}).done(function(data){
if (!data.error)
location.reload();
}).always(function(data){
liveCheckPending = false;
});
}
var liveCheckPending = false;
setInterval(liveCheck, 10000);
由于每次调用
liveCheck
函数时都会创建一个新的间隔,因此页面速度变慢。随着时间的推移,您会有许多时间间隔同时运行并向PHP文件发送请求。您可以通过在浏览器中打开开发人员控制台并监视“网络”选项卡来验证此行为
您应该做的是设置一次间隔,并在该间隔内执行$.ajax
调用。此外,如果当前请求处于挂起状态,最好不要发送新请求,方法是实现一个布尔值
状态变量,该变量在请求处于挂起状态时为true,在请求完成时为false
您的函数的预期行为似乎是在$online\u status->status
更改时重新加载页面,对吗?如果是这样,请将您的PHP更改为echotrue
或1
(任何真正的内容),并将您的JS重写为:
function liveCheck() {
if (liveCheckPending == true)
return;
liveCheckPending = true;
var search = $('#statusID').val();
$.ajax({
url:'check_live.php',
data:{search:search},
type:'POST'
}).done(function(data){
if (!data.error)
location.reload();
}).always(function(data){
liveCheckPending = false;
});
}
var liveCheckPending = false;
setInterval(liveCheck, 10000);
js:
php:
js:
php:
尝试调整PHP文件以返回true或false。如果你得到的是真的,你可以从javascript本身重新加载页面,而不是插入一行javascriptI的新脚本标记。我更新了PHP以返回真的,但我不能让ajax只刷新如果它是真的,它要么一直刷新,要么根本不刷新。如果data==truel我尝试过,我让PHP返回真的,我让它回显'true'我让JS if data==true,我让它if data='true'仍然为空回显实际的布尔值,而不是字符串。可以尝试console.log(数据)并共享输出吗?尝试调整PHP文件以返回true或false。如果你得到的是真的,你可以从javascript本身重新加载页面,而不是插入一行javascriptI的新脚本标记。我更新了PHP以返回真的,但我不能让ajax只刷新如果它是真的,它要么一直刷新,要么根本不刷新。如果data==truel我尝试过,我让PHP返回真的,我让它回显'true'我让JS if data==true,我让它if data='true'仍然为空回显实际的布尔值,而不是字符串。你能试试console.log(data)并共享输出吗?我试过运行代码,但什么都没有发生,不管我如何更改状态,它都不会刷新页面。抱歉,修改:data.trim==''更正为data.trim()=''页面仍然不会刷新,奇怪的一个ehi测试代码没有问题,当php回显空字符串时,将刷新当前页面,否则将显示从php获取的html。有关更多信息,您需要打印出从浏览器或浏览器控制台日志中得到的错误。您需要检查来自console的网络请求我刚刚使用了console.log(数据),它正在打印我的整个页面顶部、标题和导航。它是如何获取所有数据的?我试着运行代码,但什么都没有发生,不管我如何更改状态,它都不会刷新页面。抱歉,修改:data.trim==''更正为data.trim()=''页面仍然不会刷新,奇怪的一个ehi测试代码没有问题,当php回显空字符串时,将刷新当前页面,否则将显示从php获取的html。有关更多信息,您需要打印出从浏览器或浏览器控制台日志中得到的错误。您需要检查来自console的网络请求我刚刚使用了console.log(数据),它正在打印我的整个页面顶部、标题和导航。它是如何获得所有这些数据的?我更新了我的代码以匹配您的js,我将我的php更改为返回true,然后使用echo true进行了尝试,页面只是不断地重新加载,除非php条件为true,否则它不应该重新加载。将if(!data.error)
更改为if(data)
,然后重试。不过,您已经了解了基本的想法。每
(function(){
function liveCheck(){
var search = $('#statusID').val();
$.ajax({
url:'check_live.php',
data:{search:search},
type:'POST',
success:function(data){
if(data.trim() == ''){
location.reload();
}else{
$('#result').html(data);
window.setTimeout(function(){
liveCheck();
}, 10000);
}
}
});
}
$(function(){
liveCheck();
});
})(jQuery)
<?php
if(isset($_POST['search'])){
$current_status = $_POST['search'];
$online_status = Online_status::find_by_id(1);
if($current_status != $online_status->status){
$data = '';
}else{
$data = 'some html';
}
echo $data;
}