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

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

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

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

HTML

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1636閲覧

【fc2ブログ】特定の部分でjavascriptがうまく動作しない

LUCIA

総合スコア20

JavaScript

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

HTML

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/02/15 13:22

編集2020/02/16 03:01

fc2ブログのテンプレートでhtmlのカスタマイズをしています。
それぞれの記事に入る前のトップページに、本文の一部を表示するため、全文を取得する<%topentry_body>変数を使ったあと、javascriptを動作させています。
トップページに表示したい部分には

html

1<div class="summary">抽出したい部分</div>

といったように定義して、

html

1<script> 2document.getElementsByClassName("summary"); 3</script>

こちらのスクリプトをbodyタグが閉じる直前に記述しています。

ここまでのプログラムの動作は
別質問
JavaScript - getelementbyIDでの要素の抜き出しについて|teratail
https://teratail.com/questions/241222
の中でお力添えをいただき、解決に向かいつつあります。しかし、ページによってプログラムが動作する部分とそうでない部分が出てきてしまったため、問題切り分けのために別質問を立てさせていただきました。
(回答してくださった方からも、この件については別質問を…とアドバイスをいただいています)

問題のページ
ブログトップページ

アクセスしていただきますと、記事一覧が表示されると思います。
タイトルの頭に○がついているページは、上述の、本文一部抜き出しのスクリプトがきちんと動作しています。

今回、お伺いしたいのは、タイトルの頭に☓がついているページの件についてです。
大きく分けて2種類あります。

1.別のjavascriptが動作しているページ
記事一覧の中の、
テストページ(ルビ振りjavascript付き)
が該当します。
本記事では、青空文庫という電子書籍形式にならった記述をすると、自動でふりがなを振ってくれるスクリプトが動作しています。
これは、|漢字《ふりがな》という記述を変換してくれるものです。個別ページに入ると【快晴】の部分にカイセイとルビが振られています。

javascript

1$('body').append( 2'<style>body{display:none;}</style>' 3); 4$(function(){ 5 $('body').each(function() { 6 $(this).html( 7 $(this).html() 8 /* 半角または全角の縦棒以降の文字をベーステキスト、括弧内の文字をルビテキストとします。 */ 9 .replace(/[\||](.+?)《(.+?)》/g, '<ruby>$1<rt>$2</rt></ruby>') 10 .replace(/[\||](.+?)((.+?))/g, '<ruby>$1<rt>$2</rt></ruby>') 11 .replace(/[\||](.+?)((.+?))/g, '<ruby>$1<rt>$2</rt></ruby>') 12 /* 漢字の連続の後に括弧が存在した場合、一連の漢字をベーステキスト、括弧内の文字をルビテキストとします。 */ 13 .replace(/([一-龠]+)《(.+?)》/g, '<ruby>$1<rt>$2</rt></ruby>') 14 /* ただし丸括弧内の文字はひらがなかカタカナのみを指定できます。 */ 15 .replace(/([一-龠]+)(([ぁ-んァ-ヶ]+?))/g, '<ruby>$1<rt>$2</rt></ruby>') 16 .replace(/([一-龠]+)(([ぁ-んァ-ヶ]+?))/g, '<ruby>$1<rt>$2</rt></ruby>') 17 /* 括弧を括弧のまま表示したい場合は、括弧の直前に縦棒を入力します。 */ 18 .replace(/[\||]《(.+?)》/g, '《$1》') 19 .replace(/[\||]((.+?))/g, '($1)') 20 .replace(/[\||]((.+?))/g, '($1)') 21 ); 22 }); 23 24$('body').fadeIn(3000)});

上記のjavascriptを記述したファイルをDropboxに置き、外部リンクを貼っています。

このスクリプトが入っているページは、テキストの抽出がうまくいっていないようで、summaryでクラス定義した部分以降も、トップページに表示されてしまっています。
javascript同士、競合していたりするのでしょうか?

2.CSSをスタイルタグで直接記述しているページ
記事一覧の前半3つ(複雑なCSS、インラインに記述、スタイルタグで記述)が該当します。
あるひとつのページだけでCSSを使いたい場合が多くあり、しばしば記事内にCSSを直書きすることがあります。
よく使っているCSSの一例(htmlに直書きしています)
上記のjsfiddleリンクにある、リストボックスや見出し関係のCSSを使うことが多いのですが、この場合も、本文抜き出しスクリプトが動作しません…!

