javascript
最近、えらい javascript づいている。
だから、という訳ではないのですが、こないだ見つけた_Interesting tips in JavaScript_を見つつ色々確認してみました。
そのいち
load なタイミングが制御できる模様。試験してみたサンプルが以下です。
<html> <head> <script type="text/javascript"> var api = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize"; //The function that loads any external JavaScript dynamically function loadScript(src) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = src; document.body.appendChild(script); } //Google maps api callback function initialize() { var myLatlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } </script> </head> <body> <div id="map_canvas" style="width:500px; height:500px"></div> <input type="button" value="Load Map" onclick="loadScript(api)" /> </body> </html>
たしかにボタンがクリックされるまで地図が出力されません。
む。これって
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&callback=initialize"></script>
なソレが動的に、という事なんか。へー、って言いつつ callback な URL について Google 先生にお伺いした所、ここで以下なサンプルの記述を発見。
function initialize() { var myLatlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } function loadScript() { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize"; document.body.appendChild(script); } window.onload = loadScript;
Asynchronously Loading the Javascript API の項です。これを微妙に変形させたのが例示されているナニと見た。しかし凄いな。
そのに
次の例は new を使わないインスタンス生成に関する記述。しかしこれ、何故に属性へのアクセサの定義を記述しなくて良いのかが謎。
ここはクラス定義に関する自分の知識不足です。別途確認してみます。
そのさん
memoize との記述あり。ただ、
createXhrObject: function() { // Factory method.
な記述があって意味不明。上記記述でググッたら The Factory Pattern にヒット。コードを以下に引用しときます。後で確認。
/* BicycleShop class. */ var BicycleShop = function() {}; BicycleShop.prototype = { sellBicycle: function(model) { var bicycle; switch(model) { case 'The Speedster': bicycle = new Speedster(); break; case 'The Lowrider': bicycle = new Lowrider(); break; case 'The Comfort Cruiser': default: bicycle = new ComfortCruiser(); } Interface.ensureImplements(bicycle, Bicycle);
あら、これって_そのに_のクラス定義にあったソレと同じだな。
てか
memoize の例、字下げが微妙でよみちがいしていた。これなら読み易い。
createXhrObject: function() { // Factory method. var methods = [ function() { return new XMLHttpRequest(); }, function() { return new ActiveXObject('Msxml2.XMLHTTP'); }, function() { return new ActiveXObject('Microsoft.XMLHTTP'); } ]; for(var i = 0, len = methods.length; i < len; i++) { try { methods[i](); } catch(e) { continue; } // If we reach this point, method[i] worked. this.createXhrObject = methods[i]; // Memoize the method. return methods[i]; } // If we reach this point, none of the methods worked. throw new Error('SimpleHandler: Could not create an XHR object.'); } };
例外が発生しなければその手続きをメモって戻す模様。
それにしても
javascript もなかなか強力。Gauche みたく REPL なナニがあれば良いのに、ってブラウザ上で動くナニがあったりするんだろうな。