高度なブラウザー機能を検出する自己完結型の JavaScript ユーティリティ オブジェクトを作成しています。理想的には、私のオブジェクトは次のようになります。
Support = {
borderRadius : false, // values returned by functions
gradient : false, // i am defining
dataURI : true
};
私が現在抱えている問題は、dataURI サポートを検出するWeston Ruter のサイトから採用しているコードを扱っています。javascript を使用して dataURI ソースで画像を作成しようとし、onload/onerror コールバックを使用して幅/高さをチェックします。onload は非同期であるため、スコープを失い、true/false を返しても、オブジェクトに true/false が割り当てられません。
これが私の試みです:
Support = {
...
dataURI : function(prop) {
prop = prop; // keeps in closure for callback
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
prop = false;
}
prop = true;
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
return -1;
}(this)
};
私は匿名関数をすぐに実行し、これを渡します (これが Support.dataURI への参照であることを望んでいました) が、残念ながらウィンドウ オブジェクトを参照しているため、値は常に -1 です。外部で定義された関数を使用して Support オブジェクトの作成後に値を代入することで機能させることができます...しかし、その方法はあまりきれいではないと思います。それを自己完結させる方法はありますか?オブジェクト リテラルの関数は、割り当てられたプロパティを参照できますか?
編集--------------------------------------------------
私の質問に対する正確な回答ではないので (言い回し)、私は'追加の回答を投稿するつもりはありませんが、...オブジェクトリテラルの代わりにシングルトンオブジェクトを使用することにしました。作業コードは次のとおりです。
Support = new function Support() {
var that = this;
this.dataURI = function() {
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
that.dataURI = false;
} else {
that.dataURI = true;
}
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
return that.dataURI;
}();
};