arguments.calleeで無名関数再帰
window.openで開いたサブウインドウをどのボタンをクリックして開いたかによって挙動を変えたくなったので以下のようなコードを書いてみた。
window.onload = function(){ var open_func = function(){ var label = this.innerHTML; var w = window.open('/white.txt'); w.onload = function(){ this.document.write(label); }; }; var links = document.getElementsByTagName('a'); for(var n=0; n < links.length; n++){ links[n].onclick = open_func; } };
するとFirefox3では上手く動いたけどIE6だとダメだった。まったくIEって奴は…。
ってことでウインドウの状態を監視するようにした。
window.onload = function(){ var open_func = function(){ var label = this.innerHTML; var w = window.open('/white.txt'); (function(){ if(w.document.readyState == 'complete'){ w.document.write(label); }else{ setTimeout(arguments.callee, 100); } }).call(); }; var links = document.getElementsByTagName('a'); for(var n=0; n < links.length; n++){ links[n].onclick = open_func; } };
functionの内部でarguments.caleeっていうのは自分自身(のFunctionオブジェクト)を表すようで上みたいにすると無名関数で再帰処理が書ける。なんかカッコイイ。
ちなみにHTMLはこんな感じ
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript" src="/js/callee.js"></script> <title>サブウインドウテスト</title> </head> <body> <a href="javascript:void(0)" class="link">リンク1</a><br /> <a href="javascript:void(0)" class="link">リンク2</a> </body> </html>