Ограничение ввода с помощью блока submit
Запрос по тому что мне нужно получается довольно длинный потому и поиск наверное не дал желаемых результатов. Если ответ на мой вопрос уже имеется, покорно прошу дать на него ссылочку...
Дело вот в чем: есть значит поле <textarea> в котором мне нужно ограничить количество вводимых символов. Стандартные варианты по типу:
<script language="javascript" type="text/javascript">
<!--
function imposeMaxLength(Object, MaxLen)
{
return (Object.value.length <= MaxLen);
}
-->
</script>
Implementation:
<textarea name="myName" onkeypress="return imposeMaxLength(this, 15);" ><textarea>
не годятся потому как от копипаста не спасают. Необходимо что бы кнопка Submit принимала значение disable или как-то по-дургому может быть можно ограничить ее функциональность, а также меняла стили в том случае если в форме окажется больше 215 символов. (если будет больше - поедет верстка блоков куда выводятся потом сообщения) Также очень хотелось бы что бы рамка <textarea> становилась красной. Такой функционал реализован на сайте http://mamba.ru/ там где добавляются комплименты. Спасибо за внимание. Жду помощи.. |
Цитата:
Цитата:
Цитата:
textarea {
border: 1px solid red;
}
|
Цитата:
"keydown", "keyup", "cut", "paste", "input", "change" и копипаст в Ваших руках |
Вот примерчик набросал:
<html>
<head>
<style type="text/css">
.border-black {border: 1px solid black}
.border-red {border: 1px solid red}
</style>
<script type="text/javascript"><!--
var maxLen = 0;
function checkLength (object, len)
{
object.className = ( object.value.length > len ) ? "border-red" : "border-black";
}
function setMaxLength (object, len)
{
maxLen = len;
with ( object )
{
maxLength = maxLen;
onkeyup = function (event) {checkLength (this, maxLen)};
onkeydown = function (event) {checkLength (this, maxLen)};
onchange = function () {checkLength (this, maxLen)};
className = "border-black";
}
}
function validate (form)
{
if ( form.text.value.length > maxLen )
{
alert ("Длинна текста больше допустимой");
form.text.focus();
return false;
}
return true;
}
//--></script>
</head>
<body onload="setMaxLength (document.getElementById ('text'), 10)">
<form onsubmit="return validate (this)">
<textarea cols="60" rows="12" id="text" name="text"></textarea><br>
<input type="submit" value=" Отправить ">
</form>
</body>
</html>
|
Цитата:
|
Но отправка все равно будет заблокирована.
А вот всякие события, типа cut, paste, наступают до вырезания или вставки, т.е. их использовать не получится. Вообще, странно, что change не хочет оперативно срабатывать, а только на потерю фокуса. Короче, тогда такой вариант решения:
<html>
<head>
<style type="text/css">
.border-black {border: 1px solid black}
.border-red {border: 1px solid red}
</style>
<script type="text/javascript"><!--
function checkLength (id, maxLen)
{
var object = document.getElementById (id);
object.className = ( object.value.length > maxLen ) ? "border-red" : "border-black";
}
function setMaxLength (id, maxLen)
{
var object = document.getElementById (id);
with ( object )
{
maxLength = maxLen;
className = "border-black";
}
eval ("setInterval (function() {checkLength ('" + id + "', " + maxLen + ")}, 10)");
}
function validate (form)
{
if ( form.text.value.length > maxLen )
{
alert ("Длинна текста больше допустимой");
form.text.focus();
return false;
}
return true;
}
//--></script>
</head>
<body onload="setMaxLength ('text', 10)">
<form onsubmit="return validate (this)">
<textarea cols="60" rows="12" id="text" name="text"></textarea><br>
<input type="submit" value=" Отправить ">
</form>
</body>
</html>
|
Цитата:
Цитата:
странно другое: почему разработчики браузеров не сделали ещё одно событие, которое было бы типа onchange2, но срабатывало по каждому "чиху" - тогда у программиста была возможность выбора. Цитата:
|
По порядку:
1. Событие срабатывает, когда пользователь выбрал пункт меню "Вставить", но самой вставки еще не произошло. 2. В таком случае можно с тем же успехом использовать событие потери фокуса. А вот для задачи из этого топика как раз и подошел бы нормальный change. Ну да не важно, т.к. его нет и не будет. 3. Перестал в IE курсор мигать. Ну и фиг с ним :) Зато задача решена. Или вы готовы предложить решение получше? А то пока что только критика. |
Цитата:
Цитата:
addHandler(o, 'keydown', SetHandChangedK); addHandler(o, 'keyup', SetHandChangedK); addHandler(o, 'cut', SetHandChangedM); addHandler(o, 'paste', SetHandChangedM); addHandler(o, 'input', SetHandChangedM); где addHandler - кроссбраузерный навешиватель обработчиков, а другие функции (K/M) - это обработчики клавиатуры и мыши. |
События cut и paste, как я и писал, можно не задавать, они тут совершенно бесполезны.
А вот input как раз и срабатывает на изменение текста в любом случае, т.е. то, что нужно. Но вот он в IE не работает. Так что ваш вариант не работает в IE. |
| Часовой пояс GMT +3, время: 04:23. |