Плагин для переноса слов по слогам
Здравствуйте
Нашел на github плагин для переноса слов по слогам Немного изменил плагин, что бы перенос слов был и в латинице RusLatA - добавил буквы английского алфавита RusLatV - добавил гласные буквы английского алфавита RusLatN - добавил согласные буквы английского алфавита Но теперь появилась такая проблема - в тексте есть див '#line_break', который используется в качестве разделителя и стили этого дива игнорируются если убрать из RusLatV буквы английского алфавита (aeiou), тогда все норм, стили дива выполняются Код:
<style type="text/css"> |
Вы для своей магии используете не текстовое содержимое блока, а его html-разметку. Из-за этого, возможно, верстка блока нарушается и ваш блок #line_break дематериализуется.
Код - мое почтение. Без бутылки-другой даже пытаться разобраться - страшно. |
Цитата:
и как я уже писал выше, если из RusLatV убрать буквы английского алфавита (aeiou), тогда стили не удаляются |
изменил название дива #line_break на #lb
исключив в названии гласные буквы, костыль конечно, но так все работает - стили дива не удаляются |
sashgera,
Цитата:
пост #32 строки 70 - 75 https://javascript.ru/forum/misc/843...-slogam-4.html |
Цитата:
плагин добавляет в слова символы мягкого дефиса (shy), в том числе и дочерних html-элементах получается типа: <div id="li-ne_bre-ak"></div> или: <but-ton></but-ton> сделал так: Код:
<style type="text/css">мне нужно удаление этих символов во всех html-элементах, включая элементы без идентификатора поэтому попытался сделать удаление символов в элементах с классом, но моя попытка не работает, проблема в replaceWith. Не посмотрите?
//удалить символы мягкого дефиса (shy) в дочерних html-элементах с классом 'shy'
this.children().each(function(){
$(this).addClass("shy");
current_class = $(".shy").attr("class");
full_html = $(this).prop("outerHTML").replace(/(\­||)/gi, "");
$("."+current_class).replaceWith(full_html);
});
|
hyphens: auto; |
Цитата:
|
Похоже, что проблема возникает из-за того, что ваш регулярный плагин для переноса слов обрабатывает весь HTML внутри #test как текст, и при этом <div id='line_break'></div> тоже попадает под обработку. Когда вы добавляете английские гласные в RusLatV, регулярка пытается найти совпадения даже внутри пустого div, и браузер теряет стили, потому что HTML-разметка переписывается .html() методом.
Самый простой способ это исправить — исключить дочерние элементы из обработки, чтобы перенос применялся только к текстовым узлам. Например, так:
$.fn.hyphenate = function(){
var RusLatA = "[abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя]";
var RusLatV = "[aeiouаеёиоуыэюя]";
var RusLatN = "[bcdfghjklmnpqrstvwxyzбвгджзклмнпрстфхцчшщ]";
var RusLatX = "[йъь]";
var Hyphen = "\xAD";
var re1 = new RegExp("("+RusLatX+")("+RusLatA+RusLatA+")","ig");
var re2 = new RegExp("("+RusLatV+")("+RusLatV+RusLatA+")","ig");
var re3 = new RegExp("("+RusLatV+RusLatN+")("+RusLatN+RusLatV+")","ig");
var re4 = new RegExp("("+RusLatN+RusLatV+")("+RusLatN+RusLatV+")","ig");
var re5 = new RegExp("("+RusLatV+RusLatN+")("+RusLatN+RusLatN+RusLatV+")","ig");
var re6 = new RegExp("("+RusLatV+RusLatN+RusLatN+")("+RusLatN+RusLatN+RusLatV+")","ig");
this.each(function(){
$(this).contents().each(function(){
if(this.nodeType === 3){ // только текстовые узлы
var text = this.nodeValue;
text = text.replace(re1, "$1"+Hyphen+"$2");
text = text.replace(re2, "$1"+Hyphen+"$2");
text = text.replace(re3, "$1"+Hyphen+"$2");
text = text.replace(re4, "$1"+Hyphen+"$2");
text = text.replace(re5, "$1"+Hyphen+"$2");
text = text.replace(re6, "$1"+Hyphen+"$2");
this.nodeValue = text;
}
});
});
};
Изменения: Используется $(this).contents() вместо $(this).html(). Проверяем nodeType === 3, чтобы обработка шла только по текстовым узлам, а <div id='line_break'> оставался нетронутым. Таким образом, стили #line_break будут сохраняться, а перенос слов будет работать и для латиницы. |
| Часовой пояс GMT +3, время: 18:06. |