CLEditor - потерять фокус при достижении максимальной длины

Я пытаюсь воссоздать функцию maxlength для CLEditor. Цель состоит в следующем: если текст вводится в текстовое поле и его длина превышает заданную максимальную длину, текстовое поле должно потерять фокус, чтобы было невозможно писать какие-либо дополнительные буквы.

До сих пор я достиг того, что CLEditor распознает, когда текст становится длиннее, чем моя максимальная длина. Для потери фокуса я попробовал простой метод return (т.е. return; return false;) и некоторые методы.blur() (то есть $(frameDesc).blur(); и cledDesc.$ Area.blur();). Но они не работают. Я все еще могу заполнить текст, даже если максимальная длина достигнута.

Пожалуйста, посмотрите на код:

$("#profileForm_description").cleditor({width: 430, height: 125});

var cledDesc = $("#profileForm_description").cleditor()[0];
var frameDesc =  cledDesc.$frame[0].contentWindow.document;

$(frameDesc).bind('keypress change', function(){

   var text = textWithoutHTML(cledDesc.$area.val());

   if(text.length >= 650){
      console.log("Longer than MaxLength");
      //lose focus

   }else{
      //Do something
   }
});

Любая помощь и советы будут оценены:)

2 ответа

Решил этот. Это было довольно сложно. Решение (для меня):

Использование keydown вместо нажатия клавиши - событие.

Так что, если я пытаюсь вставить какой-то текст в текстовое поле и достигается максимальная длина, я не могу продолжать писать. Но чтобы иметь возможность удалить какой-то текст, мне нужно, кроме того, чтобы клавиша Backspace не была отклонена. Поэтому я проверил, является ли нажатая клавиша клавишей возврата.

Вот как выглядит код сейчас:

$("#profileForm_description").cleditor({width: 430, height: 125});

var cledDesc = $("#profileForm_description").cleditor()[0];
var frameDesc =  cledDesc.$frame[0].contentWindow.document;

$(frameDesc).bind('keydown change', function(event){

   var text = textWithoutHTML(cledDesc.$area.val());

   if(text.length >= 650 && event.which != 8){
      console.log("Longer than MaxLength");
      //lose focus / stop writing
      return false;
   }else{
      //Do something
   }
});

Я добавил немного кода, чтобы он работал.

  1. Я ловлю даже ключ "canc" (и другие)
  2. Перед проверкой длины текста, который я обновляю, текстовая область выглядит так, как будто CLEditor имеет внутренний кэш, и у меня было странное поведение после удаления и повторного ввода текста.

Это отлично работает для меня:

var cledDesc = $("#oodsummary").cleditor()[0];
var frameDesc =  cledDesc.$frame[0].contentWindow.document;
var limit = 10;
$(frameDesc).bind('keydown', function(event){
    cledDesc.updateTextArea();

    var text = cledDesc.$area.val();

    if(text.length >= limit &&
        event.which != 8 && // back
        event.which != 46 && // canc
        event.which != 37 && // left
        event.which != 38 && // up
        event.which != 39 && // right
        event.which != 16 && // shift
        event.which != 20 && // caps lock
        event.which != 91 && // os special
        event.which != 18 // alt
        ) {
        alert("Il testo inserito risulta essere troppo lungo.");
        cledDesc.$area.val(text.substr(0, limit)).blur(); 
        return false;
    }else{
        cledDesc.updateTextArea();
        return true;
    }
});
Другие вопросы по тегам