IEでもplaceholderが使えるようにするのにjQueryが便利だった。

全てのブラウザでplaceholderが効くソースを書く必要があったので、その備忘録です。

ありがたやー、ありがたやー、jQueryに感謝です。

本当は「placeholderが使えないブラウザでも」という意味で、
[JS]HTML5の「プレースホルダーテキスト」をスクリプトで実装する旧式と今時の方法 | コリス
のように、「modernizr.js」を使ったほうがより一般化されるのですが、
どうせ該当するのはIE(とIEライクなLunascape、Sleipnirなど)なので、スクリプトの簡略化として「IE以外」としました。


以下、ソース。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript">
if(navigator.userAgent.toUpperCase().indexOf("MSIE")>-1){
	$(function(){
		onload=function(){
			$("input[type=text]").each(function(){
				$(this)
				.addClass("IE_placeholder")
				.val($(this).attr("placeholder"))
			});
		} 
		$("input[type=text]").each(function(){
			if($(this).val()==""){
				$(this)
					.addClass("IE_placeholder")
					.val($(this).attr("placeholder"))
			};
			$(this).focus(function(){
				if($(this).attr("class")=="IE_placeholder"){
					$(this).val("");
				}
				$(this).keydown(function(){
					$(this).removeClass("IE_placeholder");
				});
			});
			$(this).blur(function(){
				if($(this).val()==""){
					$(this)
					.addClass("IE_placeholder")
					.val($(this).attr("placeholder"))
				}
			});
		});
	});
}
function confirm(){
	var message="";
	var answer="";
	for(i=0;i<$("span[name='question']").length;i++){
		if($("input[type=text]").eq(i).attr("class")=="IE_placeholder"){
			answer="[無記入]";
		}else{
			answer=$("input[type=text]").eq(i).val();
		}
		message=message+$("span").eq(i).text()+answer+"\n";
	}
	alert(message);
}
</script>
<style type="text/css">
.IE_placeholder{
	color:#ccc;
}
</style>
</head>
<body>
<p>
	<span name="question">好きなヴォーカリスト:</span>
	<input type="text" value="" placeholder="例)ラッセル・アレン" />
</p>
<p>
	<span name="question">好きなギタリスト:</span>
	<input type="text" value="" placeholder="例)ジョン・ペトルーシ" />
</p>
<p>
	<span name="question">好きな指揮者:</span>
	<input type="text" value="" placeholder="例)ゲオルグ・ショルティ" />
</p>
<p>
	<input type="button" value="確認" onclick="confirm();" />
</p>
</body>

簡単にメモしておくと、

4行目

jqueryの呼び出し

6~38行目

IEなら~

8~14行目

初期化。これをしないとF5を押したときに、placeholderでなくなってしまうorz 「戻る」を押したときも初期化してしまうのでやりたくないのですが、、、

15~36行目

それぞれの<input type="text" ~ >に対し、

16~20行目

入力されていない(valueがnullの)場合は、placeholderの値をvalueに。ただしこの時のvalueは表示用のニセモノなので、判別させるために「IE_placeholder」というクラスを与える。

21~28行目

フォーカスがあたったとき、

22~24行目

placeholder表示の場合は空欄にして、

25~27行目

一旦「IE_placeholder」を解除。

29~35行目

フォーカスが外れたとき、

30~34行目

やはり無記入だったら

31~33行目

また「IE_placeholder」のクラスを与えてinputのvalueにplaceholderの値を



で、データを送信する際、valueがニセモノの値を持っているときはそのまま送ってはならないので、処理。
サンプル(入力してください)として、「確認ボタン」で確認するスクリプトを作ってみました。

39~51行目

「確認ボタン」を押したときの処理

40~41行目

初期化。

42~49行目

入力項目回数だけ繰り返し。eachでも書けそうだけどうまくいかなかったのでforを使いました。

43~45行目

