Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Плагин обрезающий текст для jQuery (https://javascript.ru/forum/project/21063-plagin-obrezayushhijj-tekst-dlya-jquery.html)

devote 27.08.2011 12:03

Плагин обрезающий текст для jQuery
 
Вот штампанул тока что плагин для jQuery, может кому надо будет... Что делает!? все просто, обрезает лишние строки. Тоесть первый параметр число указывающее скока можно строк отображать, и если текст превышает это число строк, то скрипт обрежет текст и подставит то что указано во втором параметре. По сути он не обрезает текст, а просто в то место где кончается строка, он вставляет то что указано во втором параметре.

вот смотрите:
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
(function( $ ){
$.fn.correctLines = function( maxLine, moreText ) {
	return this.each(function( index, self ) {
		var temp, classes, i, lineHeight;

		maxLine = ( temp = /^(?:.*\s)?fixline_([\d]+)(?:\s.*)?$/.exec( self.className ) ) && temp[1] || maxLine || 3;
		moreText = moreText || '...<br />';

		var od = $( self ).css( "display" );
		var clone = $( self ).css( "display", "block" ).clone( true ).
				css( {"height": "auto", "position": "absolute", "width": self.offsetWidth + "px" } ).html("");
		$( self ).css( "display", od ).after( clone );

		var height = 0,
			width = self.offsetWidth,
			lines = 0,
			lastHeight = 0,
			startWord = 0,
			endWord = -1,
			txt = self.innerHTML,
			part = [];

			while( /(<.*)\s(.*>)/g.exec( txt ) ) {
				txt = txt.replace(/(<.*)\s(.*>)/g, '$1&jftF767Tgjk56&$2');
			}
			txt = txt.split(' ');

		for( i = 0; i < txt.length; i++ ) {

			txt[i] = txt[i].replace(/&jftF767Tgjk56&/g, ' ');
			clone[0].innerHTML += txt[ i ] + ' ';

			if ( clone[0].clientHeight > lastHeight ) {

				height = lastHeight;
				startWord = endWord + 1;
				endWord = i - 1;

				lastHeight = clone[0].offsetHeight;

				if ( ++lines > maxLine ) {
					break;
				}
			}
		}

		if ( lines > maxLine ) {

			$( self ).css({height: height + "px", overflowY: 'hidden'});

			part = txt.slice( startWord, endWord + 1 );
			height = clone.html( part.join(' ') )[0].offsetHeight;
			for( i = part.length - 1; i >= 0; i-- ) {

				clone.html( part.join(' ') + moreText );

				if ( clone[0].offsetHeight > height ) {
					part.splice( i, 1 );
					endWord--;
				} else {
					break;
				}
			}

			txt[ endWord ] += moreText;

			self.innerHTML = txt.join(" ");
		} else {
			$( self ).css({height: "auto"});
		}

		clone.remove();
	});
}
})( jQuery );
</script>

<div style="width: 200px; border: 1px solid #000;">
	<div class="correct_comment">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tincidunt nunc commodo magna posuere sollicitudin. Quisque ultrices sodales nisi eu sagittis.</div>
</div>

<br />
<style>.fvem1{width:200px;font-size:14px;border:1px solid #000000;}</style> 
<div class="fvem1"> 
    <div class="correct_comment">Loremipsud <div style="font-size:45px">olorsitmet</div>, consecteturad ipiscingelit. Nulla tincidunt nunc commodo magna posuere sollicitudin. Quisque ultrices sodales nisi eu sagittis.</div> 
</div>
<br />
<style>.fvem2{width:20%;font-size:14px;border:1px solid #000000;}</style>
<div class="fvem2">
	<div class="correct_comment">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tincidunt nunc commodo magna posuere sollicitudin. Quisque ultrices sodales nisi eu sagittis.</div>
</div>

<script type="text/javascript">
	jQuery(".correct_comment").correctLines( 3, '<span onclick="jQuery(this).parent().css(\'height\', \'auto\').end().hide();">...&nbsp;<span style="color: #f00; text-decoration: underline; cursor: pointer;">more</span></span>' );
</script>
В примере текст на пять строк, но я ему говорю что надо тока три. В реале он их не обрезает, а просто в ту часть где нужно вставляет то что указано во втором параметре, а если не указано то ставить троеточее и перевод строки.

Gozar 27.08.2011 12:21

Я правильно понял, что для того, чтобы посчитать количество k - переводов строк(\n - <br>) и в случае если k> заданного сделать subsring по последнему пробелу меньше допустим 400 символов с подстановкой за ними трех точек, ты написал 121 строку?

И зачем в твоем скрипте столько обращений к style?

devote 27.08.2011 12:24

Цитата:

Сообщение от Gozar
ты написал 121 строку?

слушай я написал это за 15 мин от скуки, понятно дело не оптимизировал, и т.д. а шо прада много style чтоль?:D Ну ппц, видимо от невысыпания что-то я там нахимичил ;) Ну ниче, еще надо 15 мин на него и глядишь строк меньше станет :lol:

devote 27.08.2011 12:25

а вообще ты прав там слишком много ненужного мусора... хм... что-то я погорячился

Gozar 27.08.2011 12:27

напиши в 3 строки, по крайней мере большее количество возможно не потребуется ))

devote 27.08.2011 12:28

А слушай, стал то нужен для выяснения размера мать его строки в высоту... ну он же леально текст то не режет, а блок протсто уменьшает, и оверфлоу ставит... но тем немение можно сделать поменьше кода всеж

devote 27.08.2011 12:29

Цитата:

Сообщение от Gozar
Я правильно понял, для того чтобы посчитать количество k - переводов строк(\n - <br>) и в случае если k> заданного сделать subsring

Нет не правильно, в тексте нету этих переводов, текст в одну строку... посмотри внимательно

Gozar 27.08.2011 12:29

Цитата:

Сообщение от devote (Сообщение 122863)
А слушай, стал то нужен для выяснения размера мать его строки в высоту

ой, что-то мне кажется такое решение сомнительным.

devote 27.08.2011 12:30

Будь там эти (\n - <br>) тогда и хрень эту писать не пришлось бы.)

devote 27.08.2011 12:31

Цитата:

Сообщение от Gozar
ой, что-то мне кажется такое решение сомнительным.

Главное фурычит :D


Часовой пояс GMT +3, время: 11:45.