0

我有一个页面显示接受参加活动的人以及有关他们的一些详细信息。这些人通过填写表格来接受,然后将其提交到数据库。我的页面基本上向它发出 AJAX 请求并获取所有相关数据,然后将它们整理成可读的布局。

我正在尝试为查看此页面的人添加选项以设置刷新率 - 即每次重新发出 AJAX 请求之前的时间。例如,可以选择 30 秒,因此页面每经过 30 秒就会发出另一个 AJAX 请求并覆盖旧数据......

我所做的是有一些选择(60 秒、120 秒等)的下拉框。当该部分加载包含 AJAX 调用的 javascript 时,从保管箱中获取值并将其用作 setInterval 函数中的参数,如下所示

recurring = setInterval(function() {
                            getSchedule(dateText.trim());
                        },
                        $('input[type=hidden]#rr').val());

但请求是不停的。起初我认为问题可能是当预期的参数应该是数字时,JQuery 选择的结果是字符串,所以我尝试了

recurring = setInterval(function() {
                            getSchedule(dateText.trim());
                        },
                        parseInt($('input[type=hidden]#rr').val(),10));

但仍然没有。我不知道这是否意味着什么,但在测试这段代码时(当我试图查看值是什么类型时)

var interval = parseInt( $('input[type=hidden]#rr').val() , 10 );
alert( typeof ( interval ) + ' -- ' + interval );

警报框写道

数字——NaN

有什么想法吗?

好的,这是显示 html 代码的编辑

<div class='fields'>
    <input type='hidden' name='rr' id='rr' value='<?php if ( $_SESSION['rr'] != 0 ) echo $_SESSION['rr']*1000; else echo 86400000;  ?>'/>
    <div style='float:left; padding-top:5px;'>
        <b><i>TIME</i></b>
    </div>
</div>
<div id='schedule' style='overflow:auto;'>
</div>

这是显示数据的部分。AJAX 结果进入 schedule div 并且是更新的。隐藏字段包含间隔的毫秒数,是我使用 JQuery 获得它的地方。它存储在数据库中,当加载此页面时,与数据库进行一些通信并从那里获取它并将其保存在会话数组中

4

3 回答 3

1

一旦你使用了setInterval,除非你明确地调用clearInterval,它会继续调用你的函数。

相反,我建议你应该[setTimeout]像这样使用

setInterval(function () {
    getSchedule(dateText.trim());
},
$('input[type=hidden]#rr').val());

并在您的函数getSchedule中,再次调用 setInterval。这样,每次函数执行时,它都会为自己设置时间段。

function getSchedule(...){
   ...
   setInterval(function () {
        getSchedule(dateText.trim());
    },
    $('input[type=hidden]#rr').val());
}

就输入值而言,在看到您的 HTML 之前,我无法发表评论

于 2013-06-15T14:28:52.490 回答
0

[更新] 一些可能有助于但不能解决您的问题的评论:

对于您的选择,由于您使用的是 id,因此您应该直接选择(更快):

parseInt($('#rr').val()); // by default the base is 10

注意:你不必使用 typeof,因为你总是解析为 int,它总是一个数字

我想也许你的问题与那个价值有关,它存在吗?您可以检查页面并检查 html 的值吗?

于 2013-06-15T15:17:42.210 回答
0

所以我从来不明白为什么值被读取错误,也许浏览器在更改之前使用了缓存并加载了javascript......无论如何,我在上述工作的帮助下的最终解决方案如下

$(document).ready(function() {
    $('#datepicker').datepicker( {
        showOtherMonths: true,
        selectOtherMonths: true,
        dateFormat: 'yy-mm-dd',
        inline: true,
        onSelect: function(dateText, inst) {
                getSchedule(dateText.trim());
        }
    });

    var timeout;
    var today = $('#datepicker').datepicker('getDate');
    getSchedule($.datepicker.formatDate('yy-mm-dd', today));
});

function getSchedule(date)
{   
    if ( 'undefined' === typeof(timeout) ) ; else clearTimeout(timeout);
    timeout = setTimeout(function() {
                            getSchedule(date);
                        },
                        parseInt($('input[type=hidden]#rr').val(), 10)
                        );


    var request = $.ajax({
        type    : 'POST',
        url     : './scripts/php/schedule.php',
        data    : { date: date }
    });

    request.done(function(data,textStatus,jqXHR) {
        var height = $(window).height()-150;
        $("#schedule").height(height).html(data);
        }
    });

    request.fail(function(jqXHR, textStatus, errorThrown) {
    }); 
}

和html

<div class='fields'>
        <input type='hidden' name='rr' id='rr' value='<?php if ( $_SESSION['rr'] != 0 ) echo $_SESSION['rr']*1000; else echo 86400000;  ?>'/>
        <div style='float:left; padding-top:5px;'>
            <b><i>TIME</i></b>
        </div>

</div>
<div id='schedule' style='overflow:auto;'>
</div>
于 2013-06-15T15:43:26.320 回答