setInterval 的问题

DataChat.Club 2015-07-01 08:33:04


<button id="aaa" type="button"> 点击</button>

<script type="text/javascript">

postdata=Math.random();
$('#aaa').on('click', function(){
$(document).ready(
function(){
setInterval(function(){
$.ajax({
url:"/test/aaa",
type:"post",
data: postdata
});
}, 5000);
};
);
});
</script>


问题是这样:

页面上第一次点击按钮后,会生成一个随机数(比如随机数是0.111222333),然后会每隔5s向服务端post一次这个数据(0.111222333);

页面上第二次点击按钮,生成的随机数是 0.333444555,同样,每隔5s会向服务端post一次数据(0.333444555);

但是,第一次点击后发的请求,还是一直在发-------就是说,页面会同时向服务端 post 0.111222333和0.333444555这两个数据。。。

有什么办法能在第二次点击按钮后,将第一次的setInterval给停止掉?
...全文
155 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hch126163 2015-07-02
  • 打赏
  • 举报
回复
var timer;/////// $('#aaa').on('click', function () { clearInterval(timer)///清除计时器 postdata = Math.random(); timer = setInterval(function () { $.ajax({ url: "/test/aaa", type: "post", data: postdata }); }, 5000); });
forwardNow 2015-07-01
  • 打赏
  • 举报
回复
14.1 计时器 (摘自《JavaScript权威指南》) 说明 setTimeout()和setInterval()可以用来 注册在指定的时间之后单次或重复调用的函数。 它们都是客户端JavaScript中重要的全局函数,所以定义为Window对象的方法, 但是作为通用函数,其实不会对窗口做什么事情。 setTimeout() Window对象的setTimeout()方法用来实现一个函数在指定的毫秒数之后运行。 setTimeout()返回一个值, 这个值可以传递给clearTimeout()用于取消这个函数的执行。 setInterval() 和setTimeout()一样,只不过这函数会在指定毫秒数的间隔里重复调用 setInterval(updateClock, 60000); // 每60秒调用一次updateClock() 和setTimeout()一样,setInterval()也返回一个值, 这个值可以传递给clearInterval(),用于取消后续函数的调用。 示例 /** * 在等待指定的时间后,开始重复调用某个函数 * @param f 在未来要调用的函数 * @param start start毫秒后开始调用 * @param interval 如果设置了interval,则使用setInterval调用f * @param end end毫秒后结束setInterval对f的调用,如果没有传入end,则调用不会停止 */ function invoke(f, start, interval, end) { if (!start) start = 0; if (arguments.length <= 2) { setTimeout(f, start); } else { setTimeout(repeat, start); function repeat() { var h = setInterval(f, interval); if (end) { setTimeout( function(){ clearInterval(h); }, end ); } } } } // 100毫秒后 调用一次 invoke(function(){console.info("你好")}, 100); // 100毫秒后 调用一次,以后每间隔500毫秒调用一次 invoke(function(){console.info("你好好")}, 100, 500); // 100毫秒后 调用一次,以后每间隔500毫秒调用一次,3000毫秒后停止调用 invoke(function(){console.info("你好好啊")}, 100, 500, 3000); 注意 字符串作为第一个参数 由于历史原因, setTimeout()和setInterval()的第一个参数可以传入字符串。 如果这么做, 那么这个字符串会在指定的超时时间或间隔之后进行求值(相当于执行eval()) 额外的参数 除了前面的两个参数外, HTML5规范(除IE)允许setTimeout()和setInterval()传入额外的参数, 并在调用函数时把这些参数传递进去。 然而, 如果需要支持IE,就不要应用此特性了。 0毫秒的超时 如果以0毫秒的超时时间来调用setTimeout(), 那么指定的函数不会立即执行。 相反,会把它放到队列中, 等待前面处于等待状态的时间处理程序全部执行完成后, 再“立即”调用它。 队列 http://ejohn.org/blog/how-javascript-timers-work/
vuturn 2015-07-01
  • 打赏
  • 举报
回复
哎呀,落后版主了
vuturn 2015-07-01
  • 打赏
  • 举报
回复
var timer; $('#aaa').on('click', function(){ clearInterval(timer); timer= setInterval(function(){ $.ajax({ url:"/test/aaa", type:"post", data: postdata }); }, 5000); }); 另外setInterval不是一种好的计时器,一般会用setTimeout(function(){ //do someting setTimeout(arguments.callee,5000); },5000); 取代
  • 打赏
  • 举报
回复
click事件里面注册 $(document).ready(这个干吗。。直接启动计时器,然后用一个变量记住计时器id以便清楚
    postdata = Math.random();
    var timer;///////
    $('#aaa').on('click', function () {
        clearInterval(timer)///清除计时器
        timer = setInterval(function () {
            $.ajax({
                url: "/test/aaa",
                type: "post",
                data: postdata
            });
        }, 5000);

    });

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