Плагин для переноса слов по слогам
Здравствуйте
Нашел на 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, время: 05:48. |