Log4jsのFileAppenderを発見。なるほど、ローカルに書き出しはこうすればよいのか。
こちらで、富田さんがブラウザからのローカル保存に触れられていたので興味はあったけど、今までやり方が分からなかった。ちなみに、こんなこともできるらしい。
業務系Webアプリでファイルアップロード後にローカルファイルを削除する
Log4js.FileAppender = function(file) {
this.layout = new Log4js.SimpleLayout();
this.isIE = 'undefined';
this.file = file || "log4js.log";
try{
this.fso = new ActiveXObject("Scripting.FileSystemObject");
this.isIE = true;
} catch(e){
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
this.fso = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
this.isIE = false; //mozilla & co
} catch (e) {
log4jsLogger.error(e);
}
}
};
Log4jsはシンプルで実によくまとまっている。prototype.jsからコピーしたと思われる、継承(extend)、bind、それからattachEventがあるだけだ。実際これで基本的なことは大抵できる。
$()も放棄してシンプルに実装している点も感心である。JavaScriptアプリはライブラリをインクルードしないでコンパクトにする、こういったコピペスタイルが流行ってくるのではないだろうか。
追記:というわけで、短いライブラリを作ってみた。=>とっても短いAJAXライブラリ extractive.js
/**
* Object extention (OO) methods if no prototype avaliable.
*
* @private
* @ignore
*/
if(!Object.prototype.extend) {
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
};
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]);
};
}
/**
* Define bind if no prototype available.
* @private
* @ignore
*/
if(!Function.prototype.bind) {
/**
* Functions taken from Prototype library,
* didn't want to require for just few functions.
* More info at {@link http://prototype.conio.net/}
* @private
*/
Function.prototype.bind = function(object) {
var __method = this;
return function() {
return __method.apply(object, arguments);
};
};
}
/**
* Attatch an observer function to an elements event browser independent.
*
* @param element element to attach event
* @param name name of event
* @param observer observer method to be called
* @private
*/
attachEvent: function (element, name, observer) {
if (element.addEventListener) { //DOM event model
element.addEventListener(name, observer, false);
} else if (element.attachEvent) { //M$ event model
element.attachEvent('on' + name, observer);
}
}
0 件のコメント:
コメントを投稿