(i-1)番目のvalueの値がplaceholderから持ってきた場合のとき、

44行目

メッセージ用の値を[無記入]とする。

45~47行目

それ以外(valueの値が、入力されたもの)の場合、

46行目

そのまんまの値をメッセージ用に使う。

48行目

メッセージを作成。

50行目

メッセージの表示。

53~57行目

placeholderの場合の色の設定。スクリプト内に「$(".IE_placeholder").css("color","#ccc")」と書くとうまくいかなかったのでスタイルシートにしました。

サンプル(入力してください)

好きなヴォーカリスト:

好きなギタリスト:

好きな指揮者:

急いで書いたので、間違いがあるかも。
追記)ブログにすると、テンプレート内のタグの兼ね合いで、やはりうまく行きませんでしたorz
面倒くさいのでそのまま放置。→でも気持ち悪いので直しました。
さらに追記)無記入の場合、[無記入]となるのはIEの時だけですね。面倒くさいので放置。6と38行目を消せば良いだけなんですが、、、

Filed under: ★Web制作関係  タグ: , , , , , , , , , , , ,   charlie432 23:41  Comments (0)

ロンドンでのトラブル諸々(1)

時間がないので手短に書きます。

一つ前の投稿の続きです。

初めて来たロンドンで、まったく地理が分からない状態なので頼りにしているのは地下鉄の路線図とiPhoneのGoogleマップ。

朝、ホテルを出るときに「現在地」を「お気に入り」に登録し、迷子になったら地図を見ながら歩くなり、人に聞くなりして帰れる、、、予定でしたが、

iPhoneのバッテリーが気づいたら切れていた!

