カテゴリー : jQuery

jQuery 座標等取得メモ

ウィンドウのクライアント領域サイズの取得

幅:$(window).width()
高さ:$(window).height()

マウスクリック、移動時のハンドラ内で取得するマウス位置

$(selector).mousemove(function(e) {
    x = e.pageX;
    y = e.pageY;
}

リンク画像のサイズ

imgobj = new Image();
imgobj.src = "http://xxx.com/abc.jpg";
alert(imgobj.width + ' * ' + imgobj.height);

 

jQuery で HTML5 FilesAPI ファイルオブジェクトのプロパティにアクセスするには

今頃 HTML5 の緒に就いたところで恥ずかしいのだが、早速つまずいた。古籏氏の「File APIでブラウザーからローカルファイルを操作」という記事で、jQuery で試そうとした結果、半日つぶしてしまった。が、一つ賢くなった、と自分を慰めている。

お題は選択されたファイルのファイル名、サイズ、ファイル種別(MIME Type)を表示する JavaScript プログラムである。

<h1>ファイル情報を表示する</h1>
<form action="./test.cgi" method="get">
	<input type="file" id="myFile" />
	<input type="button" id="fileInfo" value="ファイル情報を表示" />
</form>
<div id="result"></div>
<script>
	document.getElementById("fileInfo").addEventListener("click", function(){
		var fileData = document.getElementById("myFile").files[0];
		var txt = "ファイルの名前 :"+fileData.name+"<br />";  // ファイル名
		txt += "ファイルのサイズ:"+fileData.size+"<br />";   // サイズ(Bytes)
		txt += "ファイルの種類 :"+fileData.type+"<br />";   // 種類(MIME Type)
		document.getElementById("result").innerHTML = txt;
	}, true);
</script>

FilesAPI では input 要素で file タイプを指定し、加えて「multiple」をアトリビュートに加えると、何とファイル選択で複数ファイルを選択する事ができるようになった。これで JavaScript などの力を借りなくても、一括転送できるようになった訳だ。

さて上のプログラムを jQuery に書き直してみる。

$(document).ready(function() {
	$("#fileInfo").click(function() {
		var fileData = document.getElementById("myFile").files[0];
		var txt = "ファイルの名前 :"+fileData.name+"<br />";  // ファイル名
		txt += "ファイルのサイズ:"+fileData.size+"<br />";   // サイズ(Bytes)
		txt += "ファイルの種類 :"+fileData.type+"<br />";   // 種類(MIME Type)
		$("#result").html(txt);
	});
});
</script>

で OK なのだが、「document.getElementById(“myFile”).files[0]」が気に入らない。ここは「$(“#myFile”)」と指定して、ファイルオブジェクトのプロパティにアクセスしたい訳だ。

さんざん調べて分かったのだが、「prop()」メソッドを利用してファイルオブジェクトの「files」プロパティにアクセスできた。

	var fileData = $("#myFile").prop('files')[0];

オソマツサマでした。

JavaScript のソース圧縮

カテゴリの jQuery とは直接かかわりがない内容です。JavaScript プログラムのソース圧縮ツールについてです。

Webサイトが少しでも華やかになるようにフラッシュが多用されることが多いですが、Google や jQuery のお陰で JavaScript が見直され、また JavaScript を使った開発の習熟度も上がり、頻繁に利用されるようになってきた感じを受けます(自分もその口ですが)。

ところで他人のブログを拝見していると、ロードする JavaScript のソースがあまりにも多く、読込みに時間が掛かっているのではないかと思われるようなサイトに、たまに出くわします。例えば WordPress のプラグインは、実際に使用しない場合でも JavaScript ソースを読み込むようになっているものもあります。

そんな訳で、オープンソースの JavaScript プログラムを利用させてもらうにしろ自分で作ったものにしろ、読込み時間を少しでも短縮したいと思い、JavaScript のソースを圧縮してくれるソフトを探して見ました。

ここでいう圧縮とは、zip や jpg のように、コード変換を伴うものではなく、空白やコメントなどを取り去ってサイズを小さくする機能を持ったものです。上図は左が圧縮前、右が圧縮処理後の例です。

変換はオンラインで圧縮できるサイトもありますが、ここでは自分の PC で動作するものにしました。

Microsoft Ajax Minifier 1.1 がそれです。

ダウンロードではソースコードが配布されているようですが、操作するだけですのでインストーラ付きの実行プログラムのものだけを利用するようにしました。

使い方ですが、Windows で動作させるソフトにしては珍しく、コマンド実行するタイプです。メニューから「Microsoft Ajax Minifier Command Prompt」を実行すると、下のようなコマンドプロンプト画面が表示されます。

実行は、

>ajaxmin ソースファイル名 /o 圧縮ファイル名

とすればOK。デスクトップにファイルを置いてある場合は、カレントディレクトリを変更してから実行すると指定が楽です。ajaxmin.exe への実行パスが環境に設定されているので、カレントを変更しても問題なく実行できます。

>pushd ¥users¥ログイン名¥desktop
>ajaxmin md5.js /o md5min.js

オプションに「/h」(hypercrunch mode)というのがあったので試してみたところ、サイズが半分ぐらいになりました。

サイボーズ光成さんの「md5.js」をお借りして試したところ、

ソースプログラム 35,778
通常の圧縮 22,563
/h を付けて圧縮 18,829

結果は上のようになりました。

ヘルプドキュメントをちらっと見たところ(英文なのでちらっとしか見れない orz)、使い方としてその他、統合開発環境の Visual Studio を使ってWebアプリケーションを構築する際、このモジュールを追加して自動で圧縮ソースを出力させたり、ajaxmin.dll を組み込んで他のアプリで利用できるようになっているようです。自分は Windows アプリケーションの開発からすっかり離れてしまったので、使う機会はないと思いますが。

jQuery UIダイアログで input から val() で値が取り出せない

はい、今日はこれで半日以上潰してしまいました… orz
発端は、Ajaxを利用してHTMLで戻ってきたフォームをダイアログウィンドウへ表示し、入力を取得しようとしたけどデータが取得できなかった、というものだ。

Ajaxは利用せず、それを簡略化したソースです。

<html>
<head>
<title>Test Dialog</title>
<link rel="stylesheet" href="css/redmond/jquery-ui-1.8.5.custom.css" />
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript">
get_name = function() {
	var md = $("<div><input id=\"name\" type=\"text\" value=\"\" /></div>");
	md.dialog(
	{
		modal: true,
		height: 100,
		width: 200,
		title: 'Input Dialog',
		resizable: false,
		buttons: {
			"OK": function() {
				alert($("#name").val());
				$(this).dialog('close');
			},
			"CANCEL": function() {
				$(this).dialog('close');
			},
		}
	});
}
</script>
</head>
<body>
<h1>UI Dialog Test</h1>
<input type="button" value="Fail Open" onclick="get_name()" /><br />
</body>
</html>

これは「Fail Open」ボタンを押すとダイアログが開き、入力域に文字を入れて「OK」をクリックすると、次のように入力した文字をアラート表示する、というものだ。

ところが続いて同じことをしても input にタイプした内容が表示されず、前回の値がそのまま表示されるのだ。

これだと、繰り返し利用することができない。頭が痛い~。

しかし、jQuery UI のデモサイトでは、同じようなことはおきていない。違うバージョンなどいろいろ試して見て、ようやくどうすればそうならずに利用できるか分かった。そのソースが次だ。

<html>
<head>
<title>Test Dialog</title>
<link rel="stylesheet" href="css/redmond/jquery-ui-1.8.5.custom.css" />
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript">
get_good_name = function() {
	$("#input_dialog").dialog(
	{
		modal: true,
		height: 100,
		width: 200,
		title: 'Input Dialog',
		resizable: false,
		buttons: {
			"OK": function() {
				alert($("#good_name").val());
				$(this).dialog('close');
			},
			"CANCEL": function() {
				$(this).dialog('close');
			},
		}
	});
}
</script>
</head>
<body>
<h1>UI Dialog Test</h1>
<input type="button" value="Good Open" onclick="get_good_name()" />

<div id="input_dialog" style="display:none">
	<div>
		<input type="text" id="good_name" val="" />
	</div>
</div>

</body>
</html>

見ての通り、違いは「<input type=”text” />」を予めHTMLソースに忍ばせておくか、JavaScriptで追加するかだ。今のところ動的に追加したtextタイプでは、入力された値は正常に取り出せないようだ。

ただし同じ動的なinputでもradioタイプでは、valueで指定した値をval()で正しく取得できた。

jQuery 1.4.2 jQuery UI 1.8.5

吹き出しを表示するツールチップ

ブログの記事や、自分の場合では Webアプリケーションなどで、その言葉やカラムが何を意味するのか説明を加えたいときがある。プログラムで一覧表など作っている場合は、特にそのID(数字)がどのテーブルデータにリンクしているのか、リンク先データの名前を示したい。が、画面サイズは限りがあるので、一覧表に何でもかんでも掲載できない。

そのような制約がある中で、マウスカーソルをその上に置くと吹き出しとなって表示する、ツールチップと呼ばれる機能が重宝する。情報量が多い場合は Ajax を利用する方法もあるが、そこまでする必要がない場合はツールチップが役に立つ。

で、何か気のきいた jQuery プラグインを利用してその紹介記事を、と思ったのだ。が、試しているうちにツールチップの表示は、どうやらブラウザがデフォルトでその機能を有しているのではないか?という事に思い当った。

と言うのも、HTML タグに title 属性を追加することで、div のようなブロックタグでも、span のようなインラインタグでもツールチップを表示するからである。これは、HTML では一般的なのだろうか?

お恥ずかしい事に、title 属性をあまり意識して使っていなかった。これからは是非利用させていただこう。

あなたのブラウザで、上の太字の「ツールチップ」にマウスカーソルを置いて説明文が表示されるか、試してみて下さい。