回调函数中的setTimeout不起作用

时间:2014-05-03 05:26:43

标签: javascript jquery settimeout

有人可以在下面的代码中找到问题

$(document).ready(function () {
    $("#leftsettingswindow").on("keyup", "#fontsize2", function () {
        setTimeout(function () {
            var txtVal = this.value;
            $('#content').css("font-size", txtVal + "%");
        }, 3000);
    });
});

这完美无缺,

$(document).ready(function () {
    $("#leftsettingswindow").on("keyup", "#fontsize2", function () {

            var txtVal = this.value;
            $('#content').css("font-size", txtVal + "%");

    });
});

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

this不是局部变量,因此它不会保存在闭包中。您需要将局部变量绑定到它:

$(document).ready(function () {
    $("#leftsettingswindow").on("keyup", "#fontsize2", function () {
        var savedThis = this;
        setTimeout(function () {
            var txtVal = savedThis.value;
            $('#content').css("font-size", txtVal + "%");
        }, 3000);
    });
});

答案 1 :(得分:3)

setTimeout不会在同一范围内调用。因此this与第二个示例中的this不同。

...
var self = this;

setTimeout(function () {
  var txtVal = self.value;
  $('#content').css("font-size", txtVal + "%");
}, 3000);
...

答案 2 :(得分:0)

归功于Barmar,他在另一个帖子上回答了这个问题。

“this”不是局部变量,因此它不会保存在闭包中。您需要将局部变量绑定到它:

$(document).ready(function () {
    $("#leftsettingswindow").on("keyup", "#fontsize2", function () {
        var savedThis = this;
        setTimeout(function () {
        var txtVal = savedThis.value;
            $('#content').css("font-size", txtVal + "%");
        }, 3000);
    });
});

答案 3 :(得分:0)

在代码段中,“this.value”在3秒后返回“undefined”。

所以,使用选择器,而不是这个

$(document).ready(function() {
  $("#leftsettingswindow").on("keyup", "#fontsize2", function() {
   setTimeout(function() {
      var txtVal = $('#fontsize2').val();
      $('#content').css("font-size", txtVal + "%");
    }, 3000);
  });
});