Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет количества введенных в форму знаков при наличии двух textarea
 
 автор: Владимир55   (30.10.2013 в 02:06)   письмо автору
 
 

Для подсчета количества введенных в форму знаков используется приведенный ниже код. Здесь админ видит количество введенных знаков, а когда до максимального значения остается десять, то меняется цвет сообщеия на красный (см. http://wowa55.pz9.ru/5.php).

В принципе, все работает нормально.

Однако, есть две проблемы.
1. Как организовать ввод при наличии двух и более textarea ( что бы показывать оператору количество оставшихся знаков отдельно по каждому из них )?
2. Как сделать цвет предупреждающего сообщения по умолчанию зеленым (сохранив красный цвет, когда до предела осталось десять и менее знаков)?


<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Панель настройки</title>

    <!-- jQuery -->
    <script type="text/javascript" src="js/jquery.js"></script>


<STYLE type=text/css>
.warning {
    color: red;
}

#textareaFeedback {
    text-align: center;
}

</STYLE>



<SCRIPT>
$(function()
 {
     var maxLength = $('#textarea').attr('maxlength');
     $('#textarea').keyup(function()
     {
         var curLength = $('#textarea').val().length;
         $(this).val($(this).val().substr(0, maxLength));
         var remaning = maxLength - curLength;
         if (remaning < 0) remaning = 0;
         $('#textareaFeedback').html(remaning + ' осталось символов');
         if (remaning < 10) // когда менять цвет
         {
             $('#textareaFeedback').addClass('warning')
         }
         else
         {
             $('#textareaFeedback').removeClass('warning')
         }
     })
 })
</SCRIPT>



</head>

<body bgcolor="#FFFFFF">

<form method="POST" >
<P><TEXTAREA id=textarea rows=5 cols=25 maxlength="25"></TEXTAREA>

<DIV id=textareaFeedback></DIV><P></P>
<input type="submit" value="Далее" name="B2">
</form>

  Ответить  
 
 автор: confirm   (30.10.2013 в 09:39)   письмо автору
 
   для: Владимир55   (30.10.2013 в 02:06)
 

Так #textarea лучше не поступать, не обязательно, но вполне возможна ситуация, когда возникнет ошибка, в которой придется потом разбираться. Textarea - это уже объект, и этого достаточно чтобы перехватывать его события и обрабатывать их. В обработчике тем более нет нужды использовать id объекта, чтобы обратиться к нему, в jOuery в обработчике события уже готова ссылка на объект источник - this.
А задать значение по умолчанию и сохранять текущее состояние объекта можно в его объекте .data().


<script>
$(function() {
    $('textarea').keyup(function() {
        //проверяем были ли нажатия у этого объекта, и если да, то извлекает их число
        var set = !$(tis).isEmptyObject('len') ? $(tis).isEmptyObject('len') : 0,
               max = this.maxlength, //максимально возможная длина
               len = this.value.length; //текущая длина
        //производим операции необходимые и сохраняем текущее состояние
        $(tis).data('len', len);
        //хотя проверку достигнуто ли максимальное значение лучше проверять в момент нажатия 
    }).keypress(function() {
        //здесь лучше проверять достижение максимального значения, и выход если достигнуто
        //с отображением этого значение, а в обработчике keyup заносить новое значение    
    });     
});
</script>

  Ответить  
 
 автор: Владимир55   (30.10.2013 в 11:20)   письмо автору
 
   для: confirm   (30.10.2013 в 09:39)
 

Более корректная функция - это хорошо. Но вопросы, породившие тему, остались нераскрытыми...

  Ответить  
 
 автор: Deed   (30.10.2013 в 14:02)   письмо автору
 
   для: Владимир55   (30.10.2013 в 11:20)
 

Да нормально confirm объяснил. Правда, как всегда, оставил пищу для ума - фирменную недосказанность.
Если никто не объяснит "на пальцах", приду с работы - наваяю примерный код.

  Ответить  
 
 автор: confirm   (30.10.2013 в 15:22)   письмо автору
 
   для: Владимир55   (30.10.2013 в 11:20)
 

1. Как организовать ввод при наличии двух и более textarea ( что бы показывать оператору количество оставшихся знаков отдельно по каждому из них )?

