我正在使用限制textArea长度的函数。虽然功能表现不错,但我想问一下我是否以正确的方式调用功能?
这是
<h:inputTextarea id="questionInputTextArea"
value="#{faqAddUpdate.question}"
cols="50"
rows="3"
disabled="#{faqAddUpdate.buttonState}"
onkeypress="limitTextArea(this, 400)"
style="overflow: auto;">
<f:validateLength maximum="200" />
</h:inputTextarea>
这是函数
function limitTextArea(element, limit) {
var $textArea = $(element); //casting to jQuery so we can use jQuery functions on it
($textArea).keypress(function(event){
if (event.which < 0x20) {
// e.which < 0x20, then it's not a printable character
// e.which === 0 - Not a character
return; // Do nothing
}
if ($textArea.val().length == limit) {
event.preventDefault();
} else if ($textArea.val().length > limit) {
// Maximum exceeded
$textArea.val() = $textArea.val().substr(0, limit);
}
}); //end of keypress
} //end of function()
令我困惑的是这个,我在我的jsf代码中使用 onkeypress ,在函数中我也说($ textArea).keypress(function(event) 。如何优化此功能?或者我做得对吗?
由于
答案 0 :(得分:0)
每次按下某个键时,您都会附加一个新的按键事件侦听器。这毫无意义。您需要 直接在onkeypress
属性,或中指定它,以便在文档就绪后通过jQuery方式附加它。此外,对val()
函数的赋值没有意义,您需要将新值作为参数传递。这可能不可能“表现良好”。最后,我还建议使用keyup
而不是keypress
,以便仅在更新textarea的值后调用该函数,从而更加明智限制功能的行为。这样您也不需要检查不可打印的字符范围。
总而言之,它可能看起来像这样:
function limitTextArea(element, limit) {
var $textArea = $(element);
if ($textArea.val().length > limit) {
$textArea.val($textArea.val().substr(0, limit));
}
}
将被注册为
<h:inputTextarea ... onkeyup="limitTextArea(this, 400)" />
如果你真的需要通过jQuery keyup()
函数附加它,那么你必须自己在函数中指定限制。
E.g。
<h:inputTextarea ... styleClass="limit" />
与
$("textarea.limit").keyup(function() {
var $textarea = $(this);
var limit = 400;
if ($textarea.val().length > limit) {
$textarea.val($textarea.val().substr(0, limit));
}
});
(您在$(document).ready(function() {...})
或$(function() {...});
期间执行)
或者您可以将限制指定为类名的一部分并相应地提取它:
<h:inputTextarea ... styleClass="limit_400" />
有这样的东西
$("textarea[class*=limit_]").each(function(i, textarea) {
var classNames = textarea.className.split(' ');
var limit = 0;
for (var i = 0; i < classNames.length; i++) {
if (classNames[i].indexOf("limit_") == 0) {
limit = parseInt(classNames[i].split("_")[1]);
break;
}
}
if (limit) {
$(textarea).keyup(function() {
var $textarea = $(this);
if ($textarea.val().length > limit) {
$textarea.val($textarea.val().substr(0, limit));
}
});
}
});
顺便说一句,400
的限制与您在服务器端<f:validateLength>
验证程序中的限制不匹配。