Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.12.2014, 18:49
Аспирант
Отправить личное сообщение для paveltkachev Посмотреть профиль Найти все сообщения от paveltkachev
 
Регистрация: 09.04.2014
Сообщений: 74

Максимальное число символов для ввода
Как заблокировать ввод при достижении максимального допустимого числа символов?

В input я бы просто написал maxlength="значение", но я использую div со свойством contenteditable="true".
Ответить с цитированием
  #2 (permalink)  
Старый 24.12.2014, 19:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

paveltkachev,
Визуальное ограничение ввода текста
Ответить с цитированием
  #3 (permalink)  
Старый 24.12.2014, 20:40
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Проверил в хроме и ff, работает вот такая фигня (кроссбраузерно можно использовать onkeyup вместо oninput)
<html>
<head>
</head>
<body>
<script>

d=document.createElement("div")
d.contentEditable=true
d.innerHTML="1"
document.body.appendChild(d)
d.oninput=function(){
   if(this.innerHTML.length>3) this.contentEditable=false
}


</script>
</body>
</html>

Последний раз редактировалось krutoy, 24.12.2014 в 22:08.
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2014, 01:02
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

для одной строки в хроме
<div contenteditable="true">write here</div>
<script>
document.querySelector("div").addEventListener("input", function () {
	var sel = window.getSelection(),
		range = sel.getRangeAt(0),
		pos = range.endOffset;
	
	this.innerHTML = this.innerHTML.substr(0, 10);
	
	try {
		range.setStart(range.startContainer , pos);
	} catch (e) {
		range.setStart(range.startContainer , pos - 1);
	}
	sel.removeAllRanges()
	sel.addRange(range);
});
</script>
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2014, 10:10
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

http://learn.javascript.ru/play/nj2d2b



С range никогда не работал, поэтому взял кусок кода у bes`а.

<!DOCTYPE HTML>
<html>
  <head>
    
    <title>Test</title>
    
    <style type="text/css">
      div[contenteditable] {
        border: 1px solid #AAA;
        color: #AAA;
        height: 20px;
        line-height: 20px;
        margin: 5px 0;
        overflow: hidden;
        text-indent: 3px;
        white-space: nowrap;
        width: 200px;
      }
    </style>
    
    <script type="text/javascript">
      window.addEventListener('DOMContentLoaded', function() {
        var divs = document.querySelectorAll('div[contenteditable]');
        [].forEach.call(divs, function(self) {
          var maxLength = self.dataset.max;
          if(maxLength) {
            self.addEventListener('input', function(e) {
              if(this.innerHTML.length > maxLength) {
                var selection = window.getSelection(),
                    range = selection.getRangeAt(0),
                    pos = range.endOffset;
                this.innerHTML = this.innerHTML.substr(0, maxLength);
                try {
                	range.setStart(range.startContainer , pos);
				} catch (e) {
        			range.setStart(range.startContainer , pos - 1);
                }
                selection.removeAllRanges();
                selection.addRange(range);
              }
            }, false);
          }
        });
      });
    </script>
    
  </head>
  
  <body>
    
    <div contenteditable="true" data-max="20"></div>
    <div contenteditable="true" data-max="30"></div>

  </body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 25.12.2014, 10:40
Аспирант
Отправить личное сообщение для paveltkachev Посмотреть профиль Найти все сообщения от paveltkachev
 
Регистрация: 09.04.2014
Сообщений: 74

Всем спасибо за помощь!
Ответить с цитированием
  #7 (permalink)  
Старый 25.12.2014, 21:48
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от bes
для одной строки в хроме
Сообщение от paveltkachev
Всем спасибо за помощь!
а я думал, что будут вопросы, почему в моём примере try-catch не отрабатывет в ff и как сделать, чтобы не только для одной строки
Ответить с цитированием
  #8 (permalink)  
Старый 26.12.2014, 12:06
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

bes, влом гуглить, просвети зачем тут вообще try/catch?
Ответить с цитированием
  #9 (permalink)  
Старый 26.12.2014, 17:51
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Ruslan_xDD Посмотреть сообщение
bes, влом гуглить, просвети зачем тут вообще try/catch?
при вводе символа курсор оказывается в позиции "текущая позиция до ввода символа + 1", она и будет в pos, поэтому, когда курсор будет в позиции 10, попытка установить курсор в позицию 11 бросит исключение
в ff (ff34) не работает установка курсора через setStart, либо я что-то неправильно делаю
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение символов для ввода kotofeich Элементы интерфейса 9 04.06.2010 17:01
Переход между окнами ввода при заполнении. Бушка Общие вопросы Javascript 4 25.03.2009 15:40
Форма для ввода текста с расширенными функциями 0x22b Элементы интерфейса 0 01.09.2008 10:38
трабл с перехватом некоторых символов в поле ввода barbiturat Events/DOM/Window 5 28.08.2008 14:32