Иногда введенный пользователем текст снова удаляется, и причина кроется в функции unChunkWords
:
Эта функция выполняет итерацию только над элементами (с классом "w"),но он не перебирает узлы простого текста, которые могут возникать между этими элементами. А в элементе, редактируемом содержимым, пользователь действительно может печатать текст в областях между элементами. И поэтому этот цикл в unChunkWords
никогда не будет посещать такой текст, опуская его в массиве, который он возвращает.
Вы можете заставить это произойти, поместив курсор в конец слова, перед пробелом, затемнажмите клавишу со стрелкой вправо. Либо это перемещает курсор к началу следующего слова, либо он не перемещается визуально (он просто переместился из span
, в котором он находился). В любом случае, ваш курсор теперь находится в текстовом узле, который разделяет два слова. Введите что-нибудь и нажмите где-нибудь еще. ... случается аномалия.
Есть много способов обойти это. Одним из них является использование метода jQuery contents()
, который также собирает текстовые узлы. Измените следующий код:
$(".w", tObj).each(function(i, el) {
if ($(el).hasClass("b")) {
words.push("[" + $(el).text().trim() + "]");
} else {
words.push($(el).text().trim());
}
});
... на этот:
$(tObj).contents().each(function (i, el) {
if (el.nodeType !== 3 && !$(el).is(".w")) return; // Only regard ".w" or text nodes
if ($(el).hasClass("b")) {
words.push("[" + $(el).text().trim() + "]");
} else {
words.push($(el).text().trim());
}
});
Теперь введенный вами текст не будет опущен из words
, даже если вы введете его в текстузлы, которые являются прямыми потомками редактируемого содержимого элемента.
Добавление пробелов
Ваш код добавляет пробелы с помощью .join(" ")
без проверки того, что фрагменты текста действительно разделены пробелом в содержимомэлемента p
. Итак, я бы просто взял весь контент, включая интервалы, и просто объединял это. Таким образом, вы будете иметь разделение слов в точности так, как они есть в элементе p
.
Итак, ваша функция будет:
function unChunkWords(tObj) {
var words = "";
$(tObj).contents().each(function (i, el) {
if ($(el).hasClass("b")) {
words += "[" + $(el).text() + "]";
} else {
words += $(el).text();
}
});
return words.replace(/\s+/g, " ").trim();
}
Отказ от ответственности: IЯ только посмотрел на эту конкретную проблему, указав, почему у вас такое конкретное поведение и как ее исправить. Это не означает, что теперь ваш код будет работать корректно во всех его предполагаемых функциональных возможностях, что выходит за рамки вопроса.