【问题标题】:JavaScript setInterval() and setTimeout() freezing browserJavaScript setInterval() 和 setTimeout() 冻结浏览器
【发布时间】:2016-12-10 22:06:56
【问题描述】:

我正在使用基于 rrdtool 的移动友好型监控工具。

一切正常,但当我打开网页超过 1 小时时,我的电脑会冻结。

我使用这个 sn-p 来刷新图像。

<?php

if(!isset($includeCheck))
{
        exit ("No tienes permisos para ver directamente el archivo");
}

//echo "
//<script language='JavaScript'>
//        function refreshIt(element) {
//                setTimeout(function() {
//                element.src = element.src.split('?')[0] + '?' + new Date().getTime();
//                refreshIt(element);
//              }, 50000); 
//      }
//</script>";

echo "
<script language='JavaScript'>
        function refreshIt(element){
                setInterval(function() {
                element.src = element.src.split('?')[0] + '?' + new Date().getTime();
                }, 50000);
        }
</script>";


?>

我将这个 php 文件包含在我有图像并且我想刷新的页面中。

我尝试了 2 个选项,但正如我所说,冻结了我的浏览器。

有人知道我能做什么吗?因为我只需要刷新图像,我不想刷新整个页面。

编辑

这是打印数据库中所有图像的 PHP 脚本。

<?php

if(!isset($includeCheck))
{
        exit ("No tienes permisos para ver directamente el archivo");
}

if(isset($_GET['freq'])){
        $freq = $_GET['freq'];
        $title = 'Gráficas';
} else {
        exit ("No has especificado la frecuencia");
}

if($freq == "hourly"){
$title = 'Tráfico última hora';
}

if($freq == "daily"){
$title = 'Tráfico último dia';
}

if($freq == "weekly"){
$title = 'Tráfico última semana';
}

if($freq == "monthly"){
$title = 'Tráfico último mes';
}

if($freq == "yearly"){
$title = 'Tráfico último año';
}

if(isset($_GET['limit'])){
        $limit = $_GET['limit'];
} else {
        $limit="10";
}


if(isset($_GET['inicio'])){
        $inicio = $_GET['inicio'];
}

if(isset($_GET['subpage'])){
        $subpage = $_GET['subpage'];
        if ($subpage==1) {
                $inicio=0;
        }
} else {
        $subpage = "1";
        $inicio="0";

}

$total_records = $conn->query("SELECT graph_id FROM graph_".$freq)->num_rows;
$total_pages = ceil($total_records / $limit);


$sql = "SELECT graph_desc,graph_id,graph_name FROM graph_".$freq." ORDER BY graph_desc ASC LIMIT ".$limit." OFFSET ".$inicio.";";
$result = $conn->query($sql);

include_once 'adm/includes/pagination.php';

echo "<h1 id='titulo' class=\"page-header\">".$title."</h1>";
include_once 'adm/includes/refresh.php';


if ($total_pages != '1') {
echo "<div id='pager1' class='col-md-12'>";
echo $pagLink;
echo "</div>";
}

if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {

                echo "
                        <div class='graphSize' style='float:left; position:relative; z-index: 10;'>
                                <a href='?page=GraphDetail&graph_id=".$row['graph_id']."&graph_desc=".$row['graph_desc']."'>
                                        <img style='width:100%' src='/graficas/".$freq."/".$row['graph_name']."' onload='refreshIt(this)'></img>
                                </a>
                        </div>
                ";


        }
}
else {
        echo "<p>No hay ninguna gráfica para mostrar</p>"; }

if ($total_pages != '1') {
echo "<div id='pager2' class='col-md-12'>";
echo $pagLink;
echo "</div>";
}

echo "</body>";

if(isset($_GET['fullscreen'])){
        echo "<style>";
        echo ".graphSize {";
                echo "width:500px;";
        echo "}";
        echo "</style>";
}

$conn->close();

【问题讨论】:

  • 很高兴看到一个完整的 html 页面被渲染并发送到客户端。无论如何,我的第一个想法是您(或您当前的浏览器)有内存泄漏。尝试每隔 10 分钟监控一次浏览器消耗的资源量。
  • 也许尝试执行@KirillRogovoy 建议的操作,如果您的浏览器消耗大量资源尝试清理间隔并重新启动间隔?
  • 哪个浏览器有这个问题?
  • 我刚刚添加了php代码。 @Slico 我看到的问题是当浏览器选项卡没有聚焦时,javascript 被缓存,当我尝试重新打开选项卡时,开始执行所有缓存的轮询器。我试过 Safari、Chrome 和 Firefox。

标签: javascript php jquery html


【解决方案1】:

你的图片有这个onload 处理程序:

refreshIt(this)

...并且每 50 秒设置一个间隔(意味着它会重复)。该间隔的回调设置图像的 src,这意味着 onload 将再次触发,您将再次执行设置的间隔。因此,每次加载新版本的图像时,您都会添加另一个间隔,因此最终您会发生大量重复的回调。

您可能想使用setTimeout,或调用一次refreshIt(this),而不是每次onload

【讨论】:

  • 感谢雅各布的回答。我尝试了 setTimeout 函数(帖子中的评论),但仍然不成功。据我了解,这里的问题已经过去了 1 小时,我有 72 个针对单个图像源的回调?如果我重置计数器会起作用吗?
  • 如果您使用setTimeout 并且仅在加载最后一张图片后调用它,您一次只能有一个活动计时器,因此不应该出现这种情况。您之前的示例在内部调用了refreshIt,因此再加上每次都会触发的onload 会导致重复超时。只需在一个地方或另一个地方摆脱refreshIt 电话。
  • 好的,我试过了&lt;script language='JavaScript'&gt; function refreshIt(element) { setTimeout(function() { element.src = element.src.split('?')[0] + '?' + new Date().getTime(); refreshIt(element); }, 50000); } &lt;/script&gt;
  • 好的,运行良好,谢谢 Jacob。这一切都是为了一条简单的线!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2017-05-20
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多