开发者社区> 问答> 正文

计时器里面的参数time为什么停留在初始值?

screenshotscreenshot
js代码如下:

(function() {
                $.fn.countDown = function(userOptions) {
                    var defaultOptions = {
                            duration: 60
                        },
                        opt = $.extend({}, defaultOptions, userOptions),
                        time = opt.duration,
                        clickFlag = true;
                    function cd() {
                        if(time > 0) {
                            $(this).text('剩余' + time + '秒').css('cursor', 'not-allowed');
                            setTimeout(cd, 1000);
                            time--;
                            clickFlag = false;
                        } else if(time == 0) {
                            $(this).text('重新发送验证码').css('cursor','pointer');
                            time = opt.duration;
                            clickFlag = true;
                        }
                    }
                    $(this).on({
                        click: function() {
                            if(clickFlag == true) {
                                cd.call(this);
                            } else if(clickFlag == false) {
                                alert('不能重复点击!');
                            }
                        }
                    });
                };
            }());

            $(document).ready(function() {
                $('#CD_time').countDown({
                    duration: 120
                });
            });
            

经过几个前辈的指点,先修改代码如下:(已能顺利执行)

(function() {
                $.fn.countDown = function(userOptions) {
                    var defaultOptions = {
                            duration: 60
                        },
                        opt = $.extend({}, defaultOptions, userOptions),
                        time = opt.duration,
                        clickFlag = true,
                        _this = this;

                    function cd() {
                        if(time > 0) {
                            $(_this).text('剩余' + time + '秒').css('cursor', 'not-allowed');
                            setTimeout(cd, 1000);
                            time--;
                            clickFlag = false;
                        } else if(time == 0) {
                            $(_this).text('重新发送验证码').css('cursor', 'pointer');
                            time = opt.duration;
                            clickFlag = true;
                        }
                    }
                    $(this).on({
                        click: function() {
                            if (clickFlag == true) {
                                cd.call(this);
                            } else if (clickFlag == false) {
                                alert('不能重复点击!');
                            }
                        }
                    });
                };
            }());
            $(document).ready(function() {
                $('#CD_time').countDown({
                    duration: 120
                });
            });
            
            

展开
收起
小旋风柴进 2016-05-30 10:20:54 2009 0
1 条回答
写回答
取消 提交回答
  • 因为你调用cd函数时,只有第一次绑定了this,从第二次开始就cd里面的this都变成了window。

    你在函数cd的第一行加一句:console.log(this)打印一下this看看就明白了。

    修改方法:
    在函数cd外加一句:var _this = this;,然后把函数cd里面的this都改成_this即可。

    2019-07-17 19:19:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载