我想创建 HTML 输入字段(单行或文本区域),当它们“已满”时停止接受新文本 - 即当小部件中没有更多空间可以显示新字符时。
这与对字符数设置最大长度限制不同,因为(例如)65 个小写字母“i”占用的空间比 65 个大写“W”在比例字体中占用的空间少得多。
有没有办法做到这一点?(如果有,理想情况下,该解决方案还可以涵盖粘贴文本的时间,并截断超出限制的所有文本)。
编辑:解决方案必须使用比例字体 - maxlength 在这里没有帮助,我们对停在字符长度不感兴趣。
我想创建 HTML 输入字段(单行或文本区域),当它们“已满”时停止接受新文本 - 即当小部件中没有更多空间可以显示新字符时。
这与对字符数设置最大长度限制不同,因为(例如)65 个小写字母“i”占用的空间比 65 个大写“W”在比例字体中占用的空间少得多。
有没有办法做到这一点?(如果有,理想情况下,该解决方案还可以涵盖粘贴文本的时间,并截断超出限制的所有文本)。
编辑:解决方案必须使用比例字体 - maxlength 在这里没有帮助,我们对停在字符长度不感兴趣。
以下使用来自https://stackoverflow.com/a/5047712/212869的答案来计算文本的宽度,并将其链接到文本框。它的代码非常粗糙:D,但它确实很好地限制了文本框。相同的原则可以用于文本区域,但您也必须对高度和宽度都这样做。
http://jsfiddle.net/LMKtd/1/ - 它输出东西到控制台,所以如果你看一下最好打开它。
String.prototype.width = function(font) {
var f = font || '12px arial',
o = $('<div>' + this + '</div>')
.css({'position': 'absolute', 'float': 'left', 'white-space': 'nowrap', 'visibility': 'hidden', 'font': f})
.appendTo($('body')),
w = o.width();
o.remove();
return w;
}
$('#textinput').on('keyup', validatetext);
function validatetext(e) {
var w = parseInt(e.target.value.width());
if (w > 100) {
console.log("Width Gt 100px ["+w+"px] Char Count ["+e.target.value.length+"]");
do {
e.target.value = e.target.value.slice(0,-1);
} while (parseInt(e.target.value.width()) > 100)
} else {
console.log("Keep going! ["+w+"px] Char Count ["+e.target.value.length+"]");
}
}
更新
我也为文本区域设置了一个。它不会阻止您超越限制,但它会告诉您何时它太宽或太高。这不是很漂亮:D
String.prototype.width = function(font) {
var f = font || '12px arial',
o = $('<div>' + this + '</div>')
.css({'position': 'absolute', 'float': 'left', 'white-space': 'nowrap', 'visibility': 'visible', 'font': f})
.appendTo($('body')),
w = o.width();
o.remove();
return w;
}
String.prototype.height = function(font) {
var f = font || '12px arial',
o = $('<div>' + this.replace(/[\r\n]/g,'<br />') + '</div>')
.css({'position': 'absolute', 'float': 'left', 'white-space': 'nowrap', 'visibility': 'hidden', 'font': f})
.appendTo($('body')),
w = o.height();
o.remove();
return w;
}
$('#textinput').on('keyup', validatetext);
$('#areainput').keyup(validatearea);
function validatearea(e) {
var w = parseInt($(this).val().width());
var h = parseInt($(this).val().height());
var errw = false;
var errh = false;
if (h>100) {
errh = true
}
var lines = $(this).val().split(/[\r\n]/);
var errw = false;
for (var i = 0; i<lines.length; i++) {
if (parseInt(lines[i].width()) > 100) {
errw = true;
}
}
if ((errh == true) || (errw == true)) {
if ((errh == true) && (errw == false)) {
$('#areaerror').html("Too Tall, Width OK");
}
if ((errh == false) && (errw == true)) {
$('#areaerror').html("Height OK, Too Wide");
}
if ((errh == true) && (errw == true)) {
$('#areaerror').html("Too Tall, Too Wide");
}
} else {
$('#areaerror').html("Were Good");
}
}
function validatetext(e) {
var w = parseInt(e.target.value.width());
if (w > 100) {
console.log("Width Gt 100px ["+w+"px] Char Count ["+e.target.value.length+"]");
do {
e.target.value = e.target.value.slice(0,-1);
} while (parseInt(e.target.value.width()) > 100)
} else {
console.log("Keep going! ["+w+"px] Char Count ["+e.target.value.length+"]");
}
}
您可以使用 maxlength 属性
<input type="text" id="Textbox" name="Textbox" maxlength="10" />