javascript - jQuery:确定用户何时完成更改文本

标签 javascript jquery

我有一个表,其中一个 td 单元格有一个 input type=text 字段。表格中的每一行都有这样的内容:

<td class="expected_minutes">
   <input id="minutes-980" class="minutes" type="text" value="39" name="minutes-980">
</td>

现在我要做的是在用户更改此特定单元格中的值时更改另一个单元格中的值。当用户完成更改文本时,它不一定必须完成。每当文本框中的值发生变化时都可以——任何最有效的。这是我在 SO 上找到的一些代码,可以帮助我入门:

//setup before functions
    var typingTimer;                //timer identifier
    var doneTypingInterval = 2000;  //time in ms

    //on keyup, start the countdown
    $('.minutes').keyup(function(){
        clearTimeout(typingTimer);
        typingTimer = setTimeout(doneTyping, doneTypingInterval);
    });

    //on keydown, clear the countdown 
    $('.minutes').keydown(function(){
        clearTimeout(typingTimer);
    });

    //user is "finished typing," do something
    function doneTyping () {
        console.log("DONE TYPING");
    }

我在这里发现的问题是这段代码很可能是针对具有单个输入文本框的应用程序。我有几行,每一行都有一行,当该特定行中的分钟值被修改时,我需要运行一些代码。

有没有办法让我的表格中的所有文本框都能正常工作?

最佳答案

您需要某种方式将超时与特定输入相关联。一种方便的方法是使用 jQuery 的 .data功能:

var doneTypingInterval = 2000;  //time in ms

//on keyup, start the countdown
$('.minutes').keyup(function(){
    var typingTimer = $(this).data('timer');
    clearTimeout(typingTimer);

    typingTimer = setTimeout(doneTyping, doneTypingInterval);

    $(this).data('timer', typingTimer);
});

//on keydown, clear the countdown 
$('.minutes').keydown(function(){
    clearTimeout($(this).data('timer'));
});

//user is "finished typing," do something
function doneTyping () {
    console.log("DONE TYPING");
}

此外,作为旁注,我真的根本不认为需要 keydown 处理程序。您可以使用一个处理程序(在 keyupkeydown 上)完成所有这些操作。

示例: http://jsfiddle.net/RkWH5/


评论更新:如果您需要知道哪个输入“完成”,您可以使用 $.proxy 创建一个函数,其 this 值是输入:

var doneTypingInterval = 2000; //time in ms

$('.minutes').keydown(function () {
    var typingTimer = $(this).data('timer');

    clearTimeout(typingTimer);

    typingTimer = setTimeout($.proxy(doneTyping, this), doneTypingInterval);

    $(this).data('timer', typingTimer);
});

function doneTyping() {
    /* `this` is the element that the user is done typing in. */
    $(this).css('color', 'red');
}

如果你不想使用this,你可以这样传递一个参数给doneTyping:

var doneTypingInterval = 2000; //time in ms

//on keyup, start the countdown
$('.minutes').keydown(function () {
    var typingTimer = $(this).data('timer')
        , el = this;

    clearTimeout(typingTimer);

    typingTimer = setTimeout(function () {
        doneTyping(el);
    }, doneTypingInterval);

    $(this).data('timer', typingTimer);
});

//user is "finished typing," do something
function doneTyping(el) {
    /* do something with "el" */
}

关于javascript - jQuery:确定用户何时完成更改文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080276/

相关文章:

javascript - Threejs 围绕 3d 矩阵 Axis 中的另一个对象旋转一个对象

样式不起作用的 Javascript 函数参数

javascript - 我需要一个在每个字符都在 [a-zA-Z0-9_] 之外或者字符串仅为数字的情况下失败的正则表达式

JavaScript 计时、jQuery fadeIn fadeOut

javascript - jquery prepend <span> 没有自动添加结束标签

javascript - jQueryUI 只能垂直调整大小

jquery - 如何使用 JQuery 在 <td> 标签内插入 <div> 标签

javascript - ngView 中指令使用的远程数据存储在哪里? (AngularJS)

javascript - 有人可以告诉我这个 javascript 代码在做什么吗

javascript - 代码返回 JSON 错误 Uncaught SyntaxError : Unexpected token :