とても長くなってしまいましたが、上記2パターンのエラーに付きまして、どのようなプログラム修正を行えばよいか、お力添えをいただけますでしょうか。
どうぞよろしくお願いいたします。

追記:
document.getElementsByClassName("summary"); たけでは、なにも動作しない筈なので、コード間違いがあるのでは…?とヒントをいただきました。しかし、こちらのコードを<script>で挟んだだけで、少なくとも、ただ本文を打っただけのページではsummaryクラスによる抜き出しが動作している部分があるのです…。テンプレート変数の方に秘密があるのでしょうか。

2020/02/16 追記
CSSが別ページに及んでしまう件については、クラス定義をすることで回避いたしましたので、質問タイトルをjavascriptのみに絞りました。

また、取得だけの動作をしていたjavascriptについては、一旦削除をいたしました。
この状態でも、正しく動作しているように見える部分があるのは、たまたま表示したい部分と【表示可能字数】がうまく合致しているだけなのかもしれません…!

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

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

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

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

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

maisumakun

2020/02/15 13:33

「document.getElementsByClassName("summary");」だけでは、「当該の要素を取得する」だけでなんの変化も起きないのが正しい動作です。 なにかコードを間違えていないでしょうか?
LUCIA

2020/02/15 13:51

メッセージありがとうございます。 テンプレートのコードを見直してみましたが、やはり、document.getElementsByClassName("summary");をscriptタグで囲んだだけの記述しかしていないです。 確かに、javascriptの解説を読むと、取得をするための記述をしたあと、それを代入する記述が必要、という文があるので、なぜこの状態で動作するのか私もわからないのです…!
LUCIA

2020/02/15 13:57

ちなみに、一番最初の質問をしたときは、<div id="summary"><%topentry_body></div> のように、本文記述の変数を<div>で挟んでいたんです。すると、回答をくれた方が、<div>タグが2重になってしまっている(テンプレートと本文両方で<div id="summary">を使っているから?)ので、ひとつ消してくださいねと教えてくださいました。そのため、テンプレート側のdivタグを消して、<%topentry_body>だけを残し、本文側で定義をするようにした、という流れがあります。
LUCIA

2020/02/15 14:02 編集

その際、idで取得するパターンから、クラス名で取得する方法に変更をしました。 これ以外に基本のテンプレートと違うことは、ベースのCSS自体を外部ファイルにしてhtmlから呼び出すことで、編集しやすくしていることくらいなのです。 fc2ブログの変数の仕様なのでしょうか…!
LUCIA

2020/02/16 03:05

ヒントを頂いたとおり、取得するだけの動作をしていたスクリプトについては、削除をしてみました…!しかし、変化がありません。 タイトルに○のついている、正しく動作しているページについても、表示部分の下に【本文】にあたるブロックがあるのですが、そこがうまく隠れているのです。スクリプトを置いていないなら、他のエラーページと同じ動作をしてもいいように思えるのですが…!
LUCIA

2020/02/16 13:34

時間が空いてしまいましたが、上記解決策にて、ほぼ希望通りの動作をすることができました…!
guest

回答1

0

自己解決

解決策
記事一覧のsummaryよりも下の部分に、下記スクリプトで余白を多めに設けて本文を見えなくした上で、

html

1<script> 2var myStyle = { 3 marginBottom: '30em', 4 fontStyle:'italic', 5 fontSize:'15px'  6} 7var elem = document.getElementById("summary").style; 8 9for(var prop in myStyle) { 10 11 elem[prop] = myStyle[prop]; 12 13} 14 15</script> 16

本文部分のsummaryにはid定義をして、

html

1<script> 2document.getElementById("summary").style.display ="none"; 3</script>

非表示にしておくコードを記述しておくことで、トップページをsummary部分のみに設定することに成功しました。

また、bodyの閉じタグの直前に、

html

1<script> 2$('body').append( 3'<style>body{display:none;}</style>' 4); 5$(window).load(function(){ 6 $('body').hide().fadeIn(3000); 7}); 8 9</script>

このようなフェードインスクリプトを記述することで、ページ遷移の際に、ゆっくりと表示されるようにしました。

(フェードインの際、少しちらつきが見られますが、この件に関しては、また別の質問を立てさせていただきます…!)

お忙しい中ヒントをいただきまして、ありがとうございました!

投稿2020/02/16 13:29

編集2020/02/16 13:33
LUCIA

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問