0

首先让我说我的任务已经完成。但我试图了解它是如何工作的,有一件事让我感到困惑。换句话说,我偶然发现了答案。

我的任务很简单:在输入框中,通过在延迟后将每个字符更改为 * 来屏蔽用户键入的输入。这就是安卓手机处理屏蔽输入的方式,与 iPhone 略有不同。

我使用了 jQuery/javascript 和正则表达式的组合。我的工作代码:

$('.room_input').focus(function () {
    currentFocus = $(this);
});

$('.key').click(function () {
    setTimeout(function () {
        currentFocus.val(currentFocus.val().replace(/[^\*]/, '*'));
    }, 2000);
});

这很简单,而且效果很好。每按一次键,2 秒后变为 *。每个键都有自己的计时器。但是有一件主要的事情我不明白。当来自 setTimeout 的回调触发时,上面的代码似乎会将文本框的全部内容设置为 *。因为上面的“replace”用任何不是*的字符替换了值的全部内容。

但事实并非如此。每个键在单击后 2 秒后发生变化(应该如此)。这是为什么?我在想它可能是正则表达式 - 它只会改变它找到的第一个匹配项吗?我只是回答了我自己的问题吗?

更新:我做到了。这是正则表达式。它只替换字符串中第一个匹配的字符。我在想这可能与单线程问题有关......像往常一样,我让一个问题比它更困难。:)

4

1 回答 1

0

是的,你是对的。

每次按键都会添加一个字符,然后启动一个计时器,该计时器稍后会将第一个非星号变为星号。它比你想象的要简单得多。

于 2013-02-14T22:30:35.397 回答