javascript - 使用 javascript 解决数字键盘难题

标签 javascript jquery asynchronous numbers dom-events

几天前我参加面试,公司给了我一个使用 Javascript 解决的难题,但我无法完成。

您可以在此处查看代码:

$(document).ready(function(){
    $("#phone").find("button").mouseup(function(event){
        var button_pressed = $(event.currentTarget).data("value")
        $("#result").val(t9($("#result").val(),button_pressed))
    })
})
function t9(text,button_pressed){
    // Write your code here
    return text
}
#phone button{
    height: 50px;
    width: 75px;
}
#phone button span{
    display: block;
    margin-top: 5px;
    font-size: 10px;
}
#result{
    width: 225px;
    height: 25px;
    margin-left:2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="phone">
    <tr>
        <td colspan="3">
            <input type="text" id="result" />
        </td>
    </tr>
    <tr>
        <td>
            <button data-value="1" class="key">1
                <span>. , !</span>
            </button>
        </td>
        <td>
            <button data-value="2" class="key">2
                <span>a b c</span>
            </button>
        </td>
        <td>
            <button data-value="3" class="key">3
                <span>d e f</span>
            </button>
        </td>
    </tr>
    <tr>
        <td>
            <button data-value="4" class="key">4
                <span>g h i</span>
            </button>
        </td>
        <td>
            <button data-value="5" class="key">5
                <span>j k l</span>
            </button>
        </td>
        <td>
            <button data-value="6" class="key">6
                <span>m n o</span>
            </button>
        </td>
    </tr>
    <tr>
        <td><button data-value="7" class="key">7
            <span>p q r s</span>
            </button>
        </td>
        <td>
            <button data-value="8" class="key">8
                <span>t u v</span>
            </button>
        </td>
        <td>
            <button data-value="9" class="key">9
                <span>w x y z</span>
            </button>
        </td>
    </tr>
    <tr>
        <td><button data-value="*" class="key">*</button></td>
        <td><button data-value="0" class="key">0</button></td>
        <td><button data-value="#" class="key">#</button></td>
    </tr>
</table>

请运行代码片段

现在,
单击 2 -> 输出应该是 -> a
再次点击 2 -> 输出应该是 -> b
再次点击 2 -> 输出应该是 -> c

单击 3 -> 输出应为 -> c(+d) => cd
再次点击 3 -> 输出应该是 -> c(+e) => ce
2-3 秒后点击 3 -> 输出应该是 -> ce(+d) => ced

长按 1 -> 输出应该是 -> ced(+1) => ced1
长按 2 -> 输出应该是 -> ced1(+2) => ced12
长按 3 -> 输出应该是 -> ced12(+3) => ced123

最后当你..
单击 1 -> 输出应为 -> ced123(+".") => ced123.
再次单击 1 -> 输出应为 -> ced123(+",") => ced123,
再次点击 1 -> 输出应该是 -> ced123(+"!") => ced123!

我找不到这种与时间相关的程序的任何解决方案。如果您有足够的时间帮我解决这个问题,我将不胜感激。如果您有任何与此相关的指南或任何文档,请提供给我..

最佳答案

你只需要记住最后一次和最后一个按钮并比较它们就知道是否应该“增加”一个字符。

如果您还记得最后一个索引,则实际增量会更容易,但如果您愿意,也可以从前一个文本的最后一个字符中获取它。

至于长按,这可能是真正的测试,因为提供的代码不足以让您检测到这一点。最终你需要按下鼠标来确定是否发生了长按。

$(document).ready(function(){
    $("#phone").find("button").mouseup(function(event){
        var button_pressed = $(event.currentTarget).data("value");
        $("#result").val(t9($("#result").val(),button_pressed));
    }).mousedown( t9_down );
});

function t9(text,button_pressed){
    const { last_time, last_down, last_button } = t9, // Load states
        keys = [ '0', '.,!', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz' ],
        long_press = 1000, // ms
        timeout = 2000; // ms
    let index = 0, // Which character?
        now = new Date().getTime(),
        candidates = keys[ button_pressed ] || button_pressed; // All characters
    // Handle complex buttons
    if ( candidates.length > 1 ) {
       if ( last_button === button_pressed && now - last_time <= timeout ) {
           // Quick click of same button
           const len = text.length - 1,
               last_char = text.charAt( len );
           index = ( candidates.indexOf( last_char ) + 1 ) % candidates.length;
           text = text.substr( 0, len );
       } else if ( now - last_down > long_press )
           // Long press
           now = candidates = button_pressed;
       // Save states
       Object.assign( t9, { last_time: now, last_down: 0, last_button: button_pressed } );
    }
    text += String( candidates )[ index ];
    return text;
}

function t9_down(event) {
    if ( ! ~~$(event.currentTarget).data("value") ) return;
    t9.last_down = new Date().getTime();
}
#phone button{
    height: 50px;
    width: 75px;
}
#phone button span{
    display: block;
    margin-top: 5px;
    font-size: 10px;
}
#result{
    width: 225px;
    height: 25px;
    margin-left:2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="phone">
  <tr>
    <td colspan="3">
      <input type="text" id="result" />
  <tr>
    <td><button data-value="1" class="key">1<span>. , !</span></button>
    <td><button data-value="2" class="key">2<span>a b c</span></button>
    <td><button data-value="3" class="key">3<span>d e f</span></button>
  <tr>
    <td><button data-value="4" class="key">4<span>g h i</span></button>
    <td><button data-value="5" class="key">5<span>j k l</span></button>
    <td><button data-value="6" class="key">6<span>m n o</span></button>
  <tr>
    <td><button data-value="7" class="key">7<span>p q r s</span></button>
    <td><button data-value="8" class="key">8<span>t u v</span></button>
    <td><button data-value="9" class="key">9<span>w x y z</span></button>
  <tr>
    <td><button data-value="*" class="key">*</button>
    <td><button data-value="0" class="key">0</button>
    <td><button data-value="#" class="key">#</button>
</table>

关于javascript - 使用 javascript 解决数字键盘难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199348/

相关文章:

javascript - 如何以编程方式单击打开 Javascript 窗口的小书签并验证窗口的内容?

javascript - 为什么 [eval] 在 [eval][0] ('code' 中起作用)?

javascript - 如果只知道函数名称,如何获取对数组中函数的引用?

javascript - 谷歌地图未捕获类型错误 : Cannot read property 'firstChild' of null in vue js html?

java - 使用 CompletableFuture 从主线程退出

javascript - 创建一个自定义 Angular 原理图来生成以下划线开头的文件?

c# - 如何检测不同的用户设置?启用 Javascript,启用 Cookie

javascript - 如何在 jQuery UI 自动完成中手动聚焦/突出显示项目?

android - 将文件从 Assets 复制到数据文件夹后,数据未首次在 android 中显示

javascript - 异步加载js文件和其他依赖的js文件