将input
标记用作type="tel"
时,触摸设备上的键盘与输入框的类型相对应。但是,我希望隐藏input
标记中的值(与password
类型一样)。
正常的行为是在用户输入时隐藏每个角色。
<input type="tel">
input [type="tel"] {
-webkit-text-security: disc;
}
此解决方案适用于大多数浏览器,但不适用于IE。
<input type="password" pattern="[0-9]*" inputmode="numeric">
此解决方案无法按预期工作。
有没有办法完成我想要做的事情?
答案 0 :(得分:16)
我知道这已经有来自 jdgregson 的一个很好的,有效且可接受的解决方案了,但我真的很喜欢 rybo111 的基于自定义字体的解决方案的想法我想尝试一下。
我们的想法是创建一个只包含圆圈的字体,这样当字体系列应用于输入元素时,似乎不会显示任何字符。
因此,如果有人对decent browser support的非JS解决方案感兴趣并且没有jdgregson的答案的已知问题,我为此创建了一个简单的字体。
GitHub repo :https://github.com/noppa/text-security
JSFiddle演示:https://jsfiddle.net/449Lamue/6/
可以通过从克隆的repo或RawGit或类似的东西中包含 dist / text-security.css 来使用该字体。包含css后,您可以通过将元素font-family
设置为'text-security-disc'
来使用该字体。
<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/noppa/text-security/master/dist/text-security.css">
<style>
input [type="tel"] {
font-family: "text-security-disc";
-webkit-text-security: disc;
}
</style>
本着&#34; polyfilling&#34; -webkit-text-security,我还添加了&#34; circle&#34;和&#34; square&#34;用作隐藏符号的选项。
我已经在Android 5.0上使用Chrome v49,IE11,Microsoft Edge 25和Chrome v50对其进行了测试,其中输入的类型为&#34; tel&#34;打开数字键盘。
答案 1 :(得分:8)
有几种方法可以实现这一目标:
最优雅的解决方案是使用内置的-webkit-text-security: circle;
CSS样式,用于此类。不幸的是,这不是便携式的,IE或Edge也不支持。如果您选择使用此方法,可以找到解决方法以获得对其他浏览器here的支持。
正如 Fidel90 和其他人指出的那样,您可以尝试在用户选择后将type="tel"
切换为type="password"
。我提出了这个想法的小提琴here。它在iOS中完美运行,但在Android中无法启动第一次点击,然后在第二次点击时作为默认键盘启动。
rybo111 在以下 noppa 实施的评论中提出的另一个想法是使用只有密码点字符的字体。这可能是最便携和最不具体的解决方案。一个缺点是用户无法看到他们刚输入的字符,这是现代移动密码字段的通常行为。这是一个全面的小提琴{@ 3}}。
我的想法(下面)是使用第二个输入来存储实数,然后在用户输入数字时隐藏数字。请注意,这将过滤掉最终号码中的所有非电话号码字符,但您可以修改变量以接受您想要的任何内容。
经过测试和处理:
var BACKSPACE_CHARS = [8, 46, 229];
function hideNumber(fakeInput, event) {
var hideChar = '*';
// add characters that you want to appear in the final number to this
// string -- leave the string empty to allow all characters
var phoneChars = '0123456789()-+';
var keyCode = event.keyCode || event.charCode;
var key = String.fromCharCode(keyCode)+'';
var realInput = document.getElementById("hidden-number");
var len = fakeInput.value.length;
fakeInput.value = '';
if(phoneChars.indexOf(key) > -1 || !phoneChars.length) {
realInput.value += key;
} else {
if(BACKSPACE_CHARS.indexOf(keyCode) < 0) {
--len;
}
}
for(var i=0; i<len; i++) { // no String.repeat() in IE :(
fakeInput.value += hideChar;
}
updateDisplay();
}
function backspace(event) {
var keyCode = event.keyCode || event.charCode;
var realInput = document.getElementById("hidden-number");
if(BACKSPACE_CHARS.indexOf(keyCode) > -1) { // backspace or delete
var len = realInput.value.length;
realInput.value = realInput.value.slice(0, len-1);
}
updateDisplay();
}
function updateDisplay() {
var realInput = document.getElementById("hidden-number");
var display = document.getElementById("display");
display.innerHTML = realInput.value || '';
}
&#13;
<input type="tel" name="number" id="number-hider" onkeypress="hideNumber(this, event)" onkeydown="backspace(event)" onblur="hideNumber(this)">
<input type="hidden" name="realnumber" id="hidden-number">
<div id="display"></div>
&#13;
已知错误:
答案 2 :(得分:1)
我创建了一个fiddle,只要您关注它(需要jQuery),就会用tel
输入替换最初的password
:
var value = "",
isPWD = false;
$('#wrap')
.on("focus", "#input", function() {
if (!isPWD) {
var pass = $('<input id="input" type="password">');
$(this).replaceWith(pass);
isPWD = true;
pass.focus();
}
})
.on("change", "#input", function() {
value = $(this).val();
$("#span").text(" = " + value);
})
.on("blur", "#input", function() {
var tel = $('<input id="input" type="tel">');
$(this).replaceWith(tel);
isPWD = false;
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="wrap">
<input id="input" type="tel"/>
<span id="span"></span>
</div>
&#13;
到目前为止,我没有在移动设备上对此进行测试,因此我不确定是否将数字键盘带到用户手中。
编辑:至少我的移动IE没有显示数字键盘,只显示标准文本字段。
答案 3 :(得分:1)
使用noppa's answer及其GitHub字体和jdgregson's answer,这是一个交钥匙CSS解决方案(fiddle):
@font-face {
font-family: "password-mask";
src: url(data:font/woff;charset:utf-8;base64,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) format("woff");
}
.numeric-password {
font-family: password-mask;
}
.numeric-password::placeholder {
font-family: initial;
}
<input type="tel" class="numeric-password" placeholder="test" />
要支持较旧的iOS和Android设备,您只需要在ttf文件中添加另一个数据URI字体定义,以用作密码掩码字体。对于带有eot字体文件的IE来说也是相同的,但是大多数现代浏览器都支持woff并应与此CSS一起使用。