JavaScript|ページ分割用の共通ブログパーツで現在のURL分だけリンク削除

勘違いしながらどハマりしながら作り上げる爺の『JavaScript奮闘記』。今回は、関連する複数ページに貼る共通リンク表にて、自URL分だけリンク削除し“現在この記事読んでます”マークを表示するブログパーツを作ります。いわゆる“ページネーション”=ページ分割と同じもの。

ポク太郎です。

閲覧者にこんなのもどう?とブログ下部にはサムネイル付き関連記事群。でもそんな大カテゴリでのおススメでなく、もっと密接な記事を紹介しておくとサイト構成が分かりやすく。

例えば、大カテゴリは「自作スピーカ」でも、○号機の制作風景として「設計」「板切出し」「組立」「塗装」「完成」みたいな密接関連記事群。いわゆる“ページネーション”。

そのブログパーツを共通化し、JavaScriptで今現在のURL分だけ表示切り替えを行います。

JavaScriptで行う仕事は「現在のURL調べる→対応する場所の“リンクを無効化”と“Now!表示”」。それをできる限り少ない情報量・単一のidで実装します。


ページ分割用ブログパーツ

これが作ったページネーションパーツ。JavaScriptで表示させています。

例は現在「記事5」を読んでる場合の表示。また、以下は例なので表内のリンク先は全部架空のURL。押しても反応しません。

シリーズ物記事のリンク表
記事1
Now
記事2
Now
記事3
Now
記事4
Now
記事5
Now
記事6
Now
記事7
Now

~ここからデバッグ表示

~ここまでデバッグ表示

ページネーション作成に必要な決まりと仕様

まずURL規則を決めた方が

前のページ分割 次のページ分割 

関連記事として並べるURLの規則は以下。これはJavaScriptで何とでもできるものではありますが、シリーズ記事ならシリーズらしいパーマネントアドレスにしておくと何かと楽です。

ページネーション作成に必要なURL規則
id名 URL
1 id=”s1″ /seisaku-s1.html
2 id=”s2″ /seisaku-s2.html
3 id=”s3″ /seisaku-s3.html
4 id=”s4″ /seisaku-s4.html
5 id=”s5″ /seisaku-s5.html
6 id=”s6″ /seisaku-s6.html
7 id=”s7″ /seisaku-s7.html
爺がハマった注意点。id名は先頭文字が必ずアルファベットである必要があります→新人コーダーに知っておいて欲しい命名規則の考え方[画像・ID・class名]。「こんにちは、新人コーダーのジジイと申します。」

HTMLソースはこう

前のページ分割 次のページ分割 

面倒なのでcss<style>タグ中に書いてあります。内容は“現在のURLはこれと知らせるためのNow表示”のスタイル。上下のスペース調整に苦労してますが。

<style>.now {
/*visibility:hidden;*/
 display:none;
 color:#cc0000;
 font-weight:bold;
 font-size:x-small;
 margin-top:-1em;
 padding-top:0.2em;
 margin-bottom:-0.5em;
}</style>
<table style="border-style:solid;border-width:2px;table-layout:fixed;width:100%;">
<caption>シリーズ物記事のリンク表</caption>
<tbody>
<tr style="text-align:center;height:55px;">
<td id="s1"><a href="/seisaku-s1.html" onClick="return false;">記事1</a><br /><span class="now">Now</span></td>
<td id="s2"><a href="/seisaku-s2.html" onClick="return false;">記事2</a><br /><span class="now">Now</span></td>
<td id="s3"><a href="/seisaku-s3.html" onClick="return false;">記事3</a><br /><span class="now">Now</span></td>
<td id="s4"><a href="/seisaku-s4.html" onClick="return false;">記事4</a><br /><span class="now">Now</span></td>
<td id="s5"><a href="/seisaku-s5.html" onClick="return false;">記事5</a><br /><span class="now">Now</span></td>
<td id="s6"><a href="/seisaku-s6.html" onClick="return false;">記事6</a><br /><span class="now">Now</span></td>
<td id="s7"><a href="/seisaku-s7.html" onClick="return false;">記事7</a><br /><span class="now">Now</span></td>
</tr>
</tbody>
</table>
<span class="nbare">~ここからデバッグ表示</span><br />
<div id="debug"></div>
<span class="nbare">~ここまでデバッグ表示</span><br />
本題と無関係なコアウェブバイタルの話。<tr>タグ内のheight:55px;部分はJavaScriptが走った後、Nowが表示されカックンと縦に動くのを防ぐ必要高さ。あらかじめ確保しておきます。無関係な話ですが、JavaScriptではカックンと動かぬためのCLS悪化防止策が重要事項なので。

