ホームページ制作 オフィスオバタ

Jqueryでリンククリック時に追加パラメータを設置する

PHPでHTML側から情報をもらう方法として、フォームによる投稿があります。
これと異なる方法に、リンクにパラメータを付加する方法があります。

例えば以下のような記述です。

sample.php?date=20210630

リンクにパラメータを直接記述して、PHPに情報を送信する方法です。

今回昔制作したPHPプログラムに手を加えることがありました。
その際に、リンク式パラメータに対し後から追加パラメータを設置する必要がありました。
Jqueryでそんなことができるのだろうか?
と思いましたが、ググって調べてやってみると、実現できました。

忘備録として記録いたします。

実現したかったこと

今回やりたかったことは記事のUP/DOWN処理に、表示位置をキープするという処理を加えることです。
いままでUP/DOWNをすると画面が毎回先頭位置へ移動していました。
使い勝手が悪いので、ボタンを押した時点での画面表示位置をキープする処理を付け加えたいと思いました。
表示位置をキープする処理は以前に行っていたので、どうすればよいかわかります。

ただ、前回は「フォーム式」で表示位置をキープしていましたが、今回は「リンク式」で表示位置をキープする必要がありました。

「リンク式」となっている部分を「フォーム式」に作り替える方法もありましたが、大幅修正が必要になるため、「リンク式」のまま追加で現在の表示位置パラメータを追加することにしました。

クリックした段階で表示位置をリンクパラメータに追加するサンプル

クリックした時点で、現在の表示位置をリンクパラメータに追加するサンプルです。
こちらからご覧いただけます。

各メニューボタンのリンクには、リンクパラメーターは記述されていませんが、クリックするとリンクにパラメータが付加されます。

ソースはこちら


<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>テスト</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(document).ready(function()
{
	var para = para_get();
	var posi = 0;

	if (("posi" in para) == true)
	{
		posi = para["posi"];
		$("#msg").text("付加されたパラメータは ?posi="+posi+"です");
	}
	else
	{
		$("#msg").text("パラメータは付加されていません");
	}

	$(window).scrollTop(posi);
	$("ul li a").click(function()
	{
		var link_url = $(this).attr("href");
		var posi = $(window).scrollTop();
		$(this).attr("href", link_url+"?posi="+posi);
	});


});

function para_get()
{
	// URLパラメータを"&"で分離する
	var url_search = location.search.substr(1).split('&');
 
	// パラメータ連想配列エリア初期化
	var para = [];
 
	// キーエリア初期化
	var key = null;
 
	for(var i = 0 ; i < url_search.length ; i++)
	{
		// "&"で分離したパラメータを"="で再分離
		key = url_search[i].split("=");
 
		// パラメータを連想配列でセット
		para[key[0]] = key[1];
	}
 
	// 連想配列パラメータを返す
	return (para);
}
</script>
<style type="text/css">
msg
{
	border: 1px solid #000;
	padding: 20px;
	height: 60px;
	width: 200px;
	position: fixed;
	left: 20px;
	top: 20px;
}

#reset
{
	padding: 0px;
	height: 60px;
	width: 200px;
	position: fixed;
	left: 20px;
	top: 140px;
}

ul
 {
	padding: 20px;
	width: 300px;
	margin-right: auto;
	margin-left: auto;
	border: 1px solid #ccc;
}

li
{
	list-style-type: none;
	margin-bottom: 200px;
	padding: 0px;
}

li:last-child
{
	margin-bottom: 0px;
}

a
{
	display: block;
	background-color: #333;
	padding: 10px;
	color: #FFF;
}

a:hover
{
	background-color: #3CF;
}

</style>
</head>
<body>
<div id="msg"></div>
<div id="reset"><a href="01.html">リセット</a></div>

<ul>
<li><a href="01.html">メニュー1</a></li>
<li><a href="01.html">メニュー2</a></li>
<li><a href="01.html">メニュー3</a></li>
<li><a href="01.html">メニュー4</a></li>
<li><a href="01.html">メニュー5</a></li>
<li><a href="01.html">メニュー6</a></li>
<li><a href="01.html">メニュー7</a></li>
<li><a href="01.html">メニュー8</a></li>
<li><a href="01.html">メニュー9</a></li>
<li><a href="01.html">メニュー10</a></li>
</ul>

