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

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

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

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

HTML

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

Q&A

解決済

1回答

630閲覧

getelementbyIDでの要素の抜き出しについて

LUCIA

総合スコア20

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2020/02/13 15:10

編集2020/02/13 15:21

fc2ブログでのhtml編集で躓いてしまいまして困っております。

ブログにアクセスした時のトップ画面に、各記事ごとの内容のあらすじを表示したいと思い、テンプレートのhtml編集をしています。
あらすじを表示するためにsummaryというIDを定義し、その部分をjavascriptで抜き出して表示したいと考えています。(idは概要用に作りました)
記事それぞれに<div id="summary"></div>というブロックを設け、javascript部分に

html

1<script> 2document.getElementById(‘summary’); 3</script>

といった記述をすればいいのだろうな…というところまではぼんやりと分かったのですが、今は何も表示されていない状態です。

ここからどうすれば、id="summary"部分を抜き出して表示することができますでしょうか…?

記事のページ

html

1 2<div id="summary">あらすじ部分です。idにsummaryを使っています。トップページにこの部分を表示したいと考えています</div> 3 4本文です。 5

この記事がトップページに出てくるとこんな表示になります。一番上の記事です。
トップページ

(本来ならば太字タイトルの下にsummaryが出てきてほしいのですが、空欄になってしまっています)

チャレンジしてみたこと

javascript

1 2window.onload = function(){var summary=document.getElementById("summary")}; 3

上記javascriptをscriptタグで囲ってbodyの閉じタグの直前に入れました。

html

1<div id="summary"></div>

javascriptでIDを指定して抜き出し、summaryと名の付いたdivタグへ挿入しようとしました。
(空白となりました)

innerHTMLを使っても同じ状態です。

ちなみに、fc2ブログではhtml部分に、本文をまるごと表示するための<%topentry_body>という変数が用意されているのですが、これを使うと本文のラストまで表示されて長くなってしまうので、自分で表示する範囲を決めようと思い立った次第です。

もしよろしければ、お力添えいただければ幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

###できない理由
JavaScriptはページに出力された結果をブラウザ側で後から操作するものです。

ゆえにトップ画面に、各記事の<div id="summary">中身のテキスト</div>がそもそも出力されていないのであれば、できません。

「中身のテキスト」をご自身で出力できますか?

トップ画面には<div id="summary"></div>が現状出力されていますが、「中身のテキスト」は空になってしまっているようです。

もしこれが出力できなければ、素直に<%topentry_body>を使って全文出力するのみです。

###解決策
もし全文では長いということでしたら、JavaScriptで部分的に切り抜いてみてはいかがでしょうか。

以下のような記事一覧があったとしたら

HTML

1<div class="post"> 2 <p class="target">あいうえおかきくけこ</p> 3</div> 4<div class="post"> 5 <p class="target">さしすせそたちつてと</p> 6</div>

こうして前半5文字に切り抜けます。

JavaScript

