JavaScriptには標準でtrim関数が用意されていません。
そのため、下記の様に独自にStrimgクラスを拡張する必要があります。
String.prototype.trim = function() {
return this.replace(/^[ \n\r\t]+|[ \n\r\t]+$/g, '');
}
が、Ext JSを使用すると、デフォルトでStringクラス拡張済みのようです。
続きを読む...
ユーザの入力内容や属性情報によって、動的に変化するFlashサイトを作れたら・・・便利ですよね?
PHPには、SWFを作成するためのMingと呼ばれるライブラリが用意されており、それを利用すると動的なムービーを生成することが可能です。
今回は、PHPとMingを利用して、swfを生成する方法を簡単にご紹介します。
(ただし、Mingを利用するには別途インストール作業が必要ですので、マニュアルを参考に環境を準備してください。)
続きを読む...
以前紹介した、Editable Gridを含め、Ext JSで作成した表では、各セルの値と別に画面上の出力を制御することが可能です。
「ユーザの入力内容を加工して表示」や「値によってフォントの色を変更」など、柔軟なインタフェースを提供できます。

続きを読む...
Ext JSのサンプル紹介講座第二弾です。
今回のテーマは「入力可能なコンボボックス」、選択肢から選択もでき、任意の値も入力可能なフォーム部品の作成です。
難しそうに聞こえるかもしれませんが、Ext JSを使えばとても簡単に作成可能です。
htmlには、前回と同様にExt JSのライブラリとCSSのパスの指定の他、formタグの中に以下の一行を追加するだけです。
<input type="text" name="color" id="combo_text">
そう、普通のテキストフィールドのinputタグを用意するだけなんです。
続きを読む...
携帯Javaアプリと言っても、まずキャリア毎にプロファイルが異なります。
SoftBankのS!アプリはMIDP+MEXA、auのEZアプリ、オープンアプリはMIDP、DoCoMoのiアプリはDojaです。そのため、基本的に同じプログラムを全キャリアで使用することはかなり難しいです。
(SoftBank・auに関しては、独自APIを使用しなければ同一プログラムの使用も可能)
今回はMIDPベースアプリの開発環境構築から簡単なアプリ作成までを取り上げます。
続きを読む...
今回は
ネタが見つからないので趣向を変えて、お気に入り書籍をご紹介したいと思います。
羽田野太巳著の「標準DOMスクリプティング JavaScript+DOMによるWebアプリデザインの基礎」です。
続きを読む...
前回は値の取得、トランザクションの使用方法などを記述しましたので、今回は
「SQL文で取得したカラムを変数にバインドする方法」、「SQL文内のパラメータに値をバインドする方法」を紹介します。
続きを読む...
今回は、本屋さんを徘徊中に発見して、非常に興味を持った本をご紹介します。
サイモン・シン著の暗号解読という本です。
続きを読む...
以前にこのブログでも紹介されていたExt.jsですが、なかなか続編が執筆されていないようなので、連載企画を乗っ取ってみました。
ということで、早速、Ext JS(バージョン:2.1)を使った簡単な例を紹介します。
今回のテーマは、「行をドラッグ&ドロップ可能な表」です。
今回利用したものは、Ext JSで紹介されているサンプルの中の"Editable Grid"というものです。
このサンプルでは、列をドラッグ&ドロップで移動することは可能ですが、行単位で移動を行うことはできません。
そこで、このサンプルをもとにして、行単位のドラッグ&ドロップが可能な表を作成します。
続きを読む...
数ヶ月ほど投稿が途切れていましたが、Zend Framework入門の続きを投稿したいと思います。
更新が止まっている間に Zend Frameworkの最新バージョンが1.5になりました。
今回の記事からは開発環境が以下のようになります。
開発環境: Zend Framework 1.5.1 / PHP 5.1.6
そこで、今日はZned Framework 1.5からUTF-8に対応するようになったZend_Pdfの紹介をします。
UTF-8に対応したということは・・・?
そう、日本語のPDFを作成できるようになったんです。
続きを読む...
Zend Framework Reference Guideの「9.5.3. 配列からの日付の作成」に以下のように書いてありました。
|
通常は、新しい日付インスタンスを作成する際には完全な形式の日付配列を渡します。 しかし、指定されていない項目があった場合は、 その項目の値はゼロとして処理されます。 つまり、たとえば hour を指定しなかった場合は 0 時として扱われるということです。
|
要するに、mkdate(0, 0, 0, 12, 14, 2007);のように、インスタンス生成時に「'hour' => 0, 'minute' => 0, 'second' => 0」と記述しなくてもいいというわけです。これは便利ですね。
ただ、ここでふと疑問がわいてきました。
「年月日を指定しなかったらどうなるんだろう?」
ということで、今回はその検証と、その他Zend_Dateの問題点を紹介します。
続きを読む...
システムを構築するときには必ずといってよいほど使われるのが日付関連関数。
今回はZend Frameworkの日付関数について紹介します。
まずは、現在の日時を表示させてみましょう。
require_once 'Zend/Date.php';
// デフォルトタイムゾーン(サマータイムがある地域はそれも適応される)
date_default_timezone_set('Asia/Tokyo');
$date = new Zend_Date();
print $date;
これだけで「2007/11/26 18:04:47」のように、'Y/m/d H:i:s'の形式で現在の日時を表示することができます。フォーマットを指定しなくてもデフォルトで決まった形式で日付データが出力できるのが良いですね。
でも、Zend Frameworkの日付関数はこれだけではありません。
他にも便利な機能が用意されているので見てみましょう。
続きを読む...
最近、JavaScriptのフレームワークを使って業務系アプリを構築することを一つの楽しみにしています。そんな中、Ext JS 2.0 に非常に興味が惹かれたので、じっくりと触ってみることにしました。というわけで、これから数回に分けて機能の説明などを行っていこうと思います。
Ext JS自体は、yui-extから派生してできたものらしいです。大きな特徴として、
続きを読む...
Zend FrameworkのAPIは大量にあるので、入門講座はまだまだ続きます。
今日のお題はZend_Sessionということで、セッション管理関連のお話です。
ただ、このライブラリーはまだ開発途上らしく、マニュアル上に「案を出したり実際に作成したりした場合は、メーリングリスト fw-auth@lists.zend.com にお知らせください。 」と記載があります。
セッション管理方法について、良い案があれば、ぜひメールをしてみてください。
今回紹介するSZend_Sessionですが、基本的な機能はPHPのSESSION関数と同じです。
ただ、下記に示すような追加機能があり、セッション管理がより安全になっています。
【追加機能】
1.「名前空間」機能
2.同じ名前のセッションを作成できなくできる
3.セッションをlockをし、読み取り専用にできる
4.セッション毎に有効時間を設定可能
では、実際にこれらの機能の使い方を見てみましょう。
続きを読む...
今回は珍しく
PHP のお話です。
PHP4のサポートが年内で終了するということで、
PHP4からPHP5への民族大移動が始まっている季節?なわけですが、
PHP4からPHP5に移行する際、注意点の一つとして、
オブジェクトのコピー方法が変わる、という話が取り上げられています。
続きを読む...
引き続きPDO関数について説明します。
今回は、SQL実行後のデータ取得を中心に簡単に紹介します。
続きを読む...
先月から紹介を始めたZend Frameworkですが、大事な部分を紹介し忘れていました。
Zend Framework のMVC(Model - Controller - View)モデルで基本となる、コントローラのお話です。
Zend Frameworkwを紹介するには、この記事を一番に書くべきでしたね。
前回、前々回紹介したZend_HttpやZend_Mailは、システム全体からみると小さなモジュールの一部ですが、今回紹介するコントローラは、アプリケーションの全体的な制御を行っている重要なプログラムです。
コントローラはシステム全体に影響してくるので、ディレクトリ構成やシステムの設置方法も簡単に紹介したいと思います。
続きを読む...
PHPのPDO関数を使ってみました。
PHPマニュアルにも記載されていますが、サンプルと簡単にまとめたものを掲載します。
データベースにはSQLiteを使用しました。
続きを読む...
久々の
アドエス(
Advanced/W-ZERO3[es] )上での
JavaScript ネタです。
今回は簡単な
Ajax アプリの実験をしてみます。
ということで、ガリガリとサンプルを作ってみました。
今回は
prototype.js と
scriptaculous.js の2つをモジュールで使用しました。
(これ使えば簡単だから)
続きを読む...
正式版がリリースされたばかりの「Zend Framework」、今回はメール機能の紹介です。
Zend_Mailはテキストメール、HTMLメール、添付ファイル付メールに対応しており、複数の宛先へのメール送信も簡単に行うことができます。また、送信・受信共に複数のプロトコルに対応しており、SMTP認証やTLS/SSLによるメール送信も可能です。
ただし、Zend_Mailで日本語のメールを取り扱う場合には、少し注意が必要です。
そこで、今回はZend_Mailを使った日本語のメールの送信方法を紹介します。
開発環境: Zend Framework 1.0.1 / PHP 5.1.6 (スクリプトの文字コード: UTF-8)
続きを読む...
2007年7月2日に正式版がリリースされた「Zend Framework 1.0.0」ですが、まだ本家サイトのマニュアルも、日本語サイトの情報量も少ない状況です。そんな中、このフレームワークの検証係を任命されたので、ソースコードを追いながら使い方を調査しています。
オブジェクト指向型プログラミングに慣れていないので、ソースコードを追うだけでも一苦労なのですが、マニュアルやソースを読んでわかったこと、実際にスクリプトを試し書きしてみてわかったことなどをちょっとだけ紹介したいと思います。
まずは、数ある Zend Framework API 群のなかでも、わかりやすく使いやすいと思ったAPIのひとつ、HTTP Clientの入門編です。
開発環境: Zend Framework 1.0.1 / PHP 5.1.6
続きを読む...
前回に引き続き、
MooTools のお話です。
今回は、
Json.Remote オブジェクトを使ってみます。
JSON とは、JavaScript Object Notation の略称で、
データ交換フォーマットの一つです。
名前からして、JavaScript専用であるかのように感じますが、
あくまでデータフォーマットなので、当然、他の言語でも使用できます。
データの簡単な例は↓です。
(例)
{"名前":"たわばがに", "職業":"へっぽこエンジニア", "好きな動物":"ネコ"}
当然ですが、階層構造にすることも可能です。
(例)
{
"たわばがに" : {
"職業" : "へっぽこエンジニア",
"好きな動物" : "ネコ"
},
"あべしえび" : {
"職業" : "へたれデザイナー",
"好きな動物" : "イヌ"
}
}
Json.Remote オブジェクトを用いると、サーバサイドのスクリプトと
JSON 形式のデータを
簡単にやりとりすることができます。
いつものごとく、簡単なサンプルを作成してみました。
続きを読む...
PHPでSWFの生成を行うには、Mingというライブラリを使用します。
MingはPHPの拡張モジュールなので、サーバに別途インストールをしないと使えませんが、このモジュールを使えば、ユーザが投稿したデータからSWFを動的生成することを可能にします。
今回、マリエール様のキャンペーンサイトでは、この技術を応用したシステム開発を行いました。
今回は
MooTools のAjaxオブジェクトに絞ったお話をしたいと思います。
MooTools は、軽量・高速がウリのJavaScriptライブラリです。
確かに、フルセットでダウンロードしても、180kbyte程度(V.1.11)しかないので、
用途限定で機能を絞り込めば、かなりスリム化できそうです。
さて、それでは簡単なサンプルを作成してみましょう。
続きを読む...
今日はPHPのマルチバイト対応正規表現ライブラリの検証レポート(UTF-8)です。
文字列の先頭と末尾の空文字を取り除く関数として、trim()がありますが、この関数はマルチバイトに対応していないため、全角スペースにも対応したmb_trim()を作成しようとしていました。
全角スペースについては、mb_ereg_replace()を使い、正規表現で除去しようとしていたのですが、スクリプトを書いてテストしてみるとなぜかうまくいきません。文字コードの指定もしてみたのですが、それでもうまくいきません。
いろいろ試したり、調べたりしていると、これはPHP4のマルチバイト対応正規表現ライブラリにバグがあるのではないかという疑いが出てきたので検証してみました。
続きを読む...
今日は珍しく、JavaScriptの話です。
JavaScriptを使用すると、クライアント(ブラウザ)側で処理を行うことができるので便利ですが、ブラウザによって動作が違うことがあるので厄介です。
ある案件で入力制御のJavaScriptを作成することになったのですが、InternetExplorerとFirefoxのonKeyに対する動作の違いで悩まされました。
onKeyupを使い、何か文字が入力されるたびにJavaScriptで処理をして、フォームの値に反映させようとしていたのですが、Firefoxではうまく作動するのにInternetExplorerだと何度テストしてもうまくいきません。
何が起こっているのかわからないので、フォームから受け取った値と処理途中の値、処理後の値などをすべて表示できるようにしてみました。
すると、こんなことがわかりました。
続きを読む...
久しぶりの投稿です。
今回は、xdebug2でglobal変数内の値を表示する設定を紹介させていただきます。
続きを読む...
前回からかなり間が空いてしまいましたが、今回も
JavaScript ネタです。
しばらく間が空いてしまったから、というわけではありませんが、今回から何回分かは、
先日発売された
WILLCOM の
Advanced/W-ZERO3[es] (型番WS011SH) (以降、
アドエス) で
JavaScript がどのように動くかを検証してみたいと思います。
まず、
アドエス上で使用するブラウザですが、
現状、
InternetExplorer Mobile、
Opera Mobile、
LunaScape Mobile の3つがインストールされている状態です。
とりあえず実験はこの3つのブラウザを使って行います。
アドエス編の第1回ということで、まずは簡単なものから試してみようと思います。
ということで、いつものごとく、サンプルを作ってみました。
続きを読む...
phpでは mb_convert_encoding を使うことで、文字のエンコーディングを変更することができる。SJISを使う場合などで、5C文字(エスケープ誤認識)の絡みもあって、一時的にエンコーディングを別の文字コード体系に変換し、再度変換をかけて元の文字コード体系に戻す処理もよく行う。
このような処理を行う場合で、気をつけなくてはいけないのが UTF-8 絡みの問題である。
続きを読む...
今日は社内ゼミの担当でSmartyについての発表をするので、ここに内容を少し紹介しておきます。
[今日のメニュー]
- Smartyのメリット
- 設置方法
- Smartyの使い方
- Smarty Tip
入門なので、導入から簡単な使い方までを説明します。
続きを読む...
研修期間も終わりに近づき、簡単な実案件を任されるようになってきました。
簡単な実案件=メールフォーム・・・最近はひたすらメールフォームばかり作っているような気がします。
案件ごとに項目数や項目内容、入力チェック項目などの仕様が変わるとはいえ、基本的には同じものを作っているので、毎回同じようなバグを出すわけにはいきません。回数を重ねるごとにバグの少ないメールフォームを作成し、最後にはバグのない状態でデバッグ屋さんに提出したいものです。
そこで、今回は「エンジニア泣かせのデバッグ」に対抗し、開発側の立場から今までの失敗点や注意点を振り返って、フォーム作成時のバグ撲滅対策を考えてみようと思います。
続きを読む...
PHPでいくつかの課題を終わらせ、先月よりSmartyというテンプレートエンジンを使い始めました。
最近は、やっと慣れてきて簡単なテンプレートの作成もできるようになってきたところです。
そこで、今日はSmartyを使って作ったテンプレートをひとつ紹介したいと思います。
ニュース一覧や掲示板、予定表などで多数のデータがあるときに、1ページに全部表示させると見難くなってしまいます。そこで、5件ごとや10件ごとなどのように指定の件数ごとにページを分け、リンクによって前のページや次のページに移動させるページ送りの機能があるのですが、それをSmartyで作ると下のようになります。
続きを読む...
ということで、今回は
JavaScriptの例外処理(エラー補足)に関して書いてみます。
うんちくは後にとっておくとして、まずは毎度おなじみ、サンプルから。
続きを読む...
今日は便利なサイトを見つけたのでその紹介をします。
紹介するのはタイトルの通り「PHP Cheat Sheet」です。
Cheat Sheet(チートシート)は日本語に訳すとカンニングペーパーですが、別にこのサイトは不正行為をするためのものではありません。今回紹介するチートシートとは、プログラミングをしていて、「あれ、これはどうなるんだったかな?」と思ったときに便利な情報が載っている、早見表のことですよ。
普通はプログラミングのCheet Sheetというと、使用できる関数の一覧だとか、オプションの一覧などが多いのですが、今日はちょっと違ったCheat Sheatを一つ紹介したいと思います。
ここで、突然ですが問題です。
if ($str) {
echo "true";
} else {
echo "false";
}
下の4つの値を上に書いた条件式に当てはめると、それぞれ何が表示されるでしょう?
また、条件を($str)から(isset($str))に変えたら、どうなるでしょう?
1. $str = 0;
2. $str = "0";
3. $str = "";
4. $str = null;
続きを読む...
ということで、三度、
JavaScriptのDOMスクリプティングネタです。
今回はイベントハンドラの操作に使う
addEventListener、
removeEventListener、
attachEvent、
detachEvent の「たとえばこんな使い方?」みたいなものを書いてみました。
まずは毎度おなじみ、サンプル。
続きを読む...
今週の課題はソケット接続であるサイトのHTMLを取り込み、そのなかから指定された部分の文字列を抜き出してくるというものでした。そこで、今日は初心者向けに正規表現の入門と豆知識を紹介したいと思います。
まず、正規表現を使って何ができるのかというと、ある決まったルールに当てはまる文字列を見つけることができます。例えば、「aで始まってeで終わる」というルールを決めると、"ae"とか、"apple"とか、"absolute"とか、ルールに当てはまるものは全部見つけることができます。このルールをさらに細かく決めていけば、自分が探している文字列を間違いなく探してもらえるというわけです。
次に、正規表現のルールを決めるときに使う記号について。
正規表現ではルールを決めるときに使う特殊な意味をもった記号のことをメタ文字と言います。
| メタ文字 |
意味 |
| ^ |
行頭に一致する |
| $ |
行末に一致する |
| . |
任意の一文字 |
| * |
直前文字の0回以上の繰り返し |
| + |
直前文字の1回以上の繰り返し |
| ? |
直前文字の0回または1回の繰り返し |
| {n} |
直前文字のn 回の繰り返し |
| {n,} |
直前文字のn 回以上の繰り返し |
| {n,m} |
直前文字n 回以上、m 回以下の繰り返し |
このぐらいは正規表現で検索すると、大体どこのページにも書いてあることですね。
でも、これだけの情報ではPHPのpreg_match()やpreg_replace()を使うときに困ったことになります。
例えば・・・
続きを読む...
ということで、今回は
JavaScriptのDOMスクリプティングネタです。
以前、さらりと
appendChild や
removeChild に関しては取り上げた気がするので、
今回は要素の複製に使う
cloneNode について書いてみました。
まずは毎度おなじみということで、以下のようなサンプルを作ってみました。
続きを読む...
script.aculo.us(Ajaxライブラリ)のSortable.createでonUpdateを使った際に、うまく動作しませんでした。
Sotable.createは、リストなどの要素をドラッグ&ドロップで並び替えできます。
調べた結果、Sotable.createを使う際、並び替えたい要素にidをふりますが、idのつけ方によってonUpdateが反応しない場合があるようです。
続きを読む...
「六曜付カレンダーを作る」の最終回です。
前回の記事では、「任意の日の旧暦は、その日の直前にある二分二至とそこから三回分の中気、及び五回分の朔を計算することで決定することができる。」ことを紹介しました。この方法を用いれば、閏月の挿入場所を比較的簡単に算出することができます。
しかし、この方法をそのままカレンダーに組み込むのには問題があります。
というのは、二分二至や中気、朔の計算方法が複雑なため、計算に時間がかかるからです。
任意の日の旧暦を求める場合には処理速度0.085秒程度なのであまり気になりませんが、これを一ヶ月分(28~31日分)繰り返すと2.5秒もかかってしまいます。カレンダーを開いたり、月を移動するたびに2,3秒もかかっていたのではストレスを感じてしまいます。
そこで今回は、前回紹介した旧暦計算スクリプトをカレンダーに応用する方法について紹介します。
続きを読む...
ということで、今回はJavaScriptのパターンマッチネタです。
比較するメソッドとしてmatch、search、test、exec、の4つを取り上げます。
それぞれ性質が異なるので、使う場合は注意が必要です。
比較のために、以下のようなサンプルを作ってみました。
続きを読む...
私の課題紹介「六曜付カレンダーを作る」の第二弾です。
まずは簡単に前回の復習を。
【前回のあらすじ】
六曜付カレンダーを作るためには旧暦の計算をしなくてはいけない。
旧暦計算をするためには新月と二十四節気の日付のデータが必要である。
旧暦を計算する問題点は・・・
1:閏月挿入箇所が変則的なので挿入箇所を決めるのが難しい
2:新月と二十四節気の計算方法が複雑なので計算に時間がかかる
以上、前回は六曜付カレンダー作成時の難関=「旧暦計算の問題点」を説明しました。
ということで、今回は上に示した旧暦計算の2つの問題点のうち、1番の閏月の挿入箇所の決め方を紹介していきたいと思います。
続きを読む...
ということで、今回はJavaScriptの小ネタです。
普段あまり意識していない部分に着目してみました。
【その1.戻り値指定なしのreturnは何も返していないのか?】
通常、関数でreturnを書く場合は何らかの戻り値を指定する場合が多いと思いますが、
もし戻り値を指定しなかった場合は、本当に何も返らないのだろうか?
ということで、実験してみました。
<script type="text/javascript">
<!--
// returnあり
function hoge() {
return;
}
// returnなし
function hogehoge() {
}
// 表示
function test() {
if (hoge()) {
alert("test1");
}
if (hoge() != "") {
alert("test2");
}
if (hoge() == undefined) {
alert("test3");
}
alert(hoge());
alert(hogehoge());
}
//-->
</script>
<input type="button" name="button" value="テスト" onClick="test()">
以下、結論。
実際にはundefined(未定義値)が返る。
returnを書かない場合も同じく、undefinedが返る。
なので、alertで表示されるのは、test2とtest3、そして最後の2つのundefinedとなります。
戻り値を指定しない場合は気に留めておいた方がよいかもしれません。
【その2.関数に不定の引数を渡した場合の扱いは?】
これに関しては、実験から結果を述べるのみとなります。
<script type="text/javascript">
<!--
function hoge() {
alert(arguments[0]);
alert(arguments[1]);
}
//-->
</script>
<input type="button" name="button" value="テスト"
onClick="hoge('おっす','オラ、たわばがに')">
以下、結論。
関数に渡した引数は、関数内のローカル変数(配列)argumentsに格納され、
arguments[0]やarguments[1]といった指定で引き出すことが可能。
なので、alertで表示されるのは、
arguments[0]とarguments[1]に格納された「おっす」と「オラ、たわばがに」となります。
以上、痒いところに手が届きそうなネタでした。
4月初めに入社し、開発部の新入社員として研修を始めたわけですが、基本構文を勉強した後にいくつかの課題をやりながらPHPの勉強を進めていっています。
先週の課題はカレンダー作成でした。
土日祝日までうまく表示できるようになり、完成!と思ったのもつかの間・・・
「じゃぁ、今度は六曜も表示させてね」という部長さんの一言で私のカレンダー製作は難関に。
続きを読む...
Ajaxのロード中に表示する画像を探していたら、アニメーションgifを生成してくれるサイトを
見つけましたので紹介します。
続きを読む...
Office 2007から、ファイル保存形式が変更になりました。
Excel 2007を例にとると、ファイルの拡張子が以下のように4文字に変更されました。
- xlsx: Excelブック
- xltx: Excelテンプレート
また、データ形式自体も変更になり、xlsxファイル自体はzipで圧縮されたファイルになっています。そのため、Windows付属のzipファイル等でファイルの展開を行うことも可能です。
zipで展開すると、
\docProps
\xl
\_rels
[Content_Types].xml
といったディレクトリ・ファイルがあることが分かります。
ちなみに、この中にあるファイルは、ほとんどがxml形式のファイルで、画像等のデータは\xl\media以下に実体のファイルとして保存されるようになっています。
このうち、docPropsディレクトリには、
\app.xml
\core.xml
の2つのファイルがあることが分かります(初期状態で)。
今回は、core.xml について解説します。
core.xmlは、ファイルの属性情報が保存されるファイルです。このファイルを編集することによって、さまざまな属性を設定することが可能です。具体的には、
| dc:creator | 作成者 |
| dc:lastModifiedBy | 前回保存者 |
| dc:title | タイトル |
| dc:subject | 表題 |
| cp:keywords | キーワード(Vistaではタグ検索に利用) |
| dcterms:created | コンテンツの作成日時 |
| dcterms:modified | 前回保存日時 |
| cp:lastPrinted | 前回印刷日 |
のような要素をいじれば、上記属性を変更することが可能です。
PHPでBasic認証を行うことができますが
PHP 5.1.0 以降であれば、PHPでDigest認証を行うことができます。
続きを読む...
ということで、相も変わらず、JavaScriptネタです。
今回は最近非常に気になっていた、ブラウザ毎に異なるキーイベントに関してです。
何らかの処理でキーボード入力を取りたい場合、
onKeyDown、onKeyPress、onKeyUP
のいずれかを使うと思いますが、普通に押した押してないを判別する程度だったら、
上記のどれを使っても特に影響はないと思います。
しかし、キーをずっと押し続けた状態を取る場合、
ブラウザ毎にかなり挙動が変わってくるので、要注意です。
以下、サンプルスクリプト(JavaScript + HTML)。
<html>
<head>
<script type="text/javascript">
<!--
var down = 0;
var press = 0;
var up = 0;
document.onkeydown =
function () {
document.getElementById("down").innerHTML = ++down;
}
document.onkeypress =
function () {
document.getElementById("press").innerHTML = ++press;
}
document.onkeyup =
function () {
document.getElementById("up").innerHTML = ++up;
}
//-->
</script>
</head>
<body>
down: <span id="down"></span>回;<br>
press: <span id="press"></span>回;<br>
up: <span id="up"></span>回;<br>
</body>
</html>
これを実行すると、以下のような結果になりました。
【Win IE】
キーボードを押し続けている間、keydown、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
【Win Firefox】
キーボードを押し続けている間、keydown、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
【Win Opera】
keydownはキーボード押し下げ時に1回だけ発生。
キーボードを押し続けている間、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
【Mac Safari】
keydownはキーボード押し下げ時に1回だけ発生。
キーボードを押し続けている間、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
【Mac Firefox】
keydownはキーボード押し下げ時に1回だけ発生。
キーボードを押し続けている間、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
【Mac IE】
キーボードを押し続けている間、keydown、keypressは連続で発生。
keyupはキーボードを離した際に1回だけ発生。
というように、なかなか複雑です。
Firefoxに関しては、Win版とMac版で動作が異なっています。
OSもちゃんと見ろ、ってことですね。
以上から、キーを押し続けた状態で変化が出てるのは onKeyDown と onKeyPress なので、
OS、ブラウザを判別して処理を適切に切り替えてやれば、動作の差異はなくせます。
以上、微妙にマニアックなJavaScriptネタでした。
ということで、
JavaScriptネタです。
とりあえず簡単なネタとして、今回は
createElementについて取り上げてみようと思います。
名前から推測できると思いますが、その名前の通り、エレメント(オブジェクト)を生成します。
ここでのエレメントというのは、HTMLのタグのことです。
spanやらdivやらimgやら、色々作れます。
createElementで作ったエレメント(オブジェクト)に
対しては、
setAttributeで要素を追加したり、
style.cssTextでスタイルの設定をしたりすることができます。
これらの追加要素は
appendChildで適用(表示を反映)することができます。
逆に
removeChildで消すことも可能です。
これを用いることで、HTMLと
JavaScriptで操作する要素を完全に切り分けることができます。
WEBデザイナさんからシステム用に加えておいたタグに関して、
「え~、このタグいるんですか? 表示に関係ないので、いらないと思って消しちゃいました~」
とか言われて顔を青くする、というようなことが減るかもしれません(笑)
で、サンプルとしてはこんなの↓。
この文字列をクリックすると、下に文字列が出るよ
この文字列をクリックすると、下に画像が出るよ
この文字列をクリックすると、文字列or画像が消えるよ
以下、ソース。
/**
* spanエレメント(オブジェクト)追加
*/
function displayString_createElement() {
var o = document.createElement("span");
o.setAttribute("id", "js_koneta_01-01");
o.innerHTML = "JavaScript万歳!";
o.style.cssText = "font-weight: bold;"
+ "font-size: 12pt"
+ "color: #00ff00";
document.getElementById("js_koneta_01").appendChild(o);
}
/**
* imgエレメント(オブジェクト)追加
*/
function displayImage_createElement() {
var o = document.createElement("img");
o.setAttribute("id", "js_koneta_01-01");
o.setAttribute("src", "images/js/analysis_back.jpg");
document.getElementById("js_koneta_01").appendChild(o);
}
/**
* エレメント(オブジェクト)消去
*/
function deleteElement_createElement() {
o = document.getElementById("js_koneta_01-01");
document.getElementById("js_koneta_01").removeChild(o);
}
サンプルでは書いていませんが、
document.body.appendChild(object);
というような、body自体を指定することも可能です。
ブラウザ内に絶対座標でオブジェクトを表示する場合などは、
こちらの方が使い勝手がいいかもしれません。
簡単ですが、こんなところで。
しゃいんブログ右下にある
「社長ブログとしゃいんブログの閲覧比率バトルJS(長っ)」
に関して、です。
まぁ、タイトルだけ見ると、普通は「この表示内容について怒られたのだろう」と考えるのが
自然ですが、実際は別の内容でお叱りを受けました。
サーバ管理人の「ぴ」氏から。
このJS、画像を無駄に使ってる上に、通常の画像ディレクトリと別のディレクトリに
画像を置いたため、ログが肥大化&カオス化して、解析ツール等で微妙に見にくくなって
しまっているようで‥‥。
(ファイル数の増加と共にログが増えてるから当たり前ですが‥‥)
ということで、とりあえずJSで使う画像は通常の画像ディレクトリに移しました。
といっても画像が多いのは変わらないままなので、
ログの肥大化は免れないと思いますが‥‥(汗)
そのうち撤去命令が出されそうな気のする、今日この頃。
JSといっても、今回はホントにネタのみでした。
といったところで、御粗末様です。
今回は、Yahoo! User Interface Library(YUI)を使ってカレンダーを作成する方法を紹介します。
続きを読む...
タイトル名を見て、ピンときた人はJavaScriptの通‥‥かもしれません。
で、何の話かと言いますと、社員ブログトップの上側でちまちま動いている謎の5人組(JavaScript)で動いてますのことです。
ただのアニメーションGIFでいいんじゃない?という気が激しくしますが、
無駄に、JavaScriptで実装してあります。
以下、無駄?な機能。
・HTML内でscriptタグでソースファイルを指定するだけで動く
・画面サイズを変更した場合、自動で配置調整
・人数追加が容易(追加してどうする?ってツッコミはなしで)
で、どう実装してるんだ?と思ったら、animation.jsを見てください。
非常に単純な構造ですので、イベントハンドラと関数が何なのか知ってる人なら、
すぐ理解できると思います。
window.onload = ~でメイン処理を呼び出し、あとはアニメーション処理用の関数をループさせてるだけですね。
難しいことは一切やってません(笑)
ということで、今後は、JavaScript専門で記事を書いていくつもりです。
徐々に難しい内容にステップアップしていく予定ですので、JavaScript好きな人は見てるとハッピーなことがある‥‥かもしれません。
(追記) とりあえず、これだけでは何なので、右下の方に社長ブログと社員ブログの閲覧状況が見れるように
JavaScript&
PHPで実装予定です。
ブログ公開までには実装できてるかな‥‥?(現状のお仕事状況次第(笑))
通常、ファイルダウンロード時にファイル名を指定するには、httpのヘッダ部で
Content-Disposition: attachment; filename="ファイル名"
とすることで、指定した「ファイル名」で出力することが可能である。
ただし、ファイル名を日本語で出力する場合は、SJISで出力してあげないと文字化けしてしまう。また、一般的にファイル名部分をURLEncodeしてあげることでも、文字化けせずに出力が可能である。
IE7(Internet Explorer 7)で日本語ファイル名でダウンロードする際に問題がある。ファイル名に「構築」や「予約」等の文字が含まれている場合、直接SJISで出力してあげると不可解な文字化けを起こしてしまう。たとえば、「構築」の場合は「構」の字が「浩」になり、「予約」の場合は「予」の字が「誉」になってしまう。
調査してみるとIE7のバグらしく、SJISで2バイト文字の2バイト目が「5C」「7C」になっている場合、IEが「5E」として認識してしまうらしい。まぁ、SJIS自体が制御コードと文字コード体系がかぶっており、特に「5C」で終わる文字は「5C文字」と呼ばれ、SJISで文字を扱う場合は非常に厄介なものです。
※ なので、ソースコードはUTF-8やEUCで記述するといいですよ。
IE7のSP1あたりで解消されるとの情報は得たが、それまで待ってもいられないので、当面ファイルのダウンロードにFirefoxを使えば文字化けはしないで済むことは分かった。がー。それでは負け組になってしまうので、なんとかしようと思っていろいろ試してみた。
1. SJIS出力をやめ、全部URLEncodeしてしまう。
この方法で解決するには解決するのだが、ファイル名が長い場合はIEが勝手にファイル文字列の先頭を無視してしまう。まぁ、URLEncodeすれば、通常2バイトで済んでいたデータが6バイト分も消費されてしまうので、当たり前と言えばそうなのだが…。
2. それなら…
文字化けする「5C」「7C」で終わる文字だけをURLEncodeしてしまえばよいのでは?という考えに立ち、実際に実装してみたところ…
うまく動きました。これにて一見落着!
総括:
奇妙なバグはやめてほしい(バグだからそういうものといえば、ねぇ…)