jQueryで別窓を開くリンクを自動で追加する。

XHTMLでは「target=_blank」は非推奨、いわゆる「別窓を開く」ことはユーザさんにまかせるのがいいので使っちゃいけない、ということになっています。

とはいえなければないで不便に感じることもある。ということで「target=_blank」の代わりに通常のリンクに別窓を開くリンクをくっつけるものをjQueryで作ってみました。

jQuery – 別窓を開く

$(function(){
if(!$.browser.safari) {
	$("a.openwindow").each(function () {
		owUrl = $(this).attr("href");
		owTxt = $(this).text();
		owLink = '&nbsp;<a href="'+owUrl+'" class="owimg" title="'+owTxt+'を別窓で開く"><img src="openwin.gif" alt="別窓で開く" /></a>&nbsp';
		$(this).after(owLink);
	});
	$("a.owimg").click(function(){
		window.open(this.href, '');
		return false;
	});
}
});

仕様はいたって簡単で、「openwindow」というクラス名がついたアンカータグのあとに、別窓を開くリンクを別途クラス名「owimg」を割り当て追加し、そのクラス名がついているアンカーがクリックされたら「window.open」で窓を開くといもの。「」をクリックするとjavascriptの「window.open」でページが開きます。

ちなみに「Safari」は処理を除外しています。「window.open」の「return false」がなぜか効かない。親のwindowもリンク先に飛んでしまいます…。なぜ…。いろいろ調べているとSafariではバコバコ落ちまくるサイトが多数(開いた瞬間に落ちるところも)あり、Safariのせいなのか、jQueryのせいなのか、その他の原因なのかが特定できずじまい…。ちょっと時間かかりすぎたので今日は断念。また調査してみなければ。

jQuery – CSSのclassを追加・削除する『 addClass() / removeClass() / toggleClass() 』

jQueryではCSSのclassを簡単に追加・削除することができます。classを操作する場合は『 addClass() / removeClass() / toggleClass() 』を使います。

//id=msgの要素にclass=redを追加する
$("#msg").addClass("red");
//id=msgの要素のclass=redを削除する
$("#msg").removeClass("red");
//id=msgの要素のclass=redがあれば削除、なければ追加する
$("#msg").toggleClass("red");

「addClass()」「removeClass()」は簡単かと思いますが、「toggleClass()」は指定したクラス名があれば削除、なければ追加するという「ONとOFFを切り替える仕組み(これをトグルといいます)」を持っています。

このトグルの機能はすごく便利で「メニューを開く/閉じる」みたいな動きが簡単にできてしまいます。

jQuery – addClass / removeClass / toggleClass サンプル

上記ページの「toggleClassのサンプル」は、「display: none」だけのクラス「hidden」を指定して「.toggleClass(“hidden”)」をクリックで動作させているだけです。

Javascript部分

… 省略 …
	$("#tCchk p.title").click(
		function(){
			$("#tCchk p.content").toggleClass("hidden");
		}
	);
… 省略 …

CSS、HTML部分

… 省略 …
.hidden {
	display: none;
}
… 省略 …
<div id="tCchk">
<h2>toggleClassのサンプル</h2>
<p class="title">クリックしてください。</p>
<p class="hidden content">表示されました!もう一度↑をクリックすると消えます。</p>
</div>
… 省略 …

ちなみに「toggle()」というメソッドもあり、わざわざ「hidden」というクラス名を追加しなくても同じ動作をさせることができます。

//class=contentが指定された要素の表示・非表示を切り替える
$(".content").toggle();

たったこれだけで「閉じる/開く」の機能を追加することができます。ちょっとメニューが長過ぎるかな、と思う方は「toggleClass()」を利用してチャレンジしてみてはどうでしょうか?

jQuery – style属性のプロパティの値を取得・追加『 css() 』

※タイトルが長い間「class()」となっていましたが、「css()」の間違いです。。。

フォントの色を変更する場合、HTMLに「style=”color: #CC0000;”」等の記述をします。jQueryでも「class()」style属性を操作できます。

//id=msgの要素のstyle属性のcolorの値を取得する
$("#msg").css("color");
//id=msgの要素のstyle属性にcolor:redを追加する
$("#msg").css("color":"red");
//id=msgの要素のstyle属性にcolor:redとbackground-color:000000を追加する
$("#msg").css({"color":"red" , "background-color":"000000"});

プロパティは一つだけでなく複数設定することができます。
1つの場合は「css(“プロパティ名”,”設定する値”)
複数の場合は「css({“プロパティ名”:”設定する値” , “プロパティ名”:”設定する値”})
と指定します。
, (カンマ)」「 { } (中括弧)」「 : (コロン)」の使い方に注意しましょう。

jQuery – css サンプル

またjQuery – css サンプルを「IE」と「Firefox」で見比べるとわかるのですが、IEでは値に指定したそのままの値「000000」表示され、Firefoxでは「rgb(0,0,0)」と表示が変わります。いろいろ試してみたのですが短縮プロパティ(border:1px solid #000000等)を指定するとMacのSafariでは値が取得できませんでした。

jQueryにはCSSのクラスを追加・削除できるメソッドも用意されています。「css()」を使うよりも、CSSでスタイルを指定してCSSのクラスを操作した方がいいかもしれませんね。