Javascript AJAX设置超时的替代方案?
我有一个脚本,它使用ajax在我的服务器(godaddy共享主机)上检索视频文件的PHP数据,然后在我的PHP页面上播放排名最高的视频文件,如下所示:Javascript AJAX设置超时的替代方案?,javascript,php,jquery,json,ajax,Javascript,Php,Jquery,Json,Ajax,我有一个脚本,它使用ajax在我的服务器(godaddy共享主机)上检索视频文件的PHP数据,然后在我的PHP页面上播放排名最高的视频文件,如下所示: <script id="source" language="javascript" type="text/javascript"> $(function refreshscreen () { $.ajax({ url: 'screen
<script id="source" language="javascript" type="text/javascript">
$(function refreshscreen ()
{
$.ajax({
url: 'screen.php',
data: "",
pass to api.php
dataType: 'json',
success: function(data)
{
var id = data[0];
var name = data[1];
var votes = data[2];
var video = data[3];
var image = data[4];
$('.screen').hide(); $("#video"+id+"").show();
var whichvideo = "thevideo" + id;
var videoplay = document.getElementById(whichvideo);
var killvideo = document.getElementsByClassName('videobg');
var allvideos = document.getElementsByClassName("videobg");
for(var x=0; x < allvideos.length; x++)
{
var allvideosid = document.getElementById(allvideos[x]);
if ($(allvideos[x]).attr("id") == whichvideo) {
allvideos[x].play();
} else {
allvideos[x].pause();
}
}
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(refreshscreen, 5000);
}
});
});
$(功能刷新屏幕()
{
$.ajax({
url:'screen.php',
数据:“,
传递到api.php
数据类型:“json”,
成功:功能(数据)
{
变量id=数据[0];
变量名称=数据[1];
var票数=数据[2];
var视频=数据[3];
var图像=数据[4];
$('.screen').hide();$(“#video”+id+).show();
var whichvideo=“thevideo”+id;
var videoplay=document.getElementById(whichvideo);
var killvideo=document.getElementsByClassName('videobg');
var allvideos=document.getElementsByClassName(“videobg”);
对于(var x=0;x
然后是上面提到的screen.php:
<?php
$host = "localhost";
$user = "myuserhere";
$pass = "mypasshere";
$databaseName = "mydbnamehere";
$tableName = "mytablenamehere";
$con = mysql_connect($host,$user,$pass);
$dbs = mysql_select_db($databaseName, $con);
$result = mysql_query("SELECT * FROM $tableName ORDER BY votes DESC");
$array = mysql_fetch_row($result);
echo json_encode($array);
?>
这一切都很好,当一个新的排名更高的视频被投票时,视频会自动切换,但是,在播放时,视频会定期冻结,完全是随机的。我的猜测是,我们正在使用ajax脚本的setTimeout函数重载服务器,因此我想知道是否有一种方法可以清理此脚本以避免冻结,或者是另一种方法
提前谢谢 我已经清理了代码:
var currentID = -1;
function refreshscreen() {
$.getJSON('screen.php', data => {
var topID = data[0];
// Schedule the next request
setTimeout(refreshscreen, 5000);
if (topID === currentID) return; // top rated video hasn't changed
$('.screen').hide();
$("#video" + topID).show();
var pauseID = "thevideo" + currentID;
var playID = "thevideo" + topID;
$(".videobg").each(function() {
if (this.id === pauseID) this.pause();
if (this.id === playID) this.play();
});
currentID = topID;
});
}
$(document).ready(function () {
refreshscreen();
});
最大的变化是跟踪当前正在播放的视频,如果没有变化,则立即退出。除此之外,我去掉了所有未使用的变量,并始终使用jQuery。这至少应该更容易调试,并且可能会在启动时修复错误。请注意,
mysql.*
函数自2013年(在PHP5.5中)起就被弃用,并从PHP7(2015年发布)起被删除。这是因为它们存在严重的安全漏洞。不要使用它们。请考虑切换到一个或多个,以确保您还可以防止:)我知道MySQL函数中的漏洞,并将在不久的将来将我的脚本迁移到MySqLi,谢谢您的关注。为什么会因为服务器过载而冻结视频?你自己主持视频吗?如果是这样的话,那就是你的问题,而不是ajax。否则,当您向自己的无关服务器发出请求时,我不明白为什么来自另一台主机的视频流会冻结。@AmrNoman-我只是假设是这样。我已经看到,发送太多重复的setTimeout请求可能会导致服务器上的回载,我不认为视频本身冻结,而是浏览器本身可能冻结。很难确定地说。另外:互联网速度被排除在问题之外,至少在我这方面,通过验证速度测试。可能是浏览器,一些拦截ajax调用的调试工具可能会导致性能问题。我在使用debugbar时遇到了laravel的问题。这使我的代码得到了很大的清理,但是问题仍然存在。经过进一步调查,实际发生的情况是,每次视频切换时,视频才开始加载。我现在正在寻找一种在页面加载之前预加载所有视频的方法,但是出于我最初问题的目的,我在这里给Chris G一个答案。