んです(´Д`)

早めに電源を切ってバッテリーを確保するつもりでしたが、いろいろ調べることが多くて。コンセントを貸してくれるところもありませんでした。

で、ライヴからの帰り、朝来た道順をおぼろげな記憶をたどって帰るしかないんですが、最寄駅に着いたのは夜中の0時30分。

ホテルに帰るには地下鉄の駅からバスに乗らねばなりません。こちらは深夜までバスが走っているものの、次の0時50分の最終を逃したら残される選択は歩きのみ。

あ、もう出発しなければならないので続きは後ほどに。

外出中、iPhoneはなるべく使わないようにします。



Filed under: ★徒然  タグ: , , ,   charlie432 19:03  Comments (0)

(CSS)floatは「回り込み」ではないことと、IE, Operaのバグ

floatは「回り込み」ではないが分かりやすかったので、それに従ってfloatの概念を振りかえってみました。

floatとは文字通り「浮く」というイメージで、さらに分かりやすくいうと

通常の流れから取り除く(まるでそれが存在していないかのように)。このとき、
  1. フロートに重なるブロックボックスはフロートの背面に隠される(フロートの背景が透明なら、背面のブロックボックスが透けて見える)
  2. ただし、行ボックス(テキストの1行が入るボックス)はフロートと重ならないように幅が縮む

2番目の「テキストは幅が縮む」のがあたかも「回り込み」をしているように見えるのですが、ボックス自体は回り込まないのが正しい(「仕様書どおり」という意味。以下、「正しい」という言葉を同じ意味で使います)floatの理解だということが、Sample1で分かると思います。

======= Sample1 =======

CSS↓

#test20110627sample01 .aa {
	width:50px;
	height:50px;
	background:#fcc;
	float:left;
}
#test20110627sample01 .bb {
	width:200px;
	height:100px;
	background:#ccf;
}

html↓

<div id="test20110627sample01">
	<div class="aa">あいうえおかきくけこ</div>
	<div class="bb">さしすせそたちつてと</div>
</div>

結果↓(ブラウザ依存)

あいうえおかきくけこ
さしすせそたちつてと

↓↓ Firefox, Google Chrome, Safari, Lunascape ↓↓

sample1_Firefox

↑これが正しい表示

↓↓ Opera ↓↓

sample1_Opera

↑Operaはボックスが「回り込んで」しまっています(バグ)

↓↓ IE ↓↓

sample1_IE

↑さらにIEでは、ボックス間に隙間ができてしまっています。それに加え、「内容物に応じてボックスの幅・高さが押し広げられる」バグが見られます。この場合、ピンクのボックス(aa)の縦が50pxより大きくなっています。

普通は、上のOperaのような表示が欲しくてfloatを使うことが多いと思いますが、このブラウザ間の差異を解消するためには、紫のボックス(bb)の左にマージン(この場合、例えば50px)を与えてやれば、解消できます。

ただ、

ブログでよくあるような段組レイアウトを実現するためにfloatが使われていますが、これはフロートの振る舞いの厳密な規則にあるように、「左フロートにつづく左フロートは、先の左フロートより右側になければならず(右フロートの場合は左右逆に読み替え)、フロートは可能な限り上に配置しなければならない」という規則を利用しているのです。だから、左右のカラムの両方にfloatを指定するわけです。

とあるように、紫のボックス(bb)にもfloatをかけるのが一般的でしょう。すなわち、

======= Sample2 =======

CSS↓

#test20110627sample02 .aa {
	width:50px;
	height:50px;
	background:#fcc;
	float:left;
}
#test20110627sample02 .bb {
	width:200px;
	height:100px;
	background:#ccf;
	float:left;
}

html↓

<div id="test20110627sample02">
	<div class="aa">あいうえおかきくけこ</div>
	<div class="bb">さしすせそたちつてと</div>
</div>

結果↓(ブラウザ依存)

あいうえおかきくけこ
さしすせそたちつてと

 

↓↓ IE以外 ↓↓

sample2_Firefox

↑正しい表示

↓↓ IE ↓↓

sample2_IE

↑この場合、ボックス間の謎の余白も消えます。ただし、「内容物に応じてボックスが押し広げられる」現象は依然として見られます。

なお、「さしすせそたちつてと」の部分をもっと長い文章にしたら、ピンクの下辺以下の表示は、Sample1では文字が左側に流れ込み(はみ出た「あいうえおかきくけこ」と重なる)、Sample2では長方形の領域に文字が埋まります。IE、Opera の場合はどちらも長方形で、IEではさらに、文字の長さ分に応じて紫色のボックスが広がります。

ここで、floatは「回り込み」ではなく「浮く」という意味に近い、ということを念頭に、

中身が全部 float だったら、そのボックスは「空」と解釈できるで、ボーダーで囲っても float した要素を囲むことはない

と予測できる、つまり height=0 になるはずですが、Opera と IE ではボックスに width を与えると float した要素に応じて height が生ずるというバグが見られます。

======= Sample3 =======

CSS↓

#test20110627sample03 .aa {
	border:1px solid #c00;
	width:300px;
}
#test20110627sample03 img {
	float:left;
}

html↓

<div id="test20110627sample03">
	<div class="aa">
		<img src="http://static.zooomr.com/images/9981709_da89ac0c92_m.jpg">
		<img src="http://static.zooomr.com/images/9981710_32a843d334_m.jpg">
	</div>
</div>

結果↓(ブラウザ依存)


↓↓ Firefox, Google Chrome, Safari, Lunascape ↓↓

sample3_Firefox

↑これが正しい見え方。横幅300px、高さ0pxの赤い罫線が上に見えます。

↓↓ Opera ↓↓

sample3_Opera

↑Opera のバグ

↓↓ IE ↓↓

sample3_IE

↑さらに IE では、画像周り(横方向)に余白が生じています。

ということで、float と仲良くするには「回り込みではない」という理解と IE のバグを知ることが大切になるのだと思いました。

Filed under: ★Web制作関係  タグ: , , , , ,   charlie432 00:00  Comments (0)
    2012年5月
    « 4月    
     123456
    78910111213
    14151617181920
    21222324252627
    28293031