<table>タグ内にリンク先<a>タグと改行<br />と表示用<span>タグを並べてあります。

JavaScriptid=””を付けられた表内の<td>タグを指定し、その子要素である<a>タグ、<span>タグに対し指令を出し制御します。

同一id名が複数あるとハングアップしてしまうJavaScriptですが、こうするとid=””は1か所だけでよい構成になり、名付けに悩む必要もなくなります。

JavaScriptの仕事はリンク削除とcss操作

これがページ分割用JavaScriptソース

前のJavaScript 次のJavaScript 

JavaScriptのソースが以下。これはテスト用なので1行目がコメントアウト、2行目にデバッグ用URLの文字列→実使用時は入れ替え。

	//	var url=location.href;
		var url='/movie/oitnb/recall-s5.html';
		var tmp = url.split('/recall-');
		var n_atag = 0;
		var n_disp = 2;

	if (tmp[1] != null) {
		var tmp2 = tmp[1].split('.html');
		var id = tmp2[0];
document.getElementById('debug').innerHTML += id+'<br />';

		var td = document.getElementById(id);
//全子要素の.textContentをデバッグ表示
	var count = td.childElementCount;
	for(var i=0; i<count; i++) {
document.getElementById('test').innerHTML += i+':'+td.children[i].textContent+'<br />';
	}
		var atag = td.children[n_atag];
		var disp = td.children[n_disp];
//document.getElementById('test').innerHTML += atag+'<br />';
//document.getElementById('test').innerHTML += disp.style.display+'<br />';
	//	disp.style.visibility = 'visible';
		disp.style.display = 'block';
	//href属性の値を書き換える
		atag.setAttribute('href','javascript:void(0)');
	//	atag.setAttribute('href','');//勝手に付いちゃう
		atag.style.color='#666';
	//	atag.style.text-decoration='none';//undefined variableエラー
	//	atag.addEventListener('mouseover',function() {
	//	});
	}
document.getElementById('debug').innerHTML += '<br />JS終了到達';

JavaScriptの仕事=id計算

ここではURL内の末尾部分をid名としたので、それを抜き出すプログラム。.splitメソッドを使ってURLから不要な前後を取り除き、それでid名に一致する文字列を取り出しています。

  • 変数tmp[0]tmp[1]にそれぞれ空白s5.htmlが代入。
  • 変数tmp2[0]s5が代入←これがid名と一致。

うちのサイトは必ず末尾が.htmlなので上記のように。WordPressの場合、通常は/なのかな?その辺は適宜修正下さい。

注意点

7行目if (tmp[1] != null) {}でしっかりnull確認を行うこと。条件成立、つまりURLが全然異なるページだった場合、JavaScriptがエラーで止まってしまいます。

別のページなら何も表示する必要が無いので実害無しに思えますが、間違えた場所に貼ってしまった場合に他のJavaScriptも止まったり。

また、WordPressのカスタムJavaScriptでは動くのにファイル指定すると動かないなど、無駄で余計なトラブルの原因になるのでnull確認はしっかり。

JavaScriptの仕事=指定idの子要素取得

これが1カ所だけのid記述でエレメントを指定するミソ。

変数tdに指定したidのエレメントを代入。それの子要素を14~17行目で全部表示しています。

id=”debug”領域に表示された内容で分かりますが、最初の<a>タグが要素番号0、3番目の<span>タグが要素番号2に入ってることが分かります。多分要素番号1には改行。

それが分かったら、変数atagtd.children[0]、変数disptd.children[2]を代入。ソース中では変数n_atagn_dispに定義。

これら子要素であるエレメントに対し、次項でリンクの削除とcss制御を行います。

JavaScriptの仕事=リンク削除とcss操作

前のJavaScript 次のJavaScript 

変数dispstyle.displayはHTML内で指定されたnoneですが、ここで23行目のようにblockに書き換えます→消されてたNow表示が出現。

次に変数atagのリンク先削除。25行目のようにhref要素をjavascript:void(0)に書き換えます。

意味はJavaScriptに「常にUndefinedを返せ」←要は「何もすんな」。26行目のように空にするとブログサービス・WordPressが勝手に自記事のURLを付加しちゃうので。

その他、27行目でリンクの文字色を変えています。それ以降のコメントアウト部分はあまり意味がなかった部分。

結局やったことは、自URLの分のリンク隠して自分だよと表示する機能だけ。だから自URLから自URLへリンクを貼りたくない人向け。

パンくずリストの例の際にGoogleが、自URLへのリンクが貼られてようが貼られてなかろうがSEOに影響なし、と発表しております。

なので必須ではないですが、閲覧者には今どれ読んでるのか分かりやすくはなるかな、と思っております。

コメント

タイトルとURLをコピーしました