質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1677閲覧

<div>内の文字列の○文字目以降を削除したい

miguel_2018

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/10/18 05:20

編集2018/10/18 06:32

いつもお世話になっております。

<div>内には文字列が入りますが、<font>タグが含まれる可能性があります。 例:あ<font color="#e51c23">あ</font>あ この時、”あ”という文字が20文字目までは入るようにして21文字目以降の”あ”は削除したいと考えてます。 一応下記のjsで21文字目以降の”あ”は削除できましたが、<font color="#e51c23"></font>のタグがなくなってしまいます。

html

1<div class="contenteditable" contenteditable>ここに文字が入ります</div>

js

1$(document).on( 'blur',"div .contenteditable", function() { 2 var text = $(this).text(); 3 textTrim = text.substring(0,21); 4 $(this).html(textTrim); 5 6      //var stringOld = $(this).html(); 7 //for(i=0;i<=stringOld.length;i++){ 8 // ループで1文字ずつ取得して、21文字めの”あ”に来たらbreakして、$(this).html()で 9        // 上書く方法も思いつきましたが、入力する文字に"<"や”>”があったらどうしようと思いやめました 10 //} 11 } 12 });

なくなってしまう理由は、テキスト文字を取得した際にすでにタグを含んでいないということが原因だと思いますが、実現方法がどうしても思い浮かびません。

実現方法についてお知恵をお借りできたら幸いです。

--追記--

テキスト:今日はいい天気ですが、午後からはumbrellaが必要になるでしょう
※”いい”と”は”の文字の色が装飾されています。

入力された文字

html

1<div>今日は<font color="#e51c23">いい</font>天気ですが、午後から<font color="#e51c23"></font>umbrellaが必要になるでしょう</div>

欲しい文字 (20文字) ⇒ 今日はいい天気ですが、午後からはumbr
※装飾されている文字の色をしているfontタグは失いたくないです。

html

1<div>今日は<font color="#e51c23">いい</font>天気ですが、午後から<font color="#e51c23"></font>umbr</div>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaba

2018/10/18 05:44

やりたいことの説明を文面通りに受け止めると、"あいう"が22回繰り返された場合、文字削除処理後は"あいう"を20回繰り返した後、"いう"が2回繰り返される結果になりますが、その認識で正しいですか?
miguel_2018

2018/10/18 06:28

わかりづらく申し訳ありません。例を追記させていただきました。
guest

回答2

0

ベストアンサー

どうしても面倒な処理になるのでCSSで幅を限定する等で済めばいいのですが、そうでないのならやはりカウントするスクリプトが必要になります。

jQuery

1$(document).on('blur', 'div .contenteditable', function(event) { 2 function truncateTextNode(textNode) { 3 var text = textNode.nodeValue; 4 if (text.length > remain) { 5 textNode.nodeValue = text.substring(0, remain); 6 remain = -1; 7 } else { 8 remain -= text.length; 9 } 10 } 11 12 var remain = 20; 13 var root = this; 14 var tw = document.createTreeWalker(root); 15 var node; 16 while (node = tw.nextNode()) { 17 switch (node.nodeType) { 18 case document.ELEMENT_NODE: 19 if (remain < 0) { 20 node.setAttribute('data-remove', '1'); 21 } 22 23 break; 24 case document.TEXT_NODE: 25 truncateTextNode(node); 26 break; 27 } 28 } 29 30 if (remain < 0) { 31 $(root.querySelectorAll('[data-remove]')).remove(); 32 } 33});

cf. https://teratail.com/questions/102493

投稿2018/10/18 06:22

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miguel_2018

2018/10/18 07:40

いただいたスクリプトで想定していたことが実現できました! IEですと引数を省略できませんとエラーになってしまいましたが、ちゃんと引数を渡すことで解決できました。 ありがとうございました! // 追記 function acceptNode(){ return NodeFilter.FILTER_ACCEPT; } const safeFilter = acceptNode; safeFilter.acceptNode = acceptNode; // 引数を省略しない var tw = document.createTreeWalker(root,NodeFilter.SHOW_ALL,safeFilter,false);
guest

0

まず切り分けが必要

  • contenteditableは特殊なので、普通のtextareaなどで動作を確認

javascript

1<script> 2$(function(){ 3 $('#btn').on('click',function(){ 4 var text = $('#ta').val(); 5 textTrim = text.substring(0,21); 6 $('#ta').val(textTrim); 7 }); 8}); 9</script> 10<textarea id="ta"> 11<font color="#e51c23"></font> 12</textarea> 13<input type="button" id="btn" value="btn">
  • 普通のdivで処理

javascript

1<script> 2$(function(){ 3 $('#btn').on('click',function(){ 4 var text = $('#d1').html(); 5 textTrim = text.substring(0,21); 6 $('#d1').text(textTrim); 7 }); 8}); 9</script> 10<div id="d1"> 11<font color="#e51c23"></font> 12</div> 13<input type="button" id="btn" value="btn">
  • contenteditable処理

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 $('#btn').on('click',function(){ 5 var text = $('#d1').text(); 6 textTrim = text.substring(0,21); 7 $('#d1').text(textTrim); 8 }); 9}); 10</script> 11<div id="d1" contenteditable>ここ書き換える</div> 12<input type="button" id="btn" value="btn">

※上記書き換え部分に「<div id="d1" contenteditable></div>」を記載してボタンを押す

命題ではhtmlで戻していますが不整合なデータを戻すならtextでしょう

投稿2018/10/18 06:28

yambejp

総合スコア117745

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miguel_2018

2018/10/18 07:41

切り分けて考える事も必要なのですね、勉強になります!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問