選択されたアーカイブリンクを強調表示する(モジュール化対応版)
Tag:[]
サイドメニューにある Monthly Archives および Categories のリンクをクリックした時に該当のリンクを強調表示させるカスタマイズです。前回の記事ではモジュール化されたメニューに対して有効にならかったため全面的に方式を見直し、モジュール化にも対応するようにしました。
今回のカスタマイズはJavaScriptのみを用いてますのでプラグイン等は不要です。
仕組みを簡単に説明しておきます。スタティックなページにJavaScriptを組み込み、MTArchiveTitle の取得を行います。メニューリスト表示後に、同じくスタティックページに組み込んだJavaScript(DOM)を利用して MTArchiveTitle の内容にマッチする年月(またはカテゴリー名)のアンカータグを導き出し、アンカーの属性にスタイルを追加します。
以下カスタマイズ方法です。
1.テンプレートの設定
1.1 Monthly Archives を変更する場合
日付アーカイブテンプレートのサイドメニューにある月別アーカイブ("Monthly Archives"というタイトルのタグ)の設定されている直下に青色のタグおよびスクリプトを挿入します。リストは公開テンプレートを例にしています。なおリストの表示内容(日本語表示/英語表示)によってスクリプトが異なりますのでご注意ください。
まずリストを日本語表示(X年X月)にしている場合です。
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<MTArchiveList archive_type="Monthly">
<a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]<br/>
</MTArchiveList>
</div>
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var year = data.substring(0,4);
var month = data.substring(12,14);
var nodes = document.getElementById('monthlylist').getElementsByTagName('a');
for (i = 0; i < nodes.length; i++) {
var a = year + "年" + month + "月";
if(nodes[i].innerHTML == a){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
次にリストを英語表示(January 2005 等)にしている場合です。
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<MTArchiveList archive_type="Monthly">
<a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]<br/>
</MTArchiveList>
</div>
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var nodes = document.getElementById('monthlylist').getElementsByTagName('a');
for (i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML == data){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
上記の id属性名を使用中の場合は、こちらの属性名を変更してください。
月別アーカイブをモジュール化(日付アーカイブテンプレートより php または MTInclude タグを用いてインクルード)している場合は、スクリプトをインクルードしている行の直下に設定します。
なお、サイドメニューの折りたたみを利用されている方はそちらの id属性名を用いますので、先の
<div class="side" id="monthlylist">
の設定は不要です。ただし現在設定されている id属性名と一致するように、リスト内の赤字部分を適宜修正してください。
前記事の繰り返しになりますが本設定は日別アーカイブページにも適用されます。例えば月別アーカイブと日別アーカイブが同じ「日別アーカイブテンプレート」を利用する設定になっていて(デフォルトではそのようになっています)、カレンダーのリンクが日別アーカイブページになっている場合、カレンダーのリンクをクリックした先のページで該当月が強調表示されます。
1.2 Categories を変更する場合
カテゴリー・アーカイブテンプレートのサイドメニューにあるカテゴリーアーカイブリスト("Categories"というタイトル)の設定されている直下に青色のタグおよびスクリプトを挿入します。リストは公開テンプレートを例にしています。
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<MTCategories>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a> [<$MTCategoryCount$>]<br />
</MTCategories>
</div>
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var nodes = document.getElementById('categorylist').getElementsByTagName("a");
for (i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML == data){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
上記の id属性名を使用中の場合は、こちらの属性名を変更してください。
サブカテゴリー表示の場合はデフォルトで設定されているタグの
<div id="categories">
を利用しますので、
<div class="side" id="categorylist">
の設定は行わず(何か設定されていればそのままでOK)、赤字部分を "categories" に修正してください。スクリプト部分は上記の設定を行います。
サブカテゴリーリストの折りたたみのカスタマイズをされている方は、本スクリプトがサブカテゴリーリスト用のスクリプトの後方に配置されるように設定してください。サブカテゴリーリスト用のスクリプトごとモジュール化されている場合は配置の前後を意識する必要はありませんので、インクルード行の後方に本スクリプトを設定してください。
2.スタイルシートの設定
スタイルシート(styles-site.css)の下記の辺りに青色の設定を追加してください。設定内容はサンプルですので、コメントを参考に内容を適宜修正してください。
当サイトではカテゴリーリストと月別アーカイブおよび日別アーカイブに適用させています。強調表示は行わず、アンダーラインおよび選択状態になるように設定しています。
.side-counter {
font-size:9px;
background: none;
padding:2px;
margin-top:8px;
margin-bottom:25px;
}
a.selectedlink:link,
a.selectedlink:visited,
a.selectedlink:active {
text-decoration: underline; /* リンクに下線を引く場合 */
color: #006699; /* リンクの色を変える場合 */
font-weight: bold; /* 強調文字にする場合 */
}
以上です。カスタマイズ内容に不具合ございましたらご指摘ください。なお動作についてはWindows 2000の
- IE6.0
- Netscape7.1
- FireFox1.0
- Opera7.23
で確認していますが他の環境では未確認ですので情報お待ち申し上げます。
既知のバグで、IEでsetAttribute('class',*)でclass属性の属性値を変更できないという不具合があるため、スクリプト内で setAttribute を2回実行させています(本来はブラウザ種別で分岐させて設定すべきですが)。
メニューをプルダウン形式にされている方は下記のようなスクリプトを配置して、選択月や選択カテゴリーにselected 属性を付与するといいかもしれません。ここではアイデアのみに留めておきます。
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var nodes = document.getElementById('categolylist').getElementsByTagName("option");
for (i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML.indexOf(data) == 0){
nodes[i].setAttribute("selected","selected");
}
}
//-->
</script>
optionタグの前方に設定されたデフォルトの selected は無視されるという認識ですがブラウザによって動作が異なるようであればお許しください。
2005.07.25 追記
Monthly Archives のリストを英語表記にしている場合のカスタマイズ方法を追記しました。
2006.04.04 追記
リストから language 属性を削除しました(HTML4.01/XHTMLで非推奨あるいは廃止されているため)。
- label 要素を用いてトラックバックURLを1クリックで選択状態にする
- 選択されたアーカイブリンクを強調表示する
≫ [愚] サイドバーの選択されたリンク強調表示 from grumble
さえらさんちをウロウロしてて気が付いた。 メインから個別ページに飛ぶと自分が選択... [続きを読む]
≫ [愚] サイドバーの選択されたリンク強調表示 from grumble
さえらさんちをウロウロしてて気が付いた。 メインから個別ページに飛ぶと自分が選択... [続きを読む]
|・) ジー ( °o°)ハッ
できました。モジュール化したまま、プラグインも使わず、該当リンクを強調表現できました。
やむやむでも、yujiroさんのところの真似して、太字は やめて、アンダーライン+色変えにしました。
トラバ とばせません。(_□_:)!!
こちらのカスタマイズ方法に変えたことを、やむやむで記事にしました。
すいません^^;どうにもお手上げなので申し訳ないんですが『教えて君』です。
<script type="text/javascript" src="<$MTBlogURL$>pulldown.js"></script>
<div class="sidetitle">
Monthly Archives
</div>
<!--Monthly -->
<div class="side"id="monthlylist">
<form name="pulldown_monthlyarchives">
<select name="menu" onChange="MM_jumpMenu('parent',this,0)">>
<option value="http://heavens-door.holy.jp/cgi/mt/" selected> 【月別記事】 </option>
<MTArchiveList archive_type="Monthly">
<option value="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]<br/>
</option></MTArchiveList>
</select>
</form></div>
<!--Monthly -->
の直下に記事のプルダウン用のソースを書いたのですが選択月にselected属性を付与するという意味がわかりかねております。(恥)
どこをどうしたらいいもんでしょう?
丸っきりの質問で大変恐縮です・・・。
>さえらさん
こんばんはー。
早速のご利用&記事、ありがとうございます。
トラックバック受信、不調ですいません…。
今回は何も身に覚えがないのですが。
とりあえず様子みてみます。
>198さん
こんばんは。
表現不足ですいません。
「selected 属性を付与」というのは option タグに selected 属性を設定、という意味で書きました。
具体的には
<option value="<$MTArchiveLink$>" selected="selected">
となることを指しています(MTArchiveLinkは何らかの値に展開されていますがイメージです)。
なおXHTMLでは属性値("?"の部分)を省略できないようですのでこのようなフォーマットになっています。
というご説明でよろしいでしょうか。ご不明な点がありましたらサイドご連絡いただければ幸いです。
それではどうぞよろしくお願い致します。
うーん・・・。
selected属性をすることによって振る舞いがどうなるのかはわかったのですが・・・。
スキル不足で申し訳ありません。どうもうまくいかないようです。
また時間のあるときにチャレンジしてみます。
ありがとうございました。
早速試してみました。素晴らしくOKです(笑)。
御丁寧な解説にもかかわらず、無知なワタシはカテゴリーのところで少々試行錯誤を楽しんでしまいました(笑)。メインとサブと2カ所記述する必要があったんですね。サブの下に書いただけで「アレ?アレ??」と無意味な疑問符を周囲にバラまいておりました(恥)。
今回も実用的カスタマイズ&わかりやすい解説有り難うございます。
>198さん
こんばんはー。
いえいえ、とんでもありません。
別途こちらでも動作確認してみます。
>toycozyさん
こんばんはー。
ご利用ありがとうございます!
また毎度のブラウザ情報も感謝です。
Mac IE/SafariがOKでホッとしました(笑)。
こんばんわ。トラバとばせませーん(涙。
カスタマイズやったこと記事にしました。
>みよたんさん
こんばんはー。
記事ありがとうございます。
トラックバック受信できずすいません…。
めげずに設置1号目指してください!
setAttributeに関する質問です。
要素eのclass属性へ値をセットする場合、最近 e.className = ... とやってしまっているのですが、不具合の起こるブラウザはありますでしょうか。もし御存じでしたらよろしくお願いします_(._.)_
PS 年末の「折りたたみ」でのtoycozyさんとのやりとり(Mac+IEのpushの件)、やっとフォローしました。参考になりました。他にもダメな関数がありそうで不安です...。
>facetさん
こんにちは。
ご返事遅くなってすいません。
ご質問の件ですが、Windows環境でclassNameが有効にならないのは、Mozilla系のNetscape7.1/FireFox1.0です。IE6.0/Opera7.23は有効でした。
MacIEの件も参照ありがとうございます。以前の参照記事を失念しましたが
http://program.station.ez-net.jp/notes/common/267.asp
にも掲載されてました。
Mac IEの件、参考になりました。shift, unshift, push, popが全滅なんですね...。使わないように気をつけなければ。ありがとうございました。
ところで、本題ですが(記事と関係ないんですが^^;)、自宅の環境(Win XP SP2)で試してみたところ、Netscape 7.1, Firefox 1.0ともにe.className = '...';という書式で値がセットできてしまいました。
簡単なjavascriptを作ってアドレスバーに直書きしてテストした結果なので、なにか違いがあるのかもしれませんが...。
>facetさん
こんばんは。
どういたしまして。
ちなみに私が確認したOSはWindows2000(最新SP)です。XPは試していませんでした。情報不足ですいません。
ブラウザだけに依存するという訳ではないみたいですね。
Win2000でですか!?
Win98ならまだしも...IE...orz
うーむ。やはりユーザ関数作るべきですかね...
>facetさん
そうですね…。
面倒なのはたしかですが、どの環境でも動作する方が好ましいかと…。
こんばんはー。
いまさらなんですけど、「この選択されたアーカイブリンクを強調表示」が
やむやむではIEから見たときしか、有効になってないことに気がつきました。
Firefoxだと、強調表示されてません。yujiroさんのところは Firefoxでも
ちゃんと選択されたリンクが強調表示されています。なぜでしょう?
>さえらさん
こんばんは。
FIrefox1.03で拝見させて頂いています。
私の提供しているスクリプトにエラーがあるのかも知れませんので、別途調べてみます。
あと、上記とは別に、
uncaught exception: Window.innerWidth?
というエラーと、Shockwave Flashで「プラグインが不正な操作を実行しました」というダイアログが表示されました。最初のエラーはFirefoxのメニューバーの「ツール」→「JavaScriptコンソール」で表示されています。とりあえずご連絡まで(問題ないようでしたらお許しください)。
以上です。
それではどうぞよろしくお願い致します。
エラーがどういうことを指してるのか、わかりませ??ん。。。涙
具体的には、月別や カレンダーの日付からリンクしてる日別アーカイブでは、
Firefox でも ちゃんと、選択したアーカイブが 強調表示されています。
ダメなのが、カテゴリ一覧と、年間カレンダーに仕掛けたものが IEではOKなのに
Firefoxでダメです。お手間をとらせ申し訳ありません。
ツリー化したこととかが関係してるのかな、とか思っていろいろトライしてみたけどお手上げです。
>さえらさん
こんばんは。
こちらでも調べてみますのですいませんが少々お時間ください。
おはようございます。
リストのソースを改行を入れないで一行にしたら
Firefoxでも しっかり 選択されたアーカイブが強調表示されるようになりました。
どうもありがとうございました。
>さえらさん
こんばんは。
無事に直ったようで良かったです。
なお、このエントリーのサンプルがそのようになっていましたので、改行は削除しておきました(すいません…)。
yujiroさん、こんにちわ。
すいません、ちょっと質問なんですが
Monthly Archives を変更する場合の
if(nodes[i].innerHTML == a){
の"a"は"data"ではないんですか?
Categoriesのほうはうまくいったんですが何度やってもMonthly Archivesは強調表示されなかったんです。
そこで2つを見比べてみて、ここかな?と"data"に直してやってみたんです。
その結果うまく表示されたんですが、他のサイト様の覚書を見ても"a"のままだったんです。
勝手に試しておいて申し訳ないんですが教えてください。お願いします。
>やむさん
こんにちは。
ご利用ありがとうございます。
ご質問の件ですが、月別アーカイブについては英語表記の場合のカスタマイズ方法がもれてましたので追記致しました。
ご指摘ありがとうございました。
以上です。
それではよろしくお願い致します。
yujiroさん、こんにちわ。
いつもお世話になっております。
それから回答ありがとうございました。
なるほど納得!そういうことだったんですか?(´-ω-`)
英語表記と日本語表記では違うんですね。
何も知らずに、こんな質問ぶつけてごめんなさい人( ̄ω ̄;)
早速、直してきますε”ε”ε”ε”(ノ´・д・)ノ
|・ω・)ノありがとうございました!
>やむさん
こんばんは。
ご連絡ありがとうございました。
ではでは!
いつもお世話になっております。ひさびさのサイトリニューアルへ向けて、改めてこちらで紹介されている数々のカスタマイズ記事のお世話になっています。
この強調表示のカスタマイズですが、再構築の最後、インデックステンプレートのところで、“Can't call method "entry_based" on an undefined value at lib/MT/Template/ContextHandlers.pm line 4547.”というエラーが出てきます。MTのバージョンアップに伴いいろいろと変わった点もあるので、そのせいでしょうか。ただ、サイトでの動作は問題なく強調表示されているので、いまひとつ原因がつかめずにおります。
他の件も含め、相談ばかりで恐縮なのですが、是非ともアドバイスを御願い致します。
>toycozyさん
こんばんは。
ご返事遅くなってすいません。
ご質問の件ですが、月別アーカイブのリストには、全体を
<MTIf name="datebased_only_archive">
:
</MTIf>
で括り、カテゴリーリストは全体を
<MTIf name="category_archive">
:
</MTIf>
で括ってください。
特定のアーカイブで表示させるリストをメインページに適用させるとこのエラーが表示されるので、MTIf タグで表示するアーカイブを制限してください。
それではよろしくお願い致します。
お忙しい中お答えいただき有り難うございます。
いただいたアドバイスの通りやってみたのですが、やはり同じエラーメッセージがでてしまいます。module_monthly_archivesをdatebased_only_archiveに替えてみたり、MTIfタグを改めて挿入してみたりしたのですが、挿入位置を間違っているせいかうまくいかず・・・デス。
久々のMTカスタマイズに根本的な部分でミスっているような気もします(汗)。アドバイスいただければ幸いです。(今は配布テンプレに戻しています)
>toycozyさん
こんにちは。
1.1(のひとつめ)のリスト、および1.2のリストは、それぞれ下記の青色部分のようにMTIfタグを追加して再構築したところ、エラーは解消されました。
1.1
<MTIf name="datebased_only_archive">
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<MTArchiveList archive_type="Monthly">
<a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]<br/>
</MTArchiveList>
</div>
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var year = data.substring(0,4);
var month = data.substring(12,14);
var nodes = document.getElementById('monthlylist').getElementsByTagName('a');
for (i = 0; i < nodes.length; i++) {
var a = year + "年" + month + "月";
if(nodes[i].innerHTML == a){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
</MTIf>
1.2
<MTIf name="category_archive">
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<MTCategories>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a> [<$MTCategoryCount$>]<br />
</MTCategories>
</div>
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var nodes = document.getElementById('categorylist').getElementsByTagName("a");
for (i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML == data){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
</MTIf>
ということで、MTIf タグの位置を再度ご確認願えますでしょうか。
それではよろしくお願い致します。
お忙しい中早々に回答いただき有り難うございます。
アドバイス通りにしてみたところ、エラーは出なくなるのですが、メニューそのものが表示されなくなります。ワタシ自身、MT4用の配布テンプレの理解度がイマヒトツ低いためだとも思われるのですが(汗)、MTIfArchiveTypeEnabledといったタグを削除して、monthlyとcategoriesはddタグではなくdivでくくる(上記のソースのまま)という感じにしても、他のテンプレとの整合性とか特に問題はないでしょうか。それだとチョット気分的に・・・(笑)。今は再構築時にエラーになるものの、強調表示はされているので、MT4用の配布テンプレへのスクリプト追加にしています。
毎度御手数をお掛けし申し訳ありません。
>toycozyさん
こんにちは。
すいません。メインページでは表示させないといけないのでしたね。
下記のように、MTIf の開始タグを scritp 要素開始タグの前に移動してください。
また、マークアップをMT4配布テンプレートに合わせてみました。
<dt class="sidetitle">
Monthly Archives
</dt>
<dd class="side" id="monthlylist">
<ul>
<MTArchiveList archive_type="Monthly">
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
<MTIf name="datebased_only_archive">
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var year = data.substring(0,4);
var month = data.substring(12,14);
var nodes = document.getElementById('monthlylist').getElementsByTagName('a');
for (i = 0; i < nodes.length; i++) {
var a = year + "年" + month + "月";
if(nodes[i].innerHTML == a){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
</MTIf>
</dd>
<dt class="sidetitle">
Categories
</dt>
<dd class="side" id="categorylist">
<ul>
<MTCategories>
<li><a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a> [<$MTCategoryCount$>]</li>
</MTCategories>
</ul>
<MTIf name="category_archive">
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle encode_js="1"$>";
var nodes = document.getElementById('categorylist').getElementsByTagName("a");
for (i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML == data){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
</MTIf>
</dd>
上記は机上で修正したものですので、誤っていたらお手数ですが再度ご連絡ください。
MTIfArchiveTypeEnabled タグは、そのタグで指定するカテゴリーが存在するのであれば、削除してもらっても構いません。
それではよろしくお願い致します。
もしや・・・という予感で覗いてみたら最速回答が(笑)。本当に感謝デス。
無問題デス。再構築エラー無しに動作しております。挿入位置をアレコレと変えて試してはいたものの、スクリプト自体をMTIfタグで囲むという発想自体が出てきませんでした。仕組みの理解度は今以て・・???・・(笑)・・なのですが、とにかく迅速丁寧な御回答に改めて感謝です。
>toycozyさん
こんにちは。
ご連絡ありがとうございました。
無事に直ったようで良かったです。
ではでは!
いつもお世話になります。
別エントリーでの、月別アーカイブリストの表示についてのタグ追加をした際に気付いたのですが、月別アーカイブの強調表示が、昨年の分についてはOKなのですが、今年の分には適用されない状態になります。IE、Firefoxともに同様です。昨年、今年という違いではなく、ひょっとしたら月の桁数の違い?とも思ったのですが、対処すべき箇所に悩んでいるところです。
アドバイスいただけますと幸いです。
いつもお世話になります。
別エントリーでの、月別アーカイブリストの表示についてのタグ追加をした際に気付いたのですが、月別アーカイブの強調表示が、昨年の分についてはOKなのですが、今年の分には適用されない状態になります。IE、Firefoxともに同様です。昨年、今年という違いではなく、ひょっとしたら月の桁数の違い?とも思ったのですが、対処すべき箇所に悩んでいるところです。
アドバイスいただけますと幸いです。
>toycozyさん
こんばんは。
ご質問の件ですが、1月から3月のデータが適切に取得できていなかったようです。
ということで、script要素を下記の内容に入れ替えてください。
<script type="text/javascript">
<!--
var data = "<$MTArchiveTitle$>";
var year = data.substring(0,4);
data.match(/.*;(\d+)&#\d+/);
var month = RegExp.$1;
var nodes = document.getElementById('monthlylist').getElementsByTagName('a');
for (i = 0; i < nodes.length; i++) {
var a = year + "年" + month + "月";
if(nodes[i].innerHTML == a){
nodes[i].setAttribute("class","selectedlink");
nodes[i].setAttribute("className","selectedlink"); // for IE
}
}
//-->
</script>
それではよろしくお願い致します。
お忙しい中、有り難うございます。
早速入れ替えてみたところ、全く問題なく動作いたしました。
お手数をお掛けしました。
>toycozyさん
こんばんは。
ご連絡ありがとうございました。
無事に直ったようで良かったです。
ではでは!