在setTimeout中调用它

时间:2016-06-15 08:32:02

标签: javascript jquery input timeout

我正在寻找一种在函数内部正确调用this的方法,现在我有快速入侵var that = $(this);,但我确信有适当的方法可以做到这一点。我怎么能避免这种黑客攻击?

这是输入字段,用于获取var并检查Typing Interval

<input type="text" data-package="pink" class="js-p-input">

这是我的代码:

var cCalc = (function ($) {
    var s;
    return {
        settings: {
            typingTimer: "",
            doneTypingInterval: 300,
            $inputs: $(".js-p-input"),

        },

        init: function () {
            s = this.settings;
            this.bindUIActions();
        },

        bindUIActions: function () {

            //on keyup, start the countdown
            s.$inputs.on('keyup', function () {
                var that = $(this);                
                clearTimeout(s.typingTimer);               
                s.typingTimer = setTimeout(function() {
                    cCalc.doneTyping(that, that.data("package"));
                }, s.doneTypingInterval);
            });

            s.$inputs.on('keydown', function () {
                clearTimeout(s.typingTimer);
            });

        },


        doneTyping: function ($input, packageName) {
            console.log('done!');
            cCalc.getValues($input.val(), packageName);
        },

    };

})(jQuery);

cCalc.init();

2 个答案:

答案 0 :(得分:0)

使用“黑客”没有任何问题,这是标准的操作程序。另请参阅此处What is the difference between call and apply?了解更多“hacky”内容,其中“this”是标准内容。

答案 1 :(得分:0)

正如其他人所指出的那样,使用闭包并没有什么不妥,但你可以选择绑定&#34;这个&#34;进入超时功能范围如下:

s.$inputs.on('keyup', function () {

  clearTimeout(s.typingTimer);

  s.typingTimer = setTimeout(function() {

    cCalc.doneTyping($(this), $(this).data("package"));

  }.bind(this), s.doneTypingInterval);

});