やりたいこと
- URLのクエリパラメータをページ内の全リンク(内部リンク)に付加してサイト内で引き継ぐ
コード
jQuery、URL Parserというライブラリを利用します。
<script type='text/javascript' src='/javascripts/jquery.js'></script>
<script type='text/javascript' src='/javascripts/purl.js'></script>
$(function(){
if (location.search == '') {
return;
}
var req_params = $.url(location.href).param();
$('a').each(function(){
if (/^(#|https?:|\/\/)/.test($(this).attr('href'))) {
return;
}
var parsed = $(this).url();
var old_params = (parsed.attr('query') == '') ? {} : parsed.param();
var new_path = parsed.attr('path') + '?' + $.param($.extend(old_params, req_params));
$(this).attr('href', new_path);
});
});
仕様
- リクエストURLにクエリパラメータがなければ何もしない
- リクエストURLのクエリパラメータをハッシュ化
- 全リンクを走査
- href要素がフラグメントのみもしくは絶対URLであればスキップ
- 内部リンクでも絶対URLの可能性がるためホスト名を検証したほうがいいかもしれない
- リンクのクエリパラメータをハッシュ化
- URL Parser のparam()メソッドはクエリパラメータがない場合 { : ''} が返るのでその回避
- ただしマージ後文字列化した時不自然な=が入るだけで実害はないと思われる
- URL Parser のparam()メソッドはクエリパラメータがない場合 { : ''} が返るのでその回避
- リクエストURLとリンクのクエリパラメータハッシュをマージして文字列化
- 新たに生成したパスでhref要素を上書き
- href要素がフラグメントのみもしくは絶対URLであればスキップ
※パラメータに配列が含まれていたり、リンクに同一パラメータが存在するかもしれないので、ハッシュ化してマージする仕様にした
留意点とか
- GETメソッドのフォームにはactionにパラメータ追加しても効かない
- hidden要素を追加する必要がある
- Flashでのページ遷移があると効かない
- そもそもJavaScriptオフだと効かない
※結局実運用せず見送った
via 130単位 http://d.hatena.ne.jp/deeeki/20121018/add_params_to_links
0 件のコメント:
コメントを投稿