【问题标题】:Switching between type=password/type=number and prompting for a numeric keypad on a tablet在 type=password/type=number 和平板电脑上提示输入数字键盘之间切换
【发布时间】:2012-02-23 14:52:22
【问题描述】:

我有一个在 Android 平板电脑上运行的 HTML5 应用程序,其中有几个使用 type=number 的输入字段。当这些字段获得焦点时,数字键盘会按预期弹出。

其中一个字段是收集客户的社会安全号码。我们的要求是,该字段必须在聚焦时显示完整的 SSN,在模糊时显示点。我已经用两个 SSN 字段实现了这一点。一种是输入类型=密码,一种是输入类型=数字,默认隐藏。

<input type="password" name="SSN_Pass" id="SSN_Pass" value="" placeholder="SSN" />
<input type="number" name="SSN" id="SSN" value="" maxlength="9" class="required number" />

我有 jQuery,它在获得焦点时隐藏密码字段并显示数字字段。模糊数字字段会将值复制回密码字段。

$("#SSN_Pass").focus(function()
{
    $(this).hide();
    $("#SSN").show().focus();
});

$("#SSN").blur(function ()
{
    $(this).hide();
    $("#SSN_Pass").show().val($(this).val());
});

我遇到的问题是,当第一次在密码字段上获得焦点时,Android 浏览器中会弹出完整的字母数字键盘,无论是单击输入字段还是切换到它。用户必须单击现在可见的数字字段才能弹出数字键盘。即使我在 SSN 可见数字字段上调用 ​​focus(),完整的字母数字键盘仍然存在。

我想通过某种方式告诉浏览器切换到数字键盘。我已经尝试了一些方法,例如使用短暂的 setTimeout 延迟重新强制焦点以及在现场没有运气的 trigger('focus')。

这不是问题的关键,但最好只有数字键盘,因为它会加快数据输入速度。

建议?

【问题讨论】:

    标签: jquery html


    【解决方案1】:

    在我看来,避免这种情况的最简单方法是完全避免使用密码字段。我想我可能会链接或span(使用tabindex)或一些样式看起来像一个字段并用*s 或其他内容填充它,然后链接变为活动状态,然后用数字替换它场地。希望由于链接不会触发键盘,将其替换为数字字段并聚焦该字段将打开数字键盘。

    更新:不,那不参与浏览器键盘中的“下一个”和“上一个”按钮(至少在我的 iPhone 上没有)。所以我的备用方案是:

    • 总是有场地,但要做得非常非常小。
    • 在其旁边显示*s。
    • 当用户进入该字段时,用真实的 SSN 填充并展开它,隐藏显示元素。
    • 当用户离开该字段时,将其清除,再次变小,然后更新显示元素。
    • 当您需要提交表单时,请在提交前立即填写隐藏字段或类似字段。

    这是一个完全没有样式的示例,可以在我的 iPhone 上按需要运行:

    Live copy | Live source

    HTML(其他字段仅用于上下文):

    <input type="text" id="someTextField" value="Just some field" style="width: 20em">
    <br><span id="fakeSSN">***-**-****</span><input type="number" id="realSSN" style="width:1px">
    <br><input type="text" value="Some other field" style="width: 20em">
    

    JavaScript:

    jQuery(function($) {
      var ssn = "";
    
      $("#realSSN")
        .focus(function() {
          $("#fakeSSN").hide();
          $(this).css("width", "20em").val(ssn);
        })
        .blur(function() {
          var $this = $(this);
          ssn = $this.val();
          $this.val("").css("width", "1px");
          $("#fakeSSN").show();
        });
    
      function display(msg) {
        $("<p>").html(msg).appendTo(document.body);
      }
    });
    

    【讨论】:

    • 效果很好!我只是将 jQuery 切换了一点代码,以根据焦点或模糊删除/添加一个“ssnHidden”类。我为“fakeSSN”跨度连接了一个点击处理程序,它将焦点设置到“realSSN”字段。如果我没有关注任何输入字段(没有显示键盘)并且我点击“fakeSSN”字段,它会拉起字母数字键盘。如果我专注于其他领域,例如姓名或电子邮件地址,然后单击“fakeSSN”或通过标签转到“realSSN”,效果很好。这是带有 Android 3.2 BTW 的 Galaxy Tab 10.1。
    • @PeteNelson:太好了!很高兴有帮助。
    • 我可以忍受。大多数时候,用户将在字段中切换。这是一个 hack,但它是一个很好的 hack。 :) 感谢 TJ 的解决方案!
    【解决方案2】:

    直接设置属性:$(el).attr('type', 'number')

    【讨论】:

    • jQuery 抛出“无法更改未捕获的类型属性”错误。使用 DOM “document.getElementById('SSN_Pass').setAttribute('type', 'number');”改变它仍然显示字母数字键盘。
    • 是的,有些浏览器不允许你改变type(我在看着你,微软),而另一些浏览器对于你这样做时会发生什么并不一致,所以 jQuery 不允许这样做你不会误认为它会起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多