2012年10月18日木曜日

[JavaScript]jQuery クエリパラメータを全リンクに付加


やりたいこと



  • 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とリンクのクエリパラメータハッシュをマージして文字列化

    • 新たに生成したパスでhref要素を上書き




※パラメータに配列が含まれていたり、リンクに同一パラメータが存在するかもしれないので、ハッシュ化してマージする仕様にした


留意点とか



  • GETメソッドのフォームにはactionにパラメータ追加しても効かない

    • hidden要素を追加する必要がある



  • Flashでのページ遷移があると効かない

  • そもそもJavaScriptオフだと効かない


※結局実運用せず見送った







via 130単位 http://d.hatena.ne.jp/deeeki/20121018/add_params_to_links

0 件のコメント:

コメントを投稿