Jquery Установить максимальные символы для содержимого редактируемого элемента [дубликат]

31
задан Bill Dami 19 May 2010 в 17:28
поделиться

10 ответов

Следующее решение также рассматривает ключи управления (которые соответствуют непечатаемым символам).

//Maximum number of characters
var max = 200;

$('#editable_div').keydown(function(e) {
    var keycode = e.keyCode;

    //List of keycodes of printable characters from:
    //http://stackoverflow.com/questions/12467240/determine-if-javascript-e-keycode-is-a-printable-non-control-character
    var printable = 
        (keycode > 47 && keycode < 58)   || // number keys
        keycode == 32 || keycode == 13   || // spacebar & return key(s) (if you want to allow carriage returns)
        (keycode > 64 && keycode < 91)   || // letter keys
        (keycode > 95 && keycode < 112)  || // numpad keys
        (keycode > 185 && keycode < 193) || // ;=,-./` (in order)
        (keycode > 218 && keycode < 223);   // [\]' (in order)

    if (printable) {
        //Based on the Bala Velayutham's answer
        return $(this).text().length <= max; 
    }
});
42
ответ дан Vito Gentile 17 August 2018 в 09:04
поделиться
  • 1
    Работает как шарм! :-) Я также добавил условные обозначения для клавиш со стрелками и backspace / delete, кроме того, что он отлично работает. – Bill Dami 19 May 2010 в 17:52
  • 2
    Вставка через контекстное меню или меню редактирования все равно может привести к превышению пользователем. – Tim Down 19 May 2010 в 17:52
  • 3
    @Tim Down - очень верно. Неизбежно (насколько мне известно), если используется contentEditable div, поскольку нет события change. Мое решение было специфическим для вопроса. Твой очень точно покрывает общий недостаток представленного подхода. – user113716 19 May 2010 в 18:05
  • 4
    Прослушивание события input позволит вам перехватывать изменения клавиатуры, вставки и перетаскивания. – josh3736 29 October 2015 в 23:40
  • 5
    Эти ключи также должны быть разрешены: var allowedKeys = {8: true, // BACKSPACE 35: true, // END 36: true, // HOME 37: true, // LEFT 38: true, // UP 39: true , // RIGHT 40: true, // DOWN 46: true // DEL} – formixian 7 April 2016 в 13:51
42
ответ дан Vito Gentile 6 September 2018 в 06:47
поделиться

Если вы хотите, чтобы он работал с классами. Другими словами, элемент мог бы совместно использовать имена классов и иметь свой собственный уникальный счет:

var content_id = '.myclass';  

max = 1;
//binding keyup/down events on the contenteditable div
$(content_id).keyup(function(e){ check_charcount(this, max, e); });
$(content_id).keydown(function(e){ check_charcount(this, max, e); });

function check_charcount(elem, max, e){   
    if(e.which != 8 && $(elem).text().length >= max){       
        e.preventDefault();
    }
}
0
ответ дан Al Serize 17 August 2018 в 09:04
поделиться

Простой способ достичь этого:

<div onkeypress="return (this.innerText.length <= 256)" contenteditable="true">
19
ответ дан Bala Velayutham 17 August 2018 в 09:04
поделиться
  • 1
    Самурай, содержимое можно удалить. & Quot; Забой & Quot; кнопка не будет считаться нажатием клавиши. – Bala Velayutham 25 September 2013 в 16:26
  • 2
    Я смутил keypress с keydown. В случае нажатия клавиши это не будет препятствовать пользователю вставлять текст в нем, который превышает максимальную длину, но ключ возврата и удаления действительно «безопасен». – Sumurai8 25 September 2013 в 18:09
  • 3
    проще, чем другие ответы. – Sam Adamsh 5 August 2014 в 11:05
  • 4
    К сожалению, не работает для ctrl-v – DarkSun 17 February 2016 в 08:51
  • 5
    TypeError: this.innerText не определено, когда & lt;! DOCTYPE html & gt; в FF43 :-( – lubosdz 25 March 2016 в 13:12
var onKeyPress = function () {
    var keyCode = window.event.keyCode,
        isNumeric = (keyCode > 47 && keyCode < 58),
        isNotEnterKey = !!(window.event.keyCode !== 13);

        (isNotEnterKey) || (this.blur());

        return (isNumeric && this.innerText.length < 3);
};
0
ответ дан shawndumas 17 August 2018 в 09:04
поделиться

Во-первых, это раздражает пользователя: я бы предложил вместо этого сделать что-то похожее на поле комментариев StackOverflow, которое позволяет вам вводить столько или меньше, как вам нравится, показывает вам сообщение о том, сколько символов вы 'typed и слишком ли много или слишком мало, и отказывается предоставить вам комментарий, длина которого недействительна.

Во-вторых, если вам действительно нужно ограничить длину текста, заменив весь контент из <div> при каждом нажатии клавиши, если содержимое слишком длинное, излишне дорогостоящее и сделает редактор невосприимчивым к более медленным машинам. Я предлагаю обработать событие keypress и просто запретить вставку символа с помощью preventDefault() в событии (или в IE, установив [returnValue] в true, если вы используете attachEvent). Это не помешает пользователю вставлять текст, поэтому вам нужно будет обработать событие paste (которого нет в Opera или Firefox & lt; 3, так что вам потребуется какое-то решение на основе опроса для тех). Поскольку вы не сможете получить доступ к предварительно вставленному контенту, у вас не будет никакого способа узнать, приведет ли паста к личным ограничениям, поэтому вам нужно будет установить таймер, чтобы снова проверить длину после пасты. Все, что имеет место, первый вариант кажется мне предпочтительным.

12
ответ дан Tim Down 17 August 2018 в 09:04
поделиться
  • 1
    Очень хорошие моменты, Тим, я полностью забыл принять меры по вставке учетной записи или любой способ получить текст в редакторе, который не будет генерировать событие нажатия клавиши. И да, я никогда не был в восторге от решения об замене всего контента, это был просто быстрый первоначальный удар по проблеме. Поэтому, глядя на это сейчас, мне просто нужно пойти с решением разрешить неограниченное количество символов, но предупредить пользователя о том, когда они закончились, и не разрешить сохранение содержимого. – Bill Dami 19 May 2010 в 18:44
  • 2
    это ответ – MorganTiley 22 May 2012 в 15:59
  • 3
    Событие input может обрабатывать случай paste. – Lewis 18 August 2015 в 17:41
  • 4
    @Tresdin: Действительно, событие input (которое не очень хорошо поддерживалось в 2010 году) определенно упрощает задачу, хотя я бы предпочел избежать обрезания содержимого текстовой области. – Tim Down 18 August 2015 в 22:20
  • 5
    input не поддерживается для контента в любой версии IE, поэтому вы даже не можете полагаться на это. @TimDown указывает на проблемы со вставкой, которые не охвачены никакими другими решениями в этом сообщении. Кроме того, есть действия со вызовами document.execCommand(), которые также будут вставлять контент таким образом, чтобы вы не могли обнаружить и предотвратить и могли бы удалять реактивно (insertText, insertHTML, paste, insertOrderedList, insertUnorderedList и т. Д. - все команды, которые вставляют текст в редактор). Больше причин идти с решением №1, которое @TimDown предлагает – Nate Mielnik 11 February 2017 в 04:00

Так я сделал это с помощью привязки jQuery, что упростило мне, просто добавив длину данных свойства-данных в элемент редактирования контента. Просто добавьте код javascript в любом месте документа.

$(document).ready(function(){
	// Excempt keys(arrows, del, backspace, home, end);
	var excempt = [37,38,39,40,46,8,36,35];
	// Loop through every editiable thing
	$("[contenteditable='true']").each(function(index,elem) {
	    var $elem = $(elem);
	    // Check for a property called data-input-length="value" (<div contenteditiable="true" data-input-length="100">)
	    var length = $elem.data('input-length');
	    // Validation of value
	    if(!isNaN(length)) {
	    	// Register keydown handler
	        $elem.on('keydown',function(evt){
	        	// If the key isn't excempt AND the text is longer than length stop the action.
	            if(excempt.indexOf(evt.which) === -1 && $elem.text().length > length) {
	               evt.preventDefault();
	               return false;
	            }
	        });
	    }
	});
});
div {
  background-color:#eee;
  border: 1px solid black;
  margin:5px;
  width:300px;
  height:100px;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div contenteditable="true" data-input-length="100">
You can type a 100 characters here
</div>
<div contenteditable="true" data-input-length="150">
You can type a 150 characters here
</div>
<div contenteditable="true" data-input-length="10">
You can type a 10 characters here
</div>

3
ответ дан Tschallacka 17 August 2018 в 09:04
поделиться
  • 1
    Это не сработает, если вы вставляете текст. – zihaow 19 June 2017 в 13:35

Это лучший способ сделать эту самую обобщающую форму и просто отлично работать для меня!

<div contenteditable="true" name="choice1" class="textfield" max="255"></div>
    $('.textfield').on("keypress paste", function (e) {
        if (this.innerHTML.length >= this.getAttribute("max")) {
            e.preventDefault();
            return false;
        }
    });
2
ответ дан VizardCrawler 17 August 2018 в 09:04
поделиться

Более обобщенная ревизия ответа @ user113716, которая не работает для нескольких допустимых для контента полей (она подсчитывает общее количество символов для всех элементов, соответствующих данному id, поэтому вы можете вводить только максимальные символы total на странице).

Это решение позволяет вам использовать общий класс и независимо ограничивать количество символов в каждом разрешающем контент поле.

html:

<div contenteditable="true" name="choice1" class="textfield"></div>

И JavaScript:

MAX_TEXTINPUT = 10;
TEXTFIELD_CLASS = "textfield"

$(document).ready(function() {

    //binding keyup/down events on the contenteditable div
    $('.'+TEXTFIELD_CLASS).keydown(function(e){ check_charcount(TEXTFIELD_CLASS, MAX_TEXTINPUT, e); });

})

function check_charcount(inputclass, max, e) {   
    var focused = $(document.activeElement)

    if(focused.hasClass(inputclass) && e.which != 8 && $(focused).text().length >= max)
    {
        e.preventDefault();
    }
}
0
ответ дан Wes Modes 17 August 2018 в 09:04
поделиться
$("[contenteditable=true]").keydown(function(e) {
    var max = $(this).attr("maxlength");
    if (e.which != 8 && $(this).text().length > max) {
        e.preventDefault();
    }
});
1
ответ дан Yuval Perelman 17 August 2018 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: