xul:textbox のプレースホルダー文字列
modest に投稿した記事と同内容です。
注意: この記事は Firefox 3.7 での新機能について触れています。
HTML のテキストボックス
Firefox 3.7a5pre では HTML 5 の仕様である placeholder
属性 が実装されており、以下のようにしてテキストボックスにヒント用文字列を表示させることができます。
<input type="text" placeholder="Your Name">
XUL のテキストボックス
一方、 XUL の textbox 要素では Firefox 3.0 にてすでに同様の機能が emptytext
属性として実装済みですが、 Firefox 3.7a5pre では placeholder
属性でもヒント用文字列を表示することができます。互換性維持のため emptytext
属性も引き続き利用可能ですので、 Firefox 3.6 と 3.7 両対応の拡張機能などでは emptytext
属性を使用したほうが良いでしょう。
<textbox emptytext="Your Name" />
<textbox placeholder="Your Name" />
また、以下のように xul:textbox 要素の emptyText
(大文字小文字に注意)および placeholder
プロパティを使って JavaScript で動的にヒント用文字列をセットすることも可能です。
document.getElementById(...).emptyText = "Your Name";
document.getElementById(...).placeholder = "Your Name";
一定時間ドラッグオーバーし続けたら処理を実行する
modest に投稿した記事と同内容です。
拡張機能(XULアプリ)にて、一定時間ドラッグオーバーし続けたときに何らかの処理を実行したい、例えばツールバーに配置したボタン上にブラウザタブを3秒間ドラッグオーバーし続けたら、そのボタンをクリックしたものとみなして処理を実行したいとします。
これは、HTML5のドラッグ&ドロップAPIを使い、ドラッグオーバーし続けた際に dragover イベントが繰り返し発生する特性を利用すると、以下のように実装可能です。
以下は、ボタン上に何かを3秒間ドラッグオーバーし続けると、テキストボックスに現在時刻を表示するサンプルです。なお、サンプルコード全量はこちらに置いてあります。 chrome 権限は不要ですので、ダウンロードして拡張子を.xulにしてFirefoxで開けば、動作確認可能です。
XUL:
<button label="Drag something over here for 3 seconds."
ondragenter="MyExtension.handleDragEvent(event);"
ondragover="MyExtension.handleDragEvent(event);"
oncommand="this.nextSibling.value += new Date() + '
';" />
<textbox multiline="true" flex="1" />
JavaScript:
var MyExtension = {
_dragStartTime: null,
handleDragEvent: function(event) {
event.preventDefault();
switch (event.type) {
case "dragenter":
// ドラッグオーバー開始時、ドラッグオーバー開始時刻をセット
this._dragStartTime = Date.now();
break;
case "dragover":
// ドラッグオーバー中、ドラッグオーバー開始時刻からの経過時間を調べる
if (this._dragStartTime && Date.now() - this._dragStartTime > 3000) {
// 3秒以上経過したら、ドラッグ開始時刻をリセットし、処理を実行する
this._dragStartTime = null;
event.target.doCommand();
}
break;
}
}
};
タイマーを用いた実装方式
ドラッグオーバー開始時(dragenter イベント発生時)に setTimeout
で一定時間後に処理を実行するためのタイマーを設定し、ドラッグオーバー終了時(dragleave イベント発生時)に clearTimeout
でタイマーを解除する、という実装方式ももちろん可能です。
XUL:
<button id="myButton"
label="Drag something over here for 3 seconds."
ondragenter="MyExtension.handleDragEvent(event);"
ondragleave="MyExtension.handleDragEvent(event);"
oncommand="this.nextSibling.value += new Date() + '
';" />
<textbox multiline="true" flex="1" />
JavaScript:
var MyExtension = {
_dragOverTimer: null,
handleDragEvent: function(event) {
event.preventDefault();
switch (event.type) {
case "dragenter":
// dragenterイベントが二回連続で発生した場合への対策
if (this._dragOverTimer)
return;
// ドラッグオーバー開始時にタイマーを設定
this._dragOverTimer = setTimeout(function() {
document.getElementById("myButton").doCommand();
}, 3000);
break;
case "dragleave":
// ドラッグオーバー終了時にタイマーを解除
clearTimeout(this._dragOverTimer);
this._dragOverTimer = null;
break;
}
}
};