先日、検索 → 一覧 → 詳細 という画面に対して、
- 一覧から詳細画面へはリンクをつかって遷移すること
- 詳細画面から一覧画面へは「パンくず」リンクを利用して戻れるようにすること
- 一覧画面は検索したときの条件で絞り込まれた一覧が表示されること
- 詳細画面へのURLに検索条件のURLクエリをつけず、詳細データへのIDのみをクエリにつけること
- Cookie(セッション)利用不可
という依頼を受けました。
SEO対策のためにURLに余計なクエリをつけたくないけど、パンくずのフローは辿ってきたフローをちゃんと戻れるようにしたいというのが趣旨でした。
そこでHTMLを生成するときには、ID、検索条件ともにリンクのURLにクエリとして追加しておき、Javascriptを利用して、URLからクエリの一部を抜き取り、リンクをクリックしたときに、それらがPOSTされるようにしました。
書いておけば、後々役に立つかなと思ったので書いてみることにしました。
下がそのサンプルになります。
どちらも同じURLを指定していますが、開く画面は別になるようになっています。
この処理の手順はこんな感じになります。
- リンク要素を取得する
- リンクのURLをアドレスとクエリにわける
- 動的にフォームを生成し、生成したフォームにクエリをhiddenとして追加していく
- リンクのhref属性の書き替え
- リンククリック時に生成したフォームがsubmitされるようにする
- リンク要素を取得するリンクの取得はjQueryの要素セレクタを使いました。また、それぞれの要素に対する処理はeach()関数を利用するようにしました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters$(document).ready(function() { $("a").each(function() { // ここに処理を書く }) });
- リンクのURLをアドレスとクエリにわけるattr()関数でhref属性の値を取得することができるので、取得したhref属性の値を「?」でわけます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters$("a").each(function() { var url_split = $(this).attr("href").split('?'); });
- 動的にフォームを生成し、生成したフォームにクエリをhiddenとして追加していく要素を動的に追加するのには、appendTo()関数を利用することができます。要素の生成は単純に$()関数の中にhtmlで要素を書き込めば生成することができます。
また、同じ要領で生成したフォームにhiddenを追加していくことができます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// フォームを生成する var id = "form" + counter; $("<form action='" + url_split[0] + "' method='post' id='" + id + "'/>") .attr("target", '_blank') .appendTo('body'); // 生成したフォームにクエリの要素をhiddenとして追加していく var query = decodeURI(url_split[1]).split('&'); for (var key in query) { var key_value = query[key].split('='); $("<input type='hidden' />") .attr("name", key_value[0]) .attr("value", key_value[1]) .appendTo("#" + id); }
- リンクのhref属性の書き替えattr()関数でhref属性の書き替えもできるので、これを利用してhref属性を書き替えます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// クエリなしのURLをリンクに設定する $(this).attr("href", url_split[0]); // 本当はこっちのほうがいいのかも $(this).attr("href", 'javascript:void(0)');
- リンククリック時に生成したフォームがsubmitされるようにするclick()関数を利用して、クリック時の挙動を設定します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// リンクをクリックしたときに生成したフォームをsubmitさせる $(this).click(function() { $("#" + id).submit(); return false; });
※return false;としないとクリックしたあとにhref属性に設定したURLへ遷移してしまします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script | |
<script type="text/javascript"> | |
<!-- | |
$(document).ready(function() { | |
var counter = 1; | |
$("a").each(function() { | |
// URLとクエリを分ける | |
var url_split = $(this).attr("href").split('?'); | |
// フォームを生成する | |
var id = "form" + counter; | |
$("<form action='" + url_split[0] + "' method='post' id='" + id + "'/>") | |
.attr("target", '_blank') | |
.appendTo('body'); | |
// 生成したフォームにクエリの要素をhiddenとして追加していく | |
var query = decodeURI(url_split[1]).split('&'); | |
for (var key in query) { | |
var key_value = query[key].split('='); | |
$("<input type='hidden' />") | |
.attr("name", key_value[0]) | |
.attr("value", key_value[1]) | |
.appendTo("#" + id); | |
} | |
// クエリなしのURLをリンクに設定する | |
$(this).attr("href", url_split[0]); | |
// リンクをクリックしたときに生成したフォームをsubmitさせる | |
$(this).click(function() { | |
$("#" + id).submit(); | |
return false; | |
}); | |
counter += 1; | |
}); | |
}); | |
//--> | |
</script> |
※追伸 >- この投稿が役にたったと思った方は、上か下の広告をクリックしていただけるとうれいいです。
0 件のコメント:
コメントを投稿