1$(function() { 2 $('.post').each(function() { 3 // 全文を取得する 4 var target = $(this).find('.target'); 5 // 前半5文字を取得 6 target.text( target.text().substr( 0, 5 ) ); 7 // 表示する 8 target.css('display','block'); 9 }); 10}); 11

切り抜かれるまでは表示したくないでしょうから、CSSで非表示にしてあげましょう。

CSS

1p{display:none;}

上記のコードを実行する

投稿2020/02/13 23:11

編集2020/02/13 23:13
ikatako

総合スコア270

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

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

LUCIA

2020/02/14 09:57

回答ありがとうございます!お返事遅くなりましてすみません。 要素が空だから、何も表示されなかったのですね…!盲点でした。 変数を使わずにbody部分が持ってこれるといいのですが…いろいろと試行錯誤してみます。 それから、字数で切り抜く方法もご提示ありがとうございます。あらすじをぴったり何文字!と決めて記事がかければ良いのですが、どうしてもオーバーしてしまったりなどして、キリよくできないのが難しいところですね。 それから、fc2ブログには要約のための変数<%topentry_description>も用意されてはいるようです…しかしこちらですと、改行が無視されて読みづらくなるのが現状です。 もう少し、いろいろトライしてみたいと思います。何かあれば追記をいたしますね。
ikatako

2020/02/14 12:52

>キリよくできないのが難しいところですね。 記事本文を書くときに、summaryとしたい部分を囲っておけばいいかもしれません。このように。 https://jsfiddle.net/hbwtmLev/ これなら「あいうえ」と「さしすせそ」のように切り抜く場所を操作できます。
LUCIA

2020/02/14 13:54

メッセージありがとうございます! あれから試行錯誤をしまして、<div class="summary"><%topentry_body></div>と囲うことで、summary id部分のみを表示させることに成功しました! ただ、うまく動作するページとそうでないページが出てきてしまいます。
LUCIA

2020/02/14 13:58

http://ancyfamily.blog.fc2.com ここにアクセスしていただいて、タイトルの頭に☓がついている記事が、表示のうまく行かないページです。 大きく分けて、2つの問題があります。 ①そもそもトップページに表示されない CSSインライン記述、と書かれた記事が該当します。こんなコードを書いています。 summary idは1つしかないのですが… <!DOCTYPE html> <html lang=“ja”> <head> <meta charset=“UTF-8”> <title>CSS</title>           <style>           h1 {color: red; }           </style> </head> <body> <div id="summary">あらすじ部分です。CSSをインラインに記述しています。</div> <h1>CSS入門</h1> <p>はじめてのCSS</p> </body> </html>
LUCIA

2020/02/14 14:13 編集

そして、もうひとつが、 ②summaryタグ以降も表示されてしまう という問題です。 ルビ振りjavascript付き、と書かれている記事なのですが… 青空文庫という電子書籍形式のルビ振りの方法をjavascriptで実行するスクリプトが適用されているのです。 |漢字《ふりがな》という記述を変換してくれます。(記事詳細ページに入るときちんとルビ振りされています。) こちらにも、id=summary部分は一箇所しかないのですが、もしかして、何か競合していたりするのでしょうか? ルビ振りのjavascriptコードは以下になります。これを記述したファイルをDropboxに置いて、外部参照しています。 $('body').append( '<style>body{display:none;}</style>' ); $(function(){ $('body').each(function() { $(this).html( $(this).html() /* 半角または全角の縦棒以降の文字をベーステキスト、括弧内の文字をルビテキストとします。 */ .replace(/[\||](.+?)《(.+?)》/g, '<ruby>$1<rt>$2</rt></ruby>') .replace(/[\||](.+?)((.+?))/g, '<ruby>$1<rt>$2</rt></ruby>') .replace(/[\||](.+?)((.+?))/g, '<ruby>$1<rt>$2</rt></ruby>') /* 漢字の連続の後に括弧が存在した場合、一連の漢字をベーステキスト、括弧内の文字をルビテキストとします。 */ .replace(/([一-龠]+)《(.+?)》/g, '<ruby>$1<rt>$2</rt></ruby>') /* ただし丸括弧内の文字はひらがなかカタカナのみを指定できます。 */ .replace(/([一-龠]+)(([ぁ-んァ-ヶ]+?))/g, '<ruby>$1<rt>$2</rt></ruby>') .replace(/([一-龠]+)(([ぁ-んァ-ヶ]+?))/g, '<ruby>$1<rt>$2</rt></ruby>') /* 括弧を括弧のまま表示したい場合は、括弧の直前に縦棒を入力します。 */ .replace(/[\||]《(.+?)》/g, '《$1》') .replace(/[\||]((.+?))/g, '($1)') .replace(/[\||]((.+?))/g, '($1)') ); }); $('body').fadeIn(3000)}); たくさん質問してしまいました。すみません…! インラインCSSは特定の記事でよく使いますし、ルビ振りスクリプトもとても便利なので、うまく動いてほしいのですが…!
ikatako

2020/02/14 14:48 編集

わたしは出力結果して見れないので「<div class="summary"><%topentry_body></div>と囲う」をどこに書いたのかつかめず、なぜその出力結果となったのかわからないのですが、とりあえず 【あ】明らかな間違い 【い】予測によるアドバイス を記載いたします。 -- 【あ】明らかな間違い summaryが表示できている方ですが、出力結果が下記のようになっていますよね。 <div id="summary"><div id="summary">概要部分です。うまく行けば、トップページにはこの部分のみ表示されています。</div><br><br>ここから本文です。</div> 上記のうち以下(A・B・C)は明らかな間違いなので直してあげてください。 (A)<div id="summary">が2重になっているので1つにしましょう。 (B)idはページに1つしか使えず、複数あるとJavaScriptでの取得ができなかったりするので、classを使いましょう。 (C)summaryの外側が「<span class="blog_content_desc overflow-text"></span>」で囲まれているので、summaryはdivでなくspanを使いましょう。(spanの入れ子にdivはダメ) 【い】予測によるアドバイス summaryが表示できていない前半2つの記事では「<span class="blog_content_desc overflow-text"></span>」の中身として、その記事のHTMLが全て出力されている状態となっています。 でもsummaryが表示できている方はそんなことはなく、テキストだけになっています。 おそらくですが、前半2つの記事を書くときに、HTMLモードでなく、デフォルトモードでHTMLを書いていらっしゃいませんか? その場合、書いたHTMLはテキストとして認識されます。ゆえに全文出力するときに、HTMLのつもりで書いたけどテキストとして認識された部分が、本文として出力されてしまいます。 こちらのリンク(https://vanillaice000.blog.fc2.com/blog-entry-893.html)をご覧いただくとわかるように「>新投稿画面のデフォルトモードでhtmlタグを直接入力することはできない 」とありますので、ちょっとモードの変更を試してみてください。 -- 以上【あ】と【い】をご確認頂き、直らなければまたコメントください。
ikatako

2020/02/14 14:36

すみません23:09は今見ました。 先ほど ><div class="summary"><%topentry_body></div>と囲うことで、summary id部分のみを表示させることに成功しました! と仰っていますが、23:09によればこれはできていなかったということでしょうか? であればやはり本文は普通に全て出力し、「②summaryタグ以降も表示されてしまう」は21:52のコメントで解決すればいいのではと思いますが、何か不都合ございますか?
LUCIA

2020/02/14 16:24

メッセージありがとうございます! summaryidの表示は、一部できて、一部できなかった…という結果になりました。 記事タイトルに○のついているほうが正しく出力されているものなのですが、本文のみをベタ打ちしたものがほとんどです。 逆に、失敗してしまったほうは、<html>のタグから入力されていたり、インラインCSSが入っていたりと、個別ページを1から作り上げたような打ち込みになっています(ローカルファイルとしても実際と同じような表示になっています。 おそらく大きく違う点はここかと思われます。
ikatako

2020/02/14 16:30

えっと、そちらは【い】をご確認いただきたいです。あと【あ】はどうでしょうか?
LUCIA

2020/02/14 16:31

それから、タグが2重になってしまっている部分について…これは、テンプレートの中と、記事本文(%topentry_body)両方に<div id="summary">が含まれているからということになるので…どちらかを消せば解決できますでしょうか…。 idの件については、classを使うようにして、getelementsbyclassnameで取得するようにしてみますね。
LUCIA

2020/02/14 17:03

確認いたしました。 まず【あ】についてですが、テンプレート側にあったsummaryタグを削除して<%topentry_body>のみにし、本文のほうでsummaryをクラス定義しました。 合わせて、javascriptの方も、getelementsbyclassnameを使うようにしました。 今のところ…div classで取得できていますが、テンプレート上ではspan に挟まれているので、きちんと動いていたとしても、span classに書き換えたほうが望ましいのでしょうか。
LUCIA

2020/02/14 17:14

【い】について… 実は、執筆環境がfc2のブログアプリからなのです。そして、アプリの場合は、デフォルトモードを持っておらず、htmlでの記述のみ対応している状態です。 ただし…うまく表示できなかったページについては、そのページだけに設定したいCSSがあったため、別のテキストエディタで、<!DOCTYPE html>から</html>まですべて打ち込んだあとにブログ投稿画面にコピペして貼り付けているのです。もちろんその中にはインラインCSSも含まれています。このせいでテキスト判定されてしまうのでしょうか。 あとは…前述のルビ振りjavascriptのページ、これが含まれている部分に関しては、idをclassに変え、ダブっているタグの部分を削除しても状態は変わっていないようです。
ikatako

2020/02/14 17:35 編集

span の入れ子はあくまで文法ルール(https://saruwakakun.com/html-css/basic/div-span#two4)であってブラウザが動かなくなることはないので、お好きなようにしていいと思います。 ということで【あ】はいいですね。 ちなみにご質問にあるこれ window.onload = function(){var summary=document.getElementById("summary")}; は何も意味がないので削除してください。これは「変数summary」に「#summaryの要素」を代入する、というだけの処理であって、代入したものに何かするなどが書かれていないので何も起こりません。 次に【い】ですが、まず予測が間違っていたようでお詫びします。そして<%topentry_body>は<!DOCTYPE html>から</html>までも本文とみなす仕様になっているようなので、とりあえずDOCTYPEやmetaタグやheadタグやstyleタグは削除してください。きっとそれらはstyleタグのために必要だとお考えになって書いたものですよね?削除しましょう。 ではstyleはどこに書くかですが、次のような記述はいけませんか? <h1 style="color:red;">CSS入門</h1> あとルビ振りの件はわたしでは理解が及びませんでしたのでお手数ですが別質問を立ててください。 ひとまず今夜はここで失礼致します。
LUCIA

2020/02/15 07:46 編集

返信ありがとうございます。 <style>タグの件なのですが、実はページによっては複雑なCSSを入れたいと思う部分があります…外部ファイルに置くほど多数のページに渡るわけではなく、ある1ページだけを変更したい、という場合なのですけれども…! https://jsfiddle.net/lucicode/bywhv4t5/2/ jsfiddleにアップロードしましたが、こんな形のリストボックス、見出し形式のCSSの使用が多いですね。
LUCIA

2020/02/15 08:37

それから…上記のhtmlを記事画面に直書きした時、反映をしなかったので、 記事内でhtmlを使う方は「改行の扱い」指定に注意が必要 https://vanillaice000.blog.fc2.com/blog-entry-923.html ここの記事を参考に自動改行をオフにしました。 すると…一つの記事に直書きしたにも関わらず、トップページのほうにまでCSSが反映してきてしまい、他の記事の見出しまでリストボックスになってしまいました…!(これはこれでオシャレですが) これまでお話していたこととはまた別の問題かもしれませんが、もしお時間ありましたらトップページを覗いてみていただけたら嬉しいです。
LUCIA

2020/02/15 08:42

なお、前述のルビ振りjavascriptの件につきましては、いただいたアドバイスの通り別質問としてスレッドを建てることにいたしました。お忙しい中、本当にありがとうございます。
ikatako

2020/02/16 00:52 編集

なにやらまた新しい問題が・・(笑) 目的と現状を整理させてください。 目的はこちらですよね。 ★1:記事ごとに文字数が異なるsummaryをトップページに表示したい ★2:記事ごとにCSSを適用させたい ★3:ルビを何とかしたい(これは別質問ということで) ★4:リストボックスを何とかしたい そして現状はこちらですよね。 まず★2のために記事ごとのheadにstyleを書いたら★2はできた。しかし★1のために記事に<%topentry_body>を書くと、トップページのsummaryにheadなどまで出力されてしまい、それらが出力された場合に★2ができない。つまり★1と★2が二律背反である。 閑話休題 もし二律背反の原因が「>トップページのsummaryにheadなどまで出力されてしまい、それらが出力された場合」という条件で間違いないのであれば、headなどをトップページのsummaryとして出力させてはいけないことになりますから、必然、CSSはhead内でなく直書きが解決策となります。 もし「長いから直書きは嫌」となりますと、情けないのですが私は他に二律背反を解決する手立てをもちあわせておりませんので、これ以上は控えさせて頂ければと思います。(最悪headでなくbodyにstyleを書いても適用はされますから、これならheadなどをsummaryに出力せず二律背反を回避できるかと思いますが、これはspnaとdivの件同様に文法上避けるべきです。) ちなみに★2に必要なのは<%topentry_body>だけでしょうから、質問にある取得しかしないJavaScriptについては、getElementByIdだろうがgetElementsByClassName()だろうが取得しかしないのであれば削除しましょうね。<%topentry_body>で出力された全文のうち一部が欲しいのであれば21:52で足りるはずです。 最後にヌルリとさりげなく加わってきた★4ですが(笑)、これはリストの親タグにクラスを付けてCSSの指定はその親から指定してあげるようにすればトップページに反映されることはありません。以下のように。 https://jsfiddle.net/smdapf15/
LUCIA

2020/02/16 02:06

メッセージありがとうございます。 昨日、別質問を立てました。 JavaScript - 【fc2ブログ】特定の部分でjavascript・CSSがうまく動作しない|teratail https://teratail.com/questions/241560 こちらのほうで、情報修正依頼のコメントが届いたのですが、 document.getElementsByClassName("summary"); を走らせただけでは、要素の取得しかしないはずなので変化がないのが正常なのでは?とヒントをいただきました。 もしかすると、正常だと思っていたテキストベタうちページ(○のついたページ)のほうが特別な動作である可能性も考えられますので、只今検証中です。
ikatako

2020/02/16 02:20

そのヒントはすでに02:33にも書きました。削除しましょう。内容を整理してからからまた改めてそちらのご質問を編集なさるのがよろしいかと存じます。
LUCIA

2020/02/16 03:09 編集

ありがとうございます。 とりあえず、トップページにまで溢れていたCSSにつきましては、クラス定義をすることでもとに戻りました。助かりました…! 該当のjavascript部分については削除いたしました。
LUCIA

2020/02/16 02:42

もう少し要点を整理してみたいと思います。 別質問が立っていますので、このトピックの質問は、一旦締め切ったほうがよろしいですか?
LUCIA

2020/02/16 13:59 編集

あと少しで、解決できそうな所まで来ています…!
LUCIA

2020/02/16 21:30

遅くなりましたが、進展が見られましたので報告いたします。 下記のやり方でほぼ解決いたしました…! **解決策** 記事一覧のsummaryよりも下の部分に、下記スクリプトで余白を多めに設けて本文を見えなくした上で、 <script> var gaiyou = document.getElementsByClassName('summary'); for(var i = 0; i < gaiyou.length; i++) { gaiyou[i].style.fontStyle = "italic"; gaiyou[i].style.marginBottom = "30em"; gaiyou[i].style.fontSize = "15px"; } </script> 本文部分のsummaryには <script> var kakushi = document.getElementsByClassName('summary'); for(var i = 0; i < kakushi.length; i++) { kakushi[i].style.display = "none"; } </script> 非表示にしておくコードを記述しておくことで、トップページをsummary部分のみに設定することに成功しました。 また、bodyの閉じタグの直前に、 <script> $('body').append( '<style>body{display:none;}</style>' ); $(window).load(function(){ $('body').hide().fadeIn(3000); }); </script> このようなフェードインスクリプトを記述することで、ページ遷移の際に、ゆっくりと表示されるようにしました。 (フェードインの際、少しちらつきが見られますので、あともう一歩なのですが…!) お忙しい中ヒントをいただきまして、ありがとうございます。
ikatako

2020/02/17 22:11 編集

遅くなりました。わたしも自分の質問で手こずっており余裕がありませんでした。 ちらつきの方はトップページのCSSにbody{display:none;}を書いておけば解決すると思います。 最初の回答に「JavaScriptはページに出力された結果をブラウザ側で後から操作するもの」と書きましたが、それに従えばちらつく原因がわかります。つまり、まず出力されてから、JavaScriptがその結果に対してbody{display:none;}しているのでちらつきが生じるというわけです。 それではこれにて失礼致します。
LUCIA

2020/02/18 04:17

今回は、とても有意義なお時間をいただけて嬉しかったです。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問