【info】有料サポート(ベータ)限定 承り中 /【JSサポート(仮称)】
【費用】 とりあえず、言い値で承ります。ただし、できる範囲での限定受付です。込み具合等によりお受けできない場合がありますのであらかじめご了承ください。サポートにご納得いただけなければ料金は不要です。 逆に感動したら多くても構いません(^^;;;。
【できること】 たとえば、かも日記で無料配布されているコードのカスタマイズや、あるいは、JavaScript/Ajax全般+Webサーバーとの連携などのアドバイス&サンプル作成等 。A:jQchartなどでWeb用グラフ設置(エクセル→CSVやデータベースからWebグラフ生成)などのアドバイスやカスタマイズサンプル作成。B:ツリーメニューなどのカスタマイズサンプル。C:Google Mapsのカスタマイズ。etc...
【できないこと】 腕立て伏せ200回
【ライセンス】 私が今まで「かも日記」等で提供してきたコードの大半は、商用利用、改造、自由、連絡不要で、今後もそれらは変わりません。そして、この有料サポートによりカスタマイズコードなどが提供される場合でも、同様に、それらを商用利用しても改造しても自由です。ただし、制限のきついライブラリなどを使う場合は、各ライブラリのライセンスに準拠せざるを得ない場合があります。
【info】いつもいろいろなテストなどをページ内のあちこちでやっているので、重かったり、壊れていたりするf^^;ことも多いですが、何卒、ご了承ください ( _ _ b
<script>
var colorOj;
function ColorName2Code140(oj){
colorOj=oj;
alert("orangeは、"+colorOj['orange']);
};
</script>
<!-- ここで読み込む -->
<script src="./colorname2code140.js"></script>
当然ながらPublic Domainですが、間違いがあったらごめんなさい。例によって、切り貼りもかまいませんし、連絡も不要ですが、使う場合はスクリプトを自分のサーバーに置いてください。そろそろjsgt.orgもいっぱいなので。
コメントを書ける場所についての覚書で、XHRのリクエストヘッダでRangeを使って、ファイルの先頭に書いたコメントを読むという検討をしましたが、このテクニックは、実際に、どの程度有効なのか?を押さえておきます。
http://jsgt.org/lib/ajax/051/test/test_setHeader_range_bench.htm
約2Mのファイルを、Rangeをセットして200バイトのみAjax読み込みする場合と、0バイト目以降を全部読み込む場合、そして、普通にファイル全部を読み込む場合の三通りで処理時間を計測しました。
ちなみに、LAN接続+Win XP IE6+Pentium4 2.6G+2GRAM では、下記の結果でしたので充分に効果はあるといえると思います。
追記:2006.12.7
上記は静的.txtファイルでの計測でしたが、php、perlからのベンチも試してみました。phpでは、効果が逆転していることが要注意です。(p.s. PHPの設定は、チューンナップをしていません)
#しかし、.txtで15/1000秒に対して、.phpで421/1000秒という違いは大きいですね。。。やはり、まめに静的ファイル化すると幸せがくる?かなぁ。
#とりあえず今日の結論::リクエストヘッダにRangeを使用した、データの部分取得では、.txtや.htmlなどの静的ファイルを対象とすると、取得データ量に見合った、パフォーマンスアップを期待できる。PHPやPerlなどを介するケースでは、逆に、遅くなるケースもあるので要注意。
右のBBSのスパムがひどいですね。
http://blog.drecom.jp/naito/archive/319#comments
みたいに、数字を入力しないと書き込めないようにすると少しはへるのでしょうかね。
JavaManさんおひさしぶりです。スパムはきりが無いので、多少対策した後、放ってあったのですが、このBBSでの放置は、やはり、気になりますか、、、f^^;。
<!--{data1:xxxxx,data2:xxxx,data3:xxxxx,...}-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
<html>
:
ようするに、こうすると、たとえば、
oj.setRequestHeader("Range","bytes=0-199");
これだけで、ファイルの先頭200バイト分だけを、Ajaxで取ってきて、いろいろに利用ができるわけです。(このワザは、Operaは駄目ですが、IE,Firefox,Safariで使えます)
最後のリンクにも書いてありますが、コメント中には「--」を書くことができません。なので、XML、HTML 的に valid なまま JSON をコメントに直接書くのは無理です。データが限定されているとか、いちいち encode, decode してもいいというのなら、別ですが。
た ( 2006年12月03日 10:55 )--が使えないのは、当たり前なので、そういう使い方、ということで、まぁしょうがないかな、と思います。どうしても使いたい時は、使いたい側の都合でエスケープでもすればよいわけで、HTMLやXMLは関知しないことになってるわけですし。
た ( 2006年12月03日 11:18 )で、書ける場所ですが、XMLの場合は、ドキュメント宣言だけではなくて<?xml で始まるXML宣言が「文書先頭」に必要なので、これは許容しないといけないかも。
た ( 2006年12月03日 11:39 )あと、utf-8でBOMを付けたときには、3バイトずらす必要があります。まぁ、有る程度ざっくり受け取って、スプリッタで切り出すとかで良いとは思いますが。
た ( 2006年12月03日 16:19 )それから、使えない文字としては、「--」の他に、「<」 と「>」は、実装が許してくれない可能性があります。ということで、もし、実体参照にするなら、「– 」は–か– 、「<」は< か < 、 「>」は> か > かなぁ。encode/decodeURIComponentでやっといた方が簡単かな?
document.getElementById('onaziName').style.visibility='visible';
document.getElementById('onaziName').style.zIndex=z;
document.getElementById('onaziName').innerHTML='うんぬん';
しかし、ソースの文字数がそのまま、ネットワークやサーバーの負荷にも影響してしまうJavaScriptとしては、普通は、こういう種類の冗長さはいただけません。
with(document.getElementById('onaziName')){
style.visibility='visible';
style.zIndex=z;
innerHTML='うんぬん';
}
あるいは、関数やメソッドの戻り値としてセットすることで省略する方法もあります。
function getE(){return document.getElementById('onaziName');}
getE().style.visibility='visible';
getE().style.zIndex=z;
getE().innerHTML='うんぬん';
また、たとえば、オブジェクトのインスタンスとしてセットする方法もあります。
function GetE(){this.e=document.getElementById('onaziName');}
var e=new GetE();
e.style.visibility='visible';
e.style.zIndex=z;
e.innerHTML='うんぬん';
さらに、単純に変数へ代入してショートカットを作る方法もあります。
var e=document.getElementById('onaziName');
e.style.visibility='visible';
e.style.zIndex=z;
e.innerHTML='うんぬん';
これら以外にもいろいろな方法はあるわけですが、速度的には、このケースでは、WinIE Opera Firefox MacSafari共に、最後の変数への代入が最も早く動作しています。
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo = function(layName){
var o=document.getElementById(layName);
return {
show: function(){
o.style.visibility='visible';
},
hide: function(){
o.style.visibility='hidden';
}
}
};
var jk= org.jsgt.jKamo;
うまくいきましたが、更に欲がでてきます。この際、styleもまとめて、layNmaeという引数名も短くします。
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo = function(e){
var o=document.getElementById(e),s=o.style;
return {
show: function(){s.visibility='visible'},
hide: function(){s.visibility='hidden'}
}
};
var jk= org.jsgt.jKamo;
| OS | ブラウザ : | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|---|---|---|---|---|---|---|
| Win | firefox1.5 : | 954 | 1000 | 1000 | 1047 | 1000 |
| ie6 : | 565 | 565 | 672 | 671 | 672 | |
| Opera9 : | 516 | 500 | 516 | 500 | 516 |
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
if(!org.jsgt.jKamo)org.jsgt.jKamo={};
org.jsgt.jKamo.fx = function(e){
var es=es||(document.getElementById(e).style||e.style);
return {
visi: function(v){es.visibility=v}
};
};
var jk= function(e){
return jk.e||(jk.e=new org.jsgt.jKamo.fx(e));
};
var s=(new Date()).getTime(),e;
for(var i=0;i<10000;i++){
jk('test0').visi('hidden');
jk('test0').visi('visible');
}
var e =(new Date()).getTime();
var sa=e-s;
alert(sa)
| OS | ブラウザ : | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|---|---|---|---|---|---|---|
| Win | firefox1.5 : | 4079 | 3547 | 3625 | 3593 | 3703 |
| ie6 : | 1875 | 1829 | 1844 | 1844 | 1860 | |
| Opera9 : | 1203 | 1188 | 1187 | 1188 | 1250 |
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo = function(e){
var es=es||(document.getElementById(e).style||e.style);
return {
visi: function(v){es.visibility=v;}
};
};
var jk= org.jsgt.jKamo;
var s=(new Date()).getTime(),e;
for(var i=0;i<10000;i++){
jk('test0').visi('hidden');
jk('test0').visi('visible');
}
var e =(new Date()).getTime();
var sa=e-s;
alert(sa)
//=====================================================================
// ライブラリ互換処理
// jslb_ajax.jsのsendRequest、prototype.jsのAjax.Request、
// YUIのConnect.asyncRequest、Dojoのdojo.io.bindを互換させます。
// 使わないライブラリは、実装現場で最後に
// case 'ライブラリ名':から;break;までの該当するブロックを削除
// することで、このソースの軽量化が可能です。
//
use : '',//使用するライブラリ名
//使用するライブラリ名を指定します。
setUse :function(libName){
this.use=(libName=='auto')?this._autoUse():((libName)?libName:'');
},
//setUseの第一引数が'auto'時に、下記配列順に検査しライブラリを自動指定します。
_autoUse :function(){
var lib=['prototype.js','yahoo.js','dojo.js','jslb_ajax.js'];
var liboj=[window.Prototype,window.YAHOO,window.dojo,window.sendRequest];
for(var i=0;i<=liboj.length;i++){
var t=typeof liboj[i];
if(t=='object'||t=='function'){return this.use=lib[i];};
};
},
//置き換え
_sendRequest :function(callback,data,method,url,async,sload){
function mkPrams(b){
var p='';
for(var i in b){
p+='&'+encodeURIComponent(i)+'='+encodeURIComponent(b[i]);
};
return p
};
switch(this.use){
case 'prototype.js':
var op={
method:method,
parameters:mkPrams(data),
onComplete:callback,
asynchronous:async
};
url=(sload)?url+'?'+(new Date()):url;
return new Ajax.Request(url,op);
;break;
case 'dojo.js':
dojo.require("dojo.io.*");
var postContent=''
url=(sload)?url+'?'+(new Date()):url;
if(method.toLowerCase()=='get')url+mkPrams(data)
else postContent=mkPrams(data);
dojo.io.bind({
method:method,
url:url,
load: function(type,data){
callback({responseText:data})
},
sync:async,
postContent:postContent
});
;break;
case 'yahoo.js':
var postData='';
url=(sload)?url+'?'+(new Date()):url;
if(method.toLowerCase()=='get')url+mkPrams(data)
else postData=mkPrams(data);
YAHOO.util.Connect.asyncRequest(
method,url,{success:this.onloaded},postData
)
;break;
case 'jslb_ajax.js':
sendRequest(callback,data,method,url,async,sload);
;break;
}
}
<script type="text/javascript">
//<![CDATA[
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo= {
show: function(layName){
document.getElementById(layName).style.visibility='visible';
}
};
//]]>
</script>
<!--↓このリンクをクリックすると/////////////////////////////////-->
<p><a href="#" onclick="org.jsgt.jKamo.show('test0');return false">
クリックするとレイヤ−が現れます</a></p>
<!--↓このレイヤ−が現れます/////////////////////////////////////-->
<div id="test0"
style="position : absolute ;
left : 180px ;
top : 80px ;
font-size : 24pt ;
visibility : hidden ;">
ほらね
</div>
クロスブラウザ関数では、showLAYER('DOM要素のID名') で済んでいたものが、org.jsgt.jKamo.show('DOM要素のID名') という長い名前になってしまいました。ネームスペースを適用した結果とはいえ、これではちょっと面倒です。
//org.jsgt.jKamoを作成後ショートカットを作る var jk=org.jsgt.jKamo;こうすると、org.jsgt.jKamo.show('DOM要素のID名') は、jk.show('DOM要素のID名') で済むようになります。サンプル
var my={};
my.jk=org.jsgt.jKamo;
のような別のネームスペースを与えて管理する、といった書き方にするのも自由です。サンプル
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo = function(layName){
return {
show: function(){
document.getElementById(layName).style.visibility='visible';
}
}
};
var jk=org.jsgt.jKamo;
こうしておくと、
jk('test0').show();
で動作するようになります。もし、 jk('test0') を何度も使うときは、 oj=jk('test0') とでもしておけば、予定通り、 oj.show() で動作するメソッドが完成します。サンプル
var $=org.jsgt.jKamo;
$('test0').show();
こんな、jQueryのような使い方も可能になるわけです。今となっては、多くのライブラリと衝突する可能性が高いので、お勧めはしませんが(笑)。
return {
show: function(){
document.getElementById(layName).style.visibility='visible';
},
hide: function(){
document.getElementById(layName).style.visibility='hidden';
},
zindex: function(z){
document.getElementById(layName).style.zIndex=z;
}
}
でも、document.getElementByIdが鬱陶しいので、これはなんとかします。
var HOGE={};
もちろん、new Object()やnew function名()などで作ってもかまいません。
var org={jsgt:{}};
alert(org) ; //[object Object]が表示されます
alert(org.jsgt) ; //[object Object]が表示されます
これで、オブジェクトorgとその下のオブジェクトorg.jsgtが生成されました。オブジェクトシステムに合わせるために、包括的な名前から順番に書いていきますので、もし、game.gr.jpならjp.gr.gameとしていたと思いますが、今回はjsgt.orgベースなので、org.jsgtとなります。
if(!org)var org={}; if(!org.jsgt)org={jsgt:{}};注:if(!org.jsgt)org={jsgt:{}};では、 odz さんのご指摘のようにorg以下を 破壊してしまうので、下記に修正。
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
これで、orgやorg.jsgtオブジェクトが存在すればそのままで、存在しなければ、新たにグローバルスコープへorg.jsgtを作成するようになります。
var org={jsgt:{}};
org.jsgt.ClassA=1;
alert(org.jsgt.ClassA) ; //1が表示されます
var org={jsgt:{}};
org.jsgt.ClassB=1;
alert(org.jsgt.ClassA) ; //undefinedが表示されます
alert(org.jsgt.ClassB) ; //1が表示されます
最初の、org.jsgt.ClassAは、次のorg.jsgt.ClassBを定義されることで、undefinedになってしまいます。そこで、これに前述の処理を加えるとこうなります
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.ClassA=1;
alert(org.jsgt.ClassA) ; //1が表示されます
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.ClassB=1;
alert(org.jsgt.ClassA) ; //1が表示されます
alert(org.jsgt.ClassB) ; //1が表示されます
これで、ClassB定義によってClassAを破壊することなく利用できるようになりました。もちろん、逆に、var org={jsgt:{}};と書いてしまうことですべてを初期化して始めることもできます。
if(!org)var org={};
if(!org.jsgt)org.jsgt={};
org.jsgt.jKamo= {};
別のライブラリが org.example を名前空間として使っていたら内容が全部吹っ飛ぶ気がするのですが、大丈夫でしょうか。
Bar ( 2006年09月19日 11:31 )マイクロソフトがcom.msを使ってモルガン・スタンレーに文句を言われるのに500カノッサ。
高橋 ( 2006年09月19日 11:37 )あとで、追記した、「2.ネームスペースの衝突回避 」でどうですか?
odz ( 2006年09月19日 11:49 )いや、普通にトレースするとわかると思うんですけど、
if (!org.jsgt) org={jsgt:{}};
ですから、org.example がどっかに消えてしまいませんか?
あ〜、ほんとだ。言ってることと書いてるコードが全然違いますね(^^;;有り難うございます。修正しました。
odz ( 2006年09月19日 12:14 )やるなら
if (!org.jsgt) org.jsgt = {};
でいいじゃないかと思いますが・・・
トラックバックをクリックすると404と表示されるだけなんですが・・・うちからだけでしょうか?
高橋 ( 2006年09月19日 15:30 )修正しました。トラックバックURL内の◎を手動で置換えないと使えない、という不便な仕組みですが、スパム対策のひとつなので、お手数ですがよろしくお願い致します。
【info】有料サポート(ベータ)限定 承り中 /【JSサポート(仮称)】
【費用】 とりあえず、言い値で承ります。ただし、できる範囲での限定受付です。込み具合等によりお受けできない場合がありますのであらかじめご了承ください。サポートにご納得いただけなければ料金は不要です。 逆に感動したら多くても構いません(^^;;;。
【できること】 たとえば、かも日記で無料配布されているコードのカスタマイズや、あるいは、JavaScript/Ajax全般+Webサーバーとの連携などのアドバイス&サンプル作成等 。A:jQchartなどでWeb用グラフ設置(エクセル→CSVやデータベースからWebグラフ生成)などのアドバイスやカスタマイズサンプル作成。B:ツリーメニューなどのカスタマイズサンプル。C:Google Mapsのカスタマイズ。etc...
【できないこと】 腕立て伏せ200回
【ライセンス】 私が今まで「かも日記」等で提供してきたコードの大半は、商用利用、改造、自由、連絡不要で、今後もそれらは変わりません。そして、この有料サポートによりカスタマイズコードなどが提供される場合でも、同様に、それらを商用利用しても改造しても自由です。ただし、制限のきついライブラリなどを使う場合は、各ライブラリのライセンスに準拠せざるを得ない場合があります。