Я ответил на этот вопрос:
Как организовать ввод при наличии двух и более textarea - назначать обработчик событий не по ID, а по тегу элемента
что бы показывать оператору количество оставшихся знаков отдельно по каждому из них - хранить текущую длину в объекте .data() у textarea

2. Как сделать цвет предупреждающего сообщения по умолчанию зеленым (сохранив красный цвет, когда до предела осталось десять и менее знаков)?

И об этом говорил - хранить все текущие состояния объекта в .data(), то есть записываете в этот объект и длину значения и цвет - data({len:200, cls:65280}) - где свойство len, это длина значения, а cls, это десятичное значение цвета. Значение цвета по умолчанию (зеленый = 65280 = 0xFF00) и длину значения равную 0 можно записать при загрузке страницы в объекты data() всех textarea, и затем работать с этими объектами, без проверки установки их у объектов (isEmptyObject()).
По событию keypress проверяете не достигнуто ли максимальное значение, если да, то инвертируете цвет в красный cls ^= 16776960, и записываете это значение свойству cls. Преобразовываете инвертированное значение cls в RGB составляющие:

function toRGB(v) {
    return 'rgb('+(parseInt(v/65536)%256)+','+(parseInt(v/256)%256)+','+(v%256)+')'; 
}


и полученное значение указываете css свойству textarea:

$(this).css({borderColor:toRGB(cls)})


В событие keyup проверяете и инвертируете это значение опять на зеленый цвет cls ^= 16776960, получаете RGB значение и применяете css свойству. Вот и весь механизм, так как событие keyup не позволит ничего делать, если проверку производить в keypress, и значит все будут работать как триггер.

Что еще объяснять?

  Ответить  
 
 автор: Deed   (30.10.2013 в 18:26)   письмо автору
 
   для: Владимир55   (30.10.2013 в 11:20)
 

http://jsbin.com/AkopOyo/1/edit?js,output

  Ответить  
 
 автор: Владимир55   (30.10.2013 в 20:32)   письмо автору
 
   для: Deed   (30.10.2013 в 18:26)
 

Deed, СУПЕР!

Работает превосходно!

Причем, даже в том случае, если три поля находятся в одной форме form!

(Остается только удивляться, как строка сообщений понимает, на какое окно ей реагировать...).

Спасибо!


<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<meta charset=utf-8 />
<title>JS Bin</title>
<SCRIPT>
function checklength(t){
  var ml = $(t).attr('maxlength');
  var diff = ml - $(t).val().length;
  var ad = $(t).nextAll('div:first');
  if (diff==ml){
    ad.html('&nbsp;').css('color','green');
  }
  else if(diff>10){
    ad.text('Осталось знаков: '+diff).css('color','green');
  }
  else{
    ad.text('Осталось знаков: '+diff+'!').css('color','red');
  }
}
</SCRIPT>
</head>
<body>
  <form method="post">
    <textarea rows="5" cols="25" maxlength="25" onkeyup="checklength(this);"></textarea>
    <br><div class="textareaFeedback">&nbsp;</div>
    <!-- &nbsp; - для того, чтобы содержимое страницы "не прыгало" при появлении текста в div -->

  <br><br>

    <textarea rows="5" cols="25" maxlength="30" onkeyup="checklength(this);"></textarea>
    <br><div class="textareaFeedback">&nbsp;</div>

  <br><br>

    <textarea rows="5" cols="25" maxlength="20" onkeyup="checklength(this);"></textarea>
    <br><div class="textareaFeedback">&nbsp;</div>
    <input type="submit" value="Далее" >
  </form>
</body>
</html>

  Ответить  
 
 автор: Deed   (30.10.2013 в 20:41)   письмо автору
 
   для: Владимир55   (30.10.2013 в 20:32)
 

А что там удивляться?
var ad = $(t).nextAll('div:first'); 

То есть, из всех, следующих за данной "текстареей" элементов, выбрать первый div.

  Ответить  
 
 автор: Владимир55   (30.10.2013 в 22:03)   письмо автору
 
   для: Deed   (30.10.2013 в 20:41)
 

Понятно.

Ещё раз спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования