JavaScript で文字をトリミングする(改善版)
JavaScript を用いてエントリータイトル等の文字をトリミング(指定した文字数だけ表示する)するカスタマイズです。前回の「JavaScript で文字をトリミングする」は文字数だけでトリミングしたものですが、今回の改善版はバイト数で計算します。全角はそのまま1文字として数え、半角英数は2文字(2バイト)を1文字としてカウントします。
左のスクリーンショットが5文字でトリミングしたサンプルです。上は全角のみなので5文字でトリミングし、下は半角を含むので計7文字でトリミングしています。
さらにスクリプトを修正すれば、特定の半角文字("M"とか"W"のような幅の広い文字)を全角として数えることも可能と思われます。完璧に横幅を揃えることはできませんが、かなり精度の良いトリミングができると思います。
今回も「id 属性名」と「要素名+ class 属性名」で指定したタグの中に記述された文字列をトリミングする、JavaScript を書いてみました。
Windows + IE6/Firefox 2 で実験した限りでは、全角・半角いずれも1文字で計算してトリミングしてくれるようですが、コードに不具合等ありましたらお知らせください。
1.スクリプトの追加
リスト 1.1 のリストを </head> の直前に追加します。外部ファイルでも構いません。
<script type="text/javascript"> var rest = '...'; function cutStringById(id, size) { var str = document.getElementById(id).innerHTML; if(str.length > size){ document.getElementById(id).innerHTML = str.substring(0, size) + rest; } } function cutStringByTagNameAndClassName(tagName, className, size) { var elements = document.getElementsByTagName(tagName); for (i=0; i < elements.length; i++) { if (elements[i].getAttribute('class') == className || elements[i].getAttribute('className') == className) { var str = elements[i].innerHTML; elements[i].innerHTML = trim(str,size); } } } function cutStringByIdAndTagName(id, tagName, size) { var element = document.getElementById(id); var elements = element.getElementsByTagName(tagName); for (i=0; i < elements.length; i++) { var str = elements[i].innerHTML; if(str.length > size){ elements[i].innerHTML = trim(str,size); } } } function trim(str, size) { if(str.length > size){ var cutstring = str.substring(0, size); var byte = countByte(cutstring); var tmp = ""; if (byte < size*2) { for(k=0; k < (size*2-byte)*2; k++){ tmp = str.substring(0,size + k); if (countByte(tmp) >= size*2) { break; } } } if(tmp){ return tmp + rest; } else { return str.substring(0, size) + rest; } } else { return str; } } function countByte(str) { var byte = 0; for (j=0; j < str.length; j++) { str.charCodeAt(j) < 0x100 ? byte++ : byte += 2; } return byte; } </script>- リスト 1.1 トリミング用スクリプト
2.スクリプトを起動する
リスト 2.1 またはリスト 2.2 のいずれかを 、トリミングしたい文字列の直後、または </body> の直前に追加します。
要素名+ class 属性名で指定
<script type="text/javascript"> cutStringByTagNameAndClassName('[要素名]', '[class 属性名]', トリミングサイズ); </script>- リスト 2.1 要素名+ class 属性名で指定
id 属性名で指定
<script type="text/javascript"> cutStringById('[id 属性名]', トリミングサイズ); </script>- リスト 2.2 id 属性名で指定
id 属性名+ 要素名で指定
<script type="text/javascript"> cutStringByIdAndTagName('[id 属性名]', '[要素名]', トリミングサイズ); </script>- リスト 2.3 id 属性名 + 要素名で指定
具体的な起動方法は3項をご覧ください。
3.サンプル
リスト 3.1 のようにHTMLマークアップされた文字列
<a href="http://domain.com/" class="hoge">文字をトリミングする</a>- リスト 3.1 サンプル1
の「文字をトリミングする」の文字を先頭から 5 文字だけ表示(「文字をトリ...」にする)する場合は、リスト 2.1 を利用し、その赤色部分を、
cutStringByTagNameAndClassName('a', 'hoge', 5);- リスト 3.2 サンプル2
とします。
リスト 3.3 のようにHTMLマークアップされた文字列
<p id="hoge">文字をトリミングする</p>- リスト 3.3 サンプル2
の「文字をトリミングする」の文字を先頭から 5 文字だけ表示(「文字をトリ...」にする)する場合は、リスト 2.2 を用い、その赤色部分を
cutStringById('hoge', 5);- リスト 3.4 サンプル2
とします。
4.トリミング後の追加文字列を変更する
リスト 1.1 の 2 行目(リスト 4.1 の赤色部分)を他の文字に変更してください。何も表示させたくない場合は赤色部分を削除してください。
var rest = '...';- リスト 4.1 トリミング後の文字列
5.特定の半角文字のバイト数を変更する
1項のスクリプトに青色のような行を追加します(間違ってたらすいません)。赤色部分は "0xXX" という、16進数を設定します。
function countByte(str) { var byte = 0; for (j=0; j < str.length; j++) { str.charCodeAt(j) < 0x100 ? byte++ : byte += 2; if(str.charCodeAt(j) == [該当文字の16進数]) byte++; } return byte; }- リスト 5.1 特定の半角英数を全角文字と同じカウントにする
charCodeAt は指定した文字の Unicode を返却する関数です。JavaScript 1.2 と 1.3 で振る舞いが異なるようです。
2006.12.28 追記
id 属性名+要素名で検索できるコードを、リスト1.1 およびリスト2.3 に追加しました。
2007.02.15 追記
トリミング文字列が短い場合に正常に表示されない不具合を修正しました。
- dtree のサブカテゴリーリストにブログ記事タイトルを表示する for Movable Type
- Movable Type 4.1/MTOS のネイティブタグで dTree を実装する
- コメント投稿フォームの「情報を保存する」のチェックを外した時の振る舞いを変更する
- Parallax Backgrounds で背景画像のスクロール速度を変える
- Lightbox JS/Litebox で BlogPet を背景画像の下に隠す
- prototype.js と pngfix.js の競合を解消する
- JavaScript の for 文のパフォーマンスを改善する
- Google マップの貼り付け用 HTML を valid にする
- Movable Type 4 の透過 PNG ロゴを IE6 以下のブラウザで透過する
- ツリー表示 JavaScript 「dTree」詳解
- dTree によるサブカテゴリーリスト for Movable Type
- HighSlide JS と prototype.js の競合を解消する
- HighSlide JS の onclick 属性を JavaScript で登録する
- Slider によるフォントサイズ変更でアクセシビリティを向上させる
- コメント投稿時にフォームボタンをグレーアウトする for Movable Type
- Slider の利用方法
- Highslide JS でサムネイル画像を拡大表示する
- JavaScript で文字をトリミングする
- BlogPeople 等のリンクリストによる表示の遅延を解消する(その1:JavaScript編)
≫ サイドバーの文字数を制限する from OKANOWEB.NET
小粋空間さんのJavaScript で文字をトリミングするを参考に、私のブログの... [続きを読む]
以前質問したことを覚えて下すってたんですね。
ありがとうごさいます。
募金したいんですけどやり方がわからず、四苦八苦してます。
できればやり方を教えて頂けるとありがたいです。
>きくみさん
こんにちは。
ご連絡ありがとうございました。
募金(ドネーションですね)の方法につきましては別途エントリーしたいと思います。
なお、本カスタマイズはHTMLタグの構造によってスクリプトを修正する必要があります。具体的にトリミングしたい部分を言って頂ければ、それに合うスクリプトを作成致します。
それではよろしくお願い致します。
サイドバーの新着記事のタイトル(記事タイトル)を11?12文字(全角)で表示して、その後を
”。。。”としたく思ってます。
募金金額500円くらいしか出せないのですがいいですか?
>きくみさん
こんにちは。
とりあえずご要望の機能をリスト1.1 とリスト2.3 に追加しましたのでお試しください。
リスト2.3 は下記のようにするとうまくできると思います。
<script type="text/javascript">
<!--
cutStringByIdAndTagName('最新記事list', 'a', 17);
//-->
</script>
ご寄付の有無や金額はご自由です。
それではよろしくお願い致します。
指定した文字数以下のものが検出されるとその文字列がundefinedとなってしまいますがどのようにすればうまく表示されますでしょうか?
>ossさん
こんにちは。
ご質問の件ですが、リスト1.1 を修正致しましたのでご確認頂ければ幸いです。
それではよろしくお願い致します。
はじめまして。
おォっと思い使わせていただこうとテストしてみましたが。
指定しているフォントサイズが反映されなくなりました。
以上です。
>りかさん
こんにちは。
情報ありがとうございました。
ではでは!
こんばんは。
フォントサイズの件ですが、FireFox2では指定した文字サイズで表示されるのですが、IE7だと最大サイズになってしまいます。
では、ご報告まで
by りか
>りかさん
こんばんは。
たびたびのご連絡、ありがとうございました!

