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

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

新規登録して質問してみよう
ただいま回答率
85.49%
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

解決済

1回答

2936閲覧

範囲選択中のテキストをJavaScript(jQuery)で装飾する方法がわかりません。

yayak

総合スコア66

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クリップ

投稿2020/09/12 03:46

【実現したいこと】

マウスをドラッグしてテキストを範囲選択する。
特定のボタンをクリックすると、範囲選択中の文字がjQueryで装飾(文字を赤く)される。

※昨日、teratailにて質問させて頂き、「範囲選択中の文字をjQueryで取得してalertで表示する」ことは叶ったのですが、その応用で上記の装飾に挑戦したところ、見事に挫けてしまいました。

書いたコード

// html <div class="sample-button">このボタンを押すと選択範囲中のテキストを装飾</div> <div contenteditable="true" class="sampe-textarea">ここに文章があり、この文章内の任意の箇所を範囲選択したいです。</div> // jQuery <script> $(function(){ const selection = getSelection(); var selectText = ''; var start,end,focus; $(document).on('selectionchange',function(){ focus = selection.focusNode; //選択範囲の終点を含むノード // 指定されたノードのDOMツリー内の親ノードが.sampe-textareaのとき if(focus.parentNode.closest('.sampe-textarea')){ setTimeout(()=>{ start = selection.anchorOffset; end = selection.focusOffset; selectText = focus.data.substring(start,end); },100); } }); $('.sample-button').on('click',function(){ selectText.replaceWith('<span style="color:#ff0000;">' + selectText + '<span>'); // alert(selectText); と記載すると、範囲選択した文字がalertされるので、文字は選択できているはずです。 }); }); </script>

問題点

テキストを範囲選択後、ボタンをクリックすると、Chromeのconsoleで、
Uncaught TypeError: selectText.replaceWith is not a function at HTMLDivElement.<anonymous>
上記のように表示されます。

テキストを範囲選択後、ボタンを「クリック」することで、それまで範囲選択していたテキストを装飾(文字を赤く)する方法がわからずにおります。

もし、上記についておわかりになる方がいらっしゃいましたら、どうかご教授いただけましたら幸いです。

何卒、よろしくお願い申し上げます。

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

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

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

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

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

hentaiman

2020/09/12 06:22

jqueryとjavascriptごっちゃになってませんか? そこまでコード書けてログもちゃんと見れるのならconsole.logでも出しながら一行ずつソースを追えば何に対してreplaceWith を使おうとしているのか分かるはず
m.ts10806

2020/09/12 08:09

selectTextは要素ではなく文字列ですよね。
yayak

2020/09/13 03:51 編集

hentaiman様、掲載しているコードはteratailで熟練の方がご親切で教えてくださったものであり、私の実力ではございません。私は頂いたコードを理解することに努めたのですが、自分の未熟さを痛感しております。もう少しコードを1つずつ理解してみます><
yayak

2020/09/12 09:12

m.ts10806様、ご指摘いただいた通りでした。取得した文字列をいじったところで、ブラウザ上に表示されている要素が置き換えられるはずないですものね。。要素を置き換えするためにどうしたらよいかずっとネットを模索しているのですが、調べ方が悪いせいか悪戦苦闘しております。。JavaScript本当に難しいです。。
hentaiman

2020/09/12 16:10

なるほどな では、上から順に読み直してみて、不明点があれば質問に追記してみてください ex: txt_aにはこのhtmlが入ると思うが、違う値が入っているのはなぜか? ex: size_bには30が入ると思ったが、空になっているのはなぜか? と言うような具体的な質問だと説明が出来ます。 それとgetSelectionが何なのかは質問文を見ただけだと分かりません。
yayak

2020/09/13 03:43

hentaiman様、とても暖かいお言葉、心より感謝申し上げます。日常でプログラミング知識を教えてくれる人がおらず、独学のためちぐはぐの知識のため、一つずつ分析してみようと思います。そしてどうしてもわからなかったら再度ご質問させて頂けましたら幸いです。ご指導心よりお礼申し上げます。ありがとうございます。
guest

回答1

0

ベストアンサー

replaceWith()の使い方間違っているのは指摘した通り。
.replaceWith()
あくまで「セレクタ」に作用するので、単なる文字列であるselectTextに対しては使えません。
想定通りに動くわけではないですが、今のHTMLに対して動作させるのはこう。

js

1 $('.sampe-textarea').replaceWith('<span style="color:#ff0000;">' + selectText + '<span>');

「選択したところだけ赤字にしたい」という場合、色々なやり方が考えられます。

  1. 全文に対してそこだけ置換した文字列を入れなおす
  2. 選択した前後にタグを入れる

teratailのマークダウンの補助機能はおそらく2です。

例:
何か文字打つ→任意の場所を選択→マークダウン補助機能のBを押下
何か**文字**打つ

蛇足:
<span>閉じれてないので、今のままだと「スタートから後ろ全部」にフォントカラー適用されるので注意です。
selectText + '<span>'

投稿2020/09/12 09:41

編集2020/09/12 09:46
m.ts10806

総合スコア80842

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

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

m.ts10806

2020/09/12 09:48

結局どっちも置換は必要かな。
yayak

2020/09/13 03:48

m.ts10806様、ご提示いただいたコードで書き換えができました。 現状は、狙った箇所ではなく全ての文が書き換えられてしまうため、m.ts10806様のおっしゃるように何かマークなどを利用するなどして、狙った箇所をずばり書き換えできるように再度熟考したいと思います。 いつも知恵を貸してくださり、ありがとうございます。本当に助けられております。 勉強を続けてまいります。
yayak

2020/09/13 03:49

phpman様、URLをご提示いただきありがとうございます。ぜひ参考にさせて頂きます。
m.ts10806

2020/09/13 21:20

yayakさん phpmanという人は無視していいですよ。 本件と関係なく、自分のコメント(それも本件とは全く関係ない)に構ってほしいだけの追っかけなので(すごくいい風に言うと)
yayak

2020/09/17 14:37

m.ts10806様、そうだったんですね!この質問に何がどう関係してるのだろうと不思議に思っていたので、謎が解決しました!有難うございます!
phpman

2020/09/24 11:36

m.ts10806 男らしく、自分の誤りを認めた方がよろしいのではありませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問