</body>
</html>

仕組みを解説いたします

スクリプト部分

スクリプト部分について解説いたします。
大きく5つの部分に処理が分かれています。

$(document).ready(function()
{
	// (1)リンクパラメータ取得
	var para = para_get();

	// (2)表示位置初期化
	var posi = 0;

	if (("posi" in para) == true)	// (3)リンクパラメータに表示位置が含まれているか?
	{
		// 含まれている場合の処理
		posi = para["posi"];
		$("#msg").text("付加されたパラメータは ?posi="+posi+"です");
	}
	else
	{
		// 含まれていない場合の処理
		$("#msg").text("パラメータは付加されていません");
	}

	// (4)画面位置を指定位置に変更
	$(window).scrollTop(posi);

	// (5)リンクがクリックされた時の処理
	$("ul li a").click(function()
	{
		// リンク部分の記述を取り出す
		var link_url = $(this).attr("href");

		// 現在の表示位置を取得
		var posi = $(window).scrollTop();

		// リンクパラメータに現在の表示位置パラメータを付加する
		$(this).attr("href", link_url+"?posi="+posi);
	});
});

(1)パラメータ取得

呼び出し時のリンクパラメータをGETしています。
PHPの場合は造作もないことですが、今回のサンプルはJavascriptで組んでいるため、Javascriptからリンクに記述されたパラメータを取得しています。

以前の記事をそのまま流用しています。

(2)表示位置初期化

パラメータとして渡された「表示位置情報」を入れる変数の初期化を行います。
0をセットしているのは、初回起動時に先頭を表示させるためです。
なぜならば、初回起動時はリンクパラメータが渡されないため、初期値を入れておかないと誤動作を起こす可能性があるためです。

また、(3)のelseの処理でposi=0を設定する方法もありますが、私はあえて先に記述します。
それは、if文の結果にかかわらずposi変数に値が必ず入ることを保証できるためです。

余談ですが、プログラムでは結果的に同じことでも「例外」ということが得てして発生します。
例えばif文でもthen、elseのどちらのも行かないということもまれに起こります。

そんな場合にでも初期値は必ず設定されるようにしておくことで、誤動作を最小限にすることができます。

(3)リンクパラメータの有り無し判断

リンクパラメータが付加されている場合と、されていない場合で処理を分岐しています。
(“posi” in para) は見慣れない構文ですが、この記述で正確に配列メンバ名のあり・なしを判定できます。

詳しくはこちらの記事をご参照ください。

(4)画面表示位置を指定位置に変更

この部分で、表示位置に画面を移動しています。
scrollTop()はJqueryで画面表示位置を指定する関数です。

(5)リンクがクリックされた時の処理

この部分でメニューがクリックされた場合に、リンクに現在のポジションをパラメータとして付加しています。
仕組みはJqueryのattr()関数を利用して付け加えています。

attr()関数は、参照しているHTMLの記述を抜き出したり、付け加えたりします。
例えば以下のような例です。

//attr()例
<a href="https://office-obata.com" target="_blank">リンク</a>

// Jquery 例
$("a").click(function()
{
    var $link = $(this).attr("href");
    var $target = $(this).attr("target");
});

上記の例だと、$link には「https://office-obata.com」
$targetには「_blank」が格納されます。

attr()関数は対象タグの項目を参照します。

これに対し、以下のように記述すると記載内容が変わります。

//attr()例
<a href="https://office-obata.com" target="_blank">リンク</a>

// Jquery 例
$("a").click(function()
{
    $(this).attr("href", "https://office-obata/blog/");
    $(this).attr("target", "_top");
});

// 実行した結果
<a href="https://office-obata.com/blog/" target="_top">リンク</a>

attr()関数の第2引数に設定値を入れると、その値に書き換わります。
この特性を利用して、リンクパラメータに追加をしています。

Jqueryは使いよう

画面表示位置はブラウザ側でしかわからない情報です。
今回はブラウザ側の情報をリンクパラメータとしてPHPに渡すという内容でした。

最初はそんなことできるのか?
と思いましたが、案外できてしまいました。

「できない」と決めつけるのではなく、
「できるかもしれない」と思ってググるほうが難題を解決できます。

今回もよい体験をいたしました。

モバイルバージョンを終了