2008年5月21日(水)

ちょっと小細工:textareaの高さを自動調節

改行入力なしでオートラップされた場合も自動調節してくれるとうれしいかな?と思ってちょっと小細工してみました。
■元ネタ
元記事:textareaのサイズを入力にあわせて調整するJavaScript (イラストdeブログ開発記)
経由:404 Blog Not Found:javascript - 勝手に添削 - textareaの高さを自動調節
■ソース
<script type="text/javascript">
function    initResizeTextarea(textarea) {
    if (!textarea||textarea._initResizeTextarea_) return;
    textarea._initResizeTextarea_=true;
    var offset=textarea.scrollHeight-textarea.offsetHeight;
    var lastLength=textarea.value.length, initRows=textarea.getAttribute('rows');
    if (isNaN(initRows)) initRows=3;
    if (!window.opera) {
        textarea.onkeyup=function(){
            var rows=textarea.getAttribute('rows');
            if (textarea.value.length<lastLength) {
                while (textarea.scrollHeight-textarea.offsetHeight<=offset) {
                    textarea.setAttribute('rows',--rows);
                    if (rows<=initRows) break;
                }
            }
            while (offset<textarea.scrollHeight-textarea.offsetHeight) {
                textarea.setAttribute('rows',++rows);
            }
            lastLength=textarea.value.length;
        };
    }
    else {
        textarea.onkeyup=function(){
            var lines=textarea.value.split('\n');
            var len=(initRows<lines.length)?lines.length:initRows;
            textarea.setAttribute('rows',len);
        };
    }
}   //  end of initResizeTextarea()
</script>

<textarea cols="64" rows="4" onfocus="initResizeTextarea(this)">
イチ


</textarea>
■サンプル
動作確認は、IE7(Sleipnir)、Firefox 2.0.0.14、Safari 3.1.1、Opera 9.27 で行いました。
ただし、Opera はscrollHeightの値が変化してくれないため、手動で入力した改行のみ対応で、オートラップには対応できていません。
どうも、Operaのtextareaは鬼門らしい(「内容に合わせて伸縮するテキストエリア」を Opera にも - m2より)

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/05/21(水) 01:53 | | コメント (0) | トラックバック (0)

2008年5月03日(土)

Googleの検索結果からH2タグが消える現象の原因

Google検索結果画面のHTML構造、変わりました?で書いていた、Googleの検索結果から<h2 class=r>タグが消える、という謎の現象ですが、原因らしきものがわかりました。
どうやら、Googleが読み書きしているらしいCookie(PREF)の値に"GBV=1"というのが含まれているとこのようになるみたいです。
例えば、JavaScriptオフにしたままで、
[A] http://images.google.com/images?gbv=2&hl=ja&safe=off&q=%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8
にアクセスすると、
[B] http://images.google.com/images?hl=ja&safe=off&q=%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8&gbv=1&ei=62QbSPX8MJPS6gO67cSMCg
のように、パラメータに"gbv=1"がついたページへとリダイレクトされますが、このときにCookieに"GBV=1"というのが追加されてしまいます。
これで、通常の検索を行うと、検索結果からH2タグが無くなってしまいます。
この状態だと、例えばLDRizeで[v][o]が効かなくなったりする弊害が出てしまいます。
元に戻すには、JavaScriptをオンにした状態で、[A]にアクセスします。
で、以前記事にした、AutoPagerize/AutoPagerlike:Google イメージ検索への対応を試みるでは、わざと"gbv=1"付きのページを読込んでいるので……これを使っていると、勝手に上記現象が発生してしまうことになります。
とりあえず、対策した設定ファイル(!!autopageroptions.user.js)に差替えておいてください。
設定ファイルをカスタマイズしていて上書きしたくない場合、DOCFILTERのところに、
    ,   'http://images\\.google\\..+/images\\?.+':[function(doc,url){   //  Google イメージ検索用
            var dummy=new Image();
            dummy.src='http://images.google.com/images?gbv=2&hl=ja&safe=off&q=%E3%83%9A%E3%83%BC%E3%82%B8?update='+(new Date()).getTime();  //  for delete cookie(PREF= .. GBV=1 ..)
        }]
を追加します。
これは、継ぎ足しページを"gbv=1"で読込んだ後、"gbv=2"がついたURIにダミーでアクセスすることで、Cookieを書換させています。
oAutoPagerizeのGoogleイメージ検索対応 oAutoPagerize ver 0.4.1の方は対策されてるんだろうか……?

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/05/03(土) 04:34 | | コメント (0) | トラックバック (0)

2008年4月30日(水)

Google検索結果画面のHTML構造、変わりました?

本日、帰宅してから気付いたのですが……Googleの検索結果画面、HTML構造、変わりました、もしかして?
具体的には、今まで検索結果の見出しのところに確かにあったはずの、<h2>タグが無くなっているみたいなんですけど。
で、その結果として、はてブフィルタが動作しなくなっているんですけど(泣)。
昼間、会社で使っているときにはちゃんと動いていたので、日本時間の夕方~夜にかけて、だと思いますが…。
■追記(2008/05/01)
どうも、環境依存らしい……というか、私の環境だけ?
常用しているノートPC(WinXP SP2)だと、IE系とFirefox2.0.0.14はh2タグが含まれておらず、一方、Opera9.27やSafari3.1.1だとh2タグが含まれている……しかも、試しにユーザを変えてやると、IE系やFirefoxでも含まれるようになる……???
なんじゃこれ?
■追記(2008/05/03)
やっと原因らしきものがわかった
気付くかい、こんなの……。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/04/30(水) 22:29 | | コメント (0) | トラックバック (0)

2008年4月05日(土)

【JScript】ActiveXObject('htmlfile')で発生する不具合

IE7にて、new ActiveXObject('htmlfile')で作成したHTMLDocumentに、<iframe src="~#アンカー名"></iframe>のように、srcにアンカー付きのURIを指定したIFRAME要素を書込むと、何故かブラウザのタブが一杯開いて収集がつかなくなる、という訳のわからない現象に遭遇してしまい、悩んでいます。
具体的には、下記のようなコードで再現します。
var htmlfile=new ActiveXObject('htmlfile');
htmlfile.open('text/html');
htmlfile.write('<iframe src="http://furyu.tea-nifty.com/annex/2008/03/autopagerlike_s_56ec.html#comments"><\/iframe>');
htmlfile.close();
サンプルはこちら開くとブラウザがおかしくなるので注意。
これ、AutoPagerlikeにとっては(たぶん、AutoPagerize for SeaHorseでも)非常にやっかいな現象なんですが……なんとか回避する方法はないですかねぇ?
とりあえず、AutoPagerlikeでは暫定的にIFRAMEのsrcでアンカーが指定されていたら削る方向で対処しましたが(ver.0.03j)、出来ればもっとスマートな方法が知りたい、というか、多分バグだと思うのでなおして欲しい>MS。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/04/05(土) 23:04 | | コメント (2) | トラックバック (0)

2008年3月11日(火)

【JavaScript】onmouseover/onmouseoutの振る舞い

マウスイベントである onmouseover/onmouseout はそれぞれあるオブジェクトに対してマウスが重なった/外れた場合に発生するイベントですが、どうも動作が直感的じゃないなぁ、と感じていたので、少し調べてみました。
どういうことかというと、例えば、
A
B
C

のように、親オブジェクトAの中に子オブジェクトB、孫オブジェクトCがいるような場合。
Aに対してonmouseover/onmouseoutを設定したとすると、直感的には、
  1. Aの外から内側に入った場合にのみ、overイベントが発生。
  2. Aから外に出た場合にのみ、outイベントが発生。
という動作を期待してしまいますが、これは期待通りになりません。
というのは、A~B間、B~C間の境界を移動した場合にも、当該イベントが発生してしまうからです。
たとえば、A→Bに動くと、一旦 out が発生してから改めて over が発生します。
つまり、一旦領域外に出てから、改めて入ったかのように振る舞ってしまうわけです。
さらに、A・B・C全てに対してonmouseover/onmouseoutを設定した日には、かなりいやらしい動作となってしまいます。
B→Cへと移動した日には、"OUT-B OUT-A OVER-C OVER-B OVER-A"と、都合5回のイベントが発生します(w。
そこで、もう少し直感的な動作に近くなるように、onmouseout/onmouseover専用のイベントハンドラ登録関数を作成してみました。
動作サンプル

Mousehandler_2

サンプルソース
(function(){
var w=window,d=w.document;

w.setEventHandler=(function(){
    if (w.addEventListener) {
        return function(obj,evt,handler){obj.addEventListener(evt,handler,false)};
    }
    else if (w.attachEvent) {
        return function(obj,evt,handler){obj.attachEvent('on'+evt,handler)};
    }
    else {
        return function(obj,evt,handler){var org=obj['on'+evt];obj['on'+evt]=function(){if(typeof org=='function')org();handler()}};
    }
})();   //  end of setEventHandler()

w.setMouseHandler=function(obj,evt,handler) {
    var mouseHandler=function(curEvent,e) {
        if (!e) e=w.event;
        if (!e) return;
        var prop=obj._MouseProp_;
        var curStatus=prop.status;
        if (curStatus==curEvent) return;
        if (curStatus=='out') { //  outer to inner
            var fncArrayOver=prop.fncArrayOver;
            for (var ci=0,len=fncArrayOver.length; ci<len; ci++) {
                fncArrayOver[ci].apply(obj,[e]);
            }
        }
        else {                  //  inner to outer
            var chkNode=e.toElement||e.relatedTarget;
            while (chkNode) {
                if (chkNode==obj) return;
                chkNode=chkNode.parentNode;
            }
            var fncArrayOut=prop.fncArrayOut;
            for (var ci=0,len=fncArrayOut.length; ci<len; ci++) {
                fncArrayOut[ci].apply(obj,[e]);
            }
        }
        prop.status=curEvent;
    };
    var prop=obj._MouseProp_;
    if (!prop) {
        prop=obj._MouseProp_={status:'out',fncArrayOver:[],fncArrayOut:[]};
        w.setEventHandler(obj,'mouseover',function(e){mouseHandler('over',e)});
        w.setEventHandler(obj,'mouseout',function(e){mouseHandler('out',e)});
    }
    if (evt=='mouseover') {
        prop.fncArrayOver[prop.fncArrayOver.length]=handler;
    }
    else if (evt=='mouseout') {
        prop.fncArrayOut[prop.fncArrayOut.length]=handler;
    }
    else {
        w.setEventHandler(obj,evt,handler);
    }
};
})();
setEventHandler(object,event,handler)は、単にaddEventListener()やattachEvent()のラッパ関数です。
setMouseHandler(object,event,handler)の方が、mouseover/mouseout専用のイベントハンドラ登録用関数になります。
eventは'on'をとったものを使います('onmouseout'→'mouseout')。
作りとしては単純で、
  1. デフォルト(ハンドラ登録時)は"外"にいるものとして初期化。
  2. "外"において発生した'mouseover'により、"外"→"内"に移動したものとみなす。
  3. "内"にいるときに発生する'mouseover'は無視。
  4. "内"にいるときに'mouseout'が発生した場合、移動先のオブジェクトをevent.toElement(IE)もしくはevent.relatedTarget(Firefox他)で取得し、そこから親を辿っていって、イベントを設定したオブジェクトが見つからない場合にのみ、"外"へと移動したものとみなす。
としています。
で、例によって作ってから気付きましたが、IEの場合はonmouseenterやonmouseleaveというのもあるみたいですね。もしかするとわざわざ↑のようなことをしなくても、これでできるのかな?(試していませんが)。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/03/11(火) 01:57 | | コメント (0) | トラックバック (0)

2008年2月11日(月)

ECS 3.0サービス終了に伴う『蔵書リンクMAKER』の改修

先日、Amazonから、
■[Amazonアソシエイト] ECS 3.0 サービス終了のご案内
先般よりDeveloper Forumにおきましてもご案内しておりましたが、このたび、Amazon E-コマース Web サービス バージョン3.0のサービスのご提供を 2008年3月31日 をもちまして終了させていただくことになりましたことを、改めてご案内いたします。
というメールが届きました。
要は、『ECS 3.0サービスの提供が終わるから、さっさとAWS 4.0(*1)へ移行しなさいよ』ってことで……やばっ、すっかり忘れていましたよ……。
(*1) Amazon アソシエイト Webサービス4.0の略称として勝手に使用しています。正式な略称は知りません。旧称:Amazon ECS 4.0 のことです。
とりあえず、『蔵書リンクMAKER』(REST版)については対応してみたつもりです。
ほとんどテストしていないのできっと不具合ありまくり、かも。
CGI(SOAP)版はいいでしょ、別に(苦笑)。
きまぐれブックテーマは……まぁ、その名の通り、気が向いたらということで(苦笑)。
使っている人いないと思うし(w
それにしても、RESTエンドポイントとかパラメータの違いはともかくとして(*1)、XMLの構造がまるっきり違っていた(*2)のにはまいりました。
XSLTの書き方なんてすっかり忘れていましたし、Namespaceの設定が新たに必要になっていたりして、思わぬ苦労をしてしまいました。
(*1) それでも、機能が同じパラメータ名をわざわざ変えることもないと思うけれども。せめて旧パラメータも併用出来ればと思うのは私だけ?
(*2) ざっと見た感じでは、ECS3互換のXMLを出力するようなオプションもなさげ。もしあるようなら教えてくださいませ。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/02/11(月) 04:32 | | コメント (0) | トラックバック (0)

2008年1月23日(水)

【覚書】JavaScriptでDateオブジェクトを使って一ヶ月の日数を得る

先日、ココログカレンダーPlus作成時に気がついたので、メモ書き。
Dateオブジェクトを使えば、その月の日数が何日あるか簡単にわかるのですね。
普通、ひと月の日数を取得するなら、西向く侍と閏年を考慮して、
var getNumOfDays=(function(){
    var days=[31,28,31,30,31,30,31,31,30,31,30,31];
    return function(year,month){
        return days[month-1]+(month!=2?0:year%4?0:year%100?1:year%400?0:1)
    }
})();
てな処理を書きますが、Dateオブジェクトを使うと、
var getNumOfDays=function(year,month){
    return new Date(year,month,0).getDate();
};
で取得出来ます。
当然ながら、Dateでサポートしている年月の範囲内に限りますが。
ミソは「翌月の0日が何日かを取得」することで、当月の最終日がわかるというものです。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/01/23(水) 20:59 | | コメント (0) | トラックバック (0)

2008年1月14日(月)

ココログは顔文字がお嫌い?<スパムフィルタ

以前、ココログの『スパム防止認証画像の表示設定』で、“すべてのコメントに対して表示しない”にしていると、おかしなフィルタがかかって投稿出来ない旨の記事を書きましたが、今回はその続き。
takoさんのところ(*second message*: ココログ:フリー版の広告(Sponsored Link)表示がいつの間にか増えている件)に何回かコメントさせていただいたのですけれど、2回ほどコメントがスパムと見なされて投稿出来ない現象に遭遇。
ちなみに、該当記事は、検索エンジンから飛んできた場合、フリーだと記事の冒頭にも広告が挿入されるされてしまう、という件についてのもの。
■1回目
対象となる検索エンジンを、
Google
Yahoo!検索
@serch(@nifty)
BIGLOBEサーチ
Live Search(Microsoft)
goo検索
OCNサーチ
excite検索
のように列挙していたところ、スパムとみなされたようです。
まぁ、まだこれはわからなくもない。
■2回目
↓が投稿に失敗した(スパムとみなされた)もの。
tako さん、どうもです。

| 設置出来ました。

理由はよくわからないのですけれど、IE6だと、検索元から飛んできたときに下の方の広告に画像が表示されないですね(?_?)。
#FirefoxやOperaは表示されるのに……。

セレクタを
div.adsense
から
div.adsense div.entry-more-text
に変えた方がよいかも?

あと、facetさんが書かれている after擬似要素は(beforeも)文字の装飾も可能です(普通にcolorとか使えます)が、確かIE6では未サポートだったと思います。
投稿に成功したコメントと見比べてください。
どこが違うか、わかりますか?
『(?_?)』がひっかかるなんて、わかんねーよ!
そういったわけで、現状では面倒でも“スパムの疑いがあるコメントに対して表示”もしくは“すべてのコメントに対して強制的に表示”にしておかないと、かえってコメントを付けようとした方にストレスがかかる要因となるかも、です。
でも、強制表示になっていても出たことがある、という報告もあったしなぁ……。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/01/14(月) 17:49 | | コメント (4) | トラックバック (1)

表示されているページのHTMLを確認するブックマークレット

ブラウザの『ソースの表示』で表示されるのは通常、もととなっているHTMLソースですが、スクリプトが適用されて改変された後のページのソースがどうなっているのかを知りたいというときもあります。そんなときに使用するブックマークレットです。 新たにウィンドウ(タブ)が開いて、そのテキストエリア(textarea)内に、元ウィンドウ(タブ)のソースが表示されます。
まぁ、同様のブックマークレットはたくさんあるのですが、覚書を兼ねて。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/01/14(月) 02:35 | | コメント (0) | トラックバック (0)

2007年12月22日(土)

【JavaScript】これ(this)はなに?

JavaScriptでプログラムを組んだり人の作ったコードを読んでいると、よく出てくる“this”という表現。
これ、例えば同一の関数内のはずなのに、そのときどきで指しているものが異なったりして結構わかりにくい、と感じる方も多いのではないでしょうか。
■同一関数内で'this'が指すものが異なる例
function whatisthis(obj) {
    alert('[A](this===window)→'+(this===window)+' [B](this===obj)→'+(this===obj));
}

var obj={
    obj_whatisthis : whatisthis
};
var ref_whatisthis = obj.obj_whatisthis;

var obj2={
    ref2_whatisthis : obj.obj_whatisthis
};

//(1)関数として呼び出し
/* 1-1 */   whatisthis(obj);                //  [A]true  [B]false
/* 1-2 */   obj.obj_whatisthis(obj);        //  [A]false [B]true
/* 1-3 */   ref_whatisthis(obj);            //  [A]true  [B]false
/* 1-4 */   obj2.ref2_whatisthis(obj);      //  [A]false [B]false

//(2)コンストラクタ(constructor)として呼び出し
/* 2-1 */   new whatisthis(obj);            //  [A]false [B]false
/* 2-2 */   new obj.obj_whatisthis(obj);    //  [A]false [B]false
/* 2-3 */   new ref_whatisthis(obj);        //  [A]false [B]false
/* 2-4 */   new obj2.ref2_whatisthis(obj);  //  [A]false [B]false
私的には、結局のところ(関数オブジェクトの実体がどこにあるかにはよらず)実際に呼び出されるときに、
  1. あるオブジェクトのプロパティとして関数が呼び出される場合、thisは当該オブジェクトを指す。
  2. 上記以外の場合には、thisはGlobalオブジェクト(ブラウザの実装では通常"window")を指す。
というルールに集約されるのかな、と理解しています。

また、補足事項としては、
  • 関数がコンストラクタ(constructor)として呼ばれた場合(var obj=new <関数名>()のようにnewを付けて呼びだした場合)、その関数は新規に作成されたオブジェクトのプロパティとして呼び出される。
    従って、ルール1から関数内のthisは新規に作成されたオブジェクトを指す。
  • 関数がcallもしくはapplyで呼びだされた場合(<関数名>.call(<オブジェクト>,<引数1>[,<引数2>...])、もしくは、<関数名>.apply(<オブジェクト>,<引数の配列>))、その関数はcallもしくはapplyの第1引数(<オブジェクト>)に指定されたオブジェクトのプロパティとして呼び出される。
    従って、ルール1から関数内のthisは第1引数で指定されたオブジェクトとなる(言い換えると、関数内で"this"として扱いたいオブジェクトをcallもしくはapplyの第1引数で明示出来る)。
  • Global領域で'function <関数名>(){...}'もしくは'var <関数名>=function(){...}'で定義された関数は、Globalオブジェクト("window")のプロパティとなる。
    従って(この関数が<関数名>を直接指定して呼び出される場合)ルール1から関数内のthisはGlobalオブジェクトとなる。
  • 関数内で'function <関数名>(){...}'もしくは'var <関数名>=function(){...}'で定義された関数は、オブジェクトのプロパティではない。
    従って(この関数が<関数名>を直接指定して呼び出される場合)ルール2から関数内のthisはGlobalオブジェクトとなる。
のようになるのかな、と。
例えば、上の方で挙げた例(関数whatisthis()はGlobal領域で定義された関数)では、
  • 1-1
     →"whatisthis"がGlobalオブジェクトのプロパティであるため、"this"はGlobalオブジェクト("window")。
  • 1-2
     →"obj_whatisthis"が"obj"オブジェクトのプロパティであるため、"this"は"obj"オブジェクト。
  • 1-3
     →"ref_whatisthis"がGlobalオブジェクトのプロパティであるため、"this"はGlobalオブジェクト("window")。
  • 1-4
     →"ref2_whatisthis"が"obj2"オブジェクトのプロパティであるため、"this"は"obj2"オブジェクト。
  • 2-x
     →関数がコンストラクタとして呼び出される場合、新規に作成されたオブジェクトのプロパティとしての呼び出しとなる。従って、"this"は新規に作成されたオブジェクトを指す。
もう少し複雑な例をあげると、
function    test_whatisthis() {
    function    whatisthis(obj) {
        alert('[A](this===window)→'+(this===window)+' [B](this===obj)→'+(this===obj));
    }
    this.whatisthis=whatisthis;
    
    whatisthis(this);           // #1
    this.whatisthis(this);      // #2
    whatisthis.call(this,this); // #3
    
    var obj={whatisthis:whatisthis};
    whatisthis(obj);            // #4
    obj.whatisthis(obj);        // #5
    whatisthis.call(obj,obj);   // #6
}

//(1)関数として呼び出し
test_whatisthis();
    //  #1:[A]true  [B]true
    //  #2:[A]true  [B]true  ※IE6では [A]false [B]false ??
    //  #3:[A]true  [B]true
    //  #4:[A]true  [B]false
    //  #5:[A]false [B]true
    //  #6:[A]false [B]true

//(2)コンストラクタ(constructor)として呼び出し
var temp=new test_whatisthis();
    //  #1:[A]true  [B]false
    //  #2:[A]false [B]true
    //  #3:[A]false [B]true
    //  #4:[A]true  [B]false
    //  #5:[A]false [B]true
    //  #6:[A]false [B]true
関数test_whatisthis()はGlobal領域で定義されたものです。

まず、「(1)関数として呼び出し」た場合には、"test_whatisthis"内でのthisはGlobalオブジェクト("window")になります。
この前提で、
  • #1  →"whatisthis"が特定のオブジェクトのプロパティとして扱われていないため、"whatisthis"内のthisはルール2に基づいてGlobalオブジェクト("window")。
  • #2  →"test_whatisthis"内での"this"オブジェクト(即ちGlobalオブジェクト)のプロパティとして呼び出されているため、"whatisthis"内のthisはGlobalオブジェクト("window")。
  • #3  →'whatisthis.call(<オブジェクト>,<引数>)'は、『"whatisthis"を<オブジェクト>(=this=window)のプロパティとして<引数>(=this=window)を指定して呼び出す』という意味になるため、"whatisthis"内のthisはGlobalオブジェクト("window")。
  • #4  →"whatisthis"が特定のオブジェクトのプロパティとして扱われていないため、"whatisthis"内のthisはルール2に基づいてGlobalオブジェクト("window")。
  • #5  →"obj"オブジェクトのプロパティとして呼び出されているため、"whatisthis"内のthisは"obj"オブジェクト。
  • #6  →'whatisthis.call(<オブジェクト>,<引数>)'は、『"whatisthis"を<オブジェクト>(=obj)のプロパティとして<引数>(=obj)を指定して呼び出す』という意味になるため、"whatisthis"内のthisは"obj"オブジェクト。
次に「(2)コンストラクタ(constructor)として呼び出し」た場合には、"test_whatisthis"内でのthisは新規に作成されたオブジェクト(仮に"temp"とします)になります。
この前提で、
  • #1  →"whatisthis"が特定のオブジェクトのプロパティとして扱われていないため、"whatisthis"内のthisはルール2に基づいてGlobalオブジェクト("window")。
  • #2  →"test_whatisthis"内での"this"オブジェクト(即ち"temp"オブジェクト)のプロパティとして呼び出されているため、"whatisthis"内のthisは"temp"オブジェクト。
  • #3  →'whatisthis.call(<オブジェクト>,<引数>)'は、『"whatisthis"を<オブジェクト>(=this=temp)のプロパティとして<引数>(=this=temp)を指定して呼び出す』という意味になるため、"whatisthis"内のthisは"temp"オブジェクト。
  • #4  →"whatisthis"が特定のオブジェクトのプロパティとして扱われていないため、"whatisthis"内のthisはルール2に基づいてGlobalオブジェクト("window")。
  • #5  →"obj"オブジェクトのプロパティとして呼び出されているため、"whatisthis"内のthisは"obj"オブジェクト。
  • #6  →'whatisthis.call(<オブジェクト>,<引数>)'は、『"whatisthis"を<オブジェクト>(=obj)のプロパティとして<引数>(=obj)を指定して呼び出す』という意味になるため、"whatisthis"内のthisは"obj"オブジェクト。
……と、大体説明出来るかなぁ?と思っていましたが、test_whatisthis()の(1)-#2の結果が、IE6では"[A]false [B]false"となってしまい、混乱してしまいました。
上記説明の通り、whatisthisはGlobalオブジェクト("window")のプロパティとして呼び出されており、また引数も"window"になることから、"[A]true [B]true "でないとおかしいはずです(実際に、FirefoxやOperaではこうなります)。
ところがIE6でも、(1)-#2のときのwhatisthis関数内における"this"の持つプロパティを調べてみると、"window"オブジェクトが持っているプロパティと一致するんですね。
とすると……window.whatisthis()が呼び出された瞬間、"window"のコピーが作成され、これが"this"として扱われている???
このIE6での現象をもっと単純に再現すると、
window.whatisthis=function (obj) {
    alert('[A](this===window)→'+(this===window)+' [B](this===obj)→'+(this===obj));
};
window.whatisthis(window); // IE6:[A]false [B]false vs others:[A]true [B]true
となります。
これが、window.whatisthisをvar whatisthisに置換えたら、想定通りの動きとなる不思議。
var whatisthis=function (obj) {
    alert('[A](this===window)→'+(this===window)+' [B](this===obj)→'+(this===obj));
};
window.whatisthis(window); // [A]true [B]true
要はwindow.<関数名>=function(){...};という定義方法だと変な動きになる?これまた、ややこしいバグの温床となりそうな現象だ……。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/22(土) 03:16 | | コメント (0) | トラックバック (0)

2007年12月18日(火)

【JavaScript】function定義方法による動作の差異(覚書)

Javascriptで関数(function)を名前付きで定義したい場合、いろいろな書き方があります。 例えば、 function TEST() {alert('TEST')} var TEST=function() {alert('TEST')}; var TEST=function test() {alert('TEST')}; var TEST=new Function("alert(' ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/18(火) 04:14 | | コメント (0) | トラックバック (0)

2007年12月09日(日)

【JavaScript】IE6でTABLE要素内をHTMLで書換える関数

IE6でTABLE/THEAD/TFOOT/TR要素内をHTML表記で書換えることができるような関数を作ってみました。 element.innerHTML='(HTML)'; とする代わりに、 replaceInnerHtml(element,'(HTML)'); として使用します。 上記要素以外の場合でも使えると思います(HEADとかBODYなどはダメですが)。 functionre ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/09(日) 14:09 | | コメント (0) | トラックバック (0)

2007年12月08日(土)

【JavaScript】IE6のString.split()の不具合と対策

IE6のString.split()では、区切り文字(delimiter)を正規表現で指定したときに不具合があるようです。 具体的には、例えば『javascript:alert(',,'.split(/,/).length)』を実行すると、結果が「0」になってしまいます(正しくは「3」)。 ちなみにIE6でも『javascript:alert(',,'.split(',').length)』のよ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/08(土) 16:22 | | コメント (0) | トラックバック (0)

【JavaScript】IE6におけるtable要素の初期化

IE6では、HTMLで『table/table』とだけ記述したtable要素をJavaScriptで取得すると、なぜかtbody要素がデフォルトで入っています(document.createElement('table')で作成した場合は入りませんが)。 これは、『table要素内が空である』ということを前提にしてコーディングしようとした場合なんかは困ります。 それならばと、table要素を初期 ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/08(土) 16:20 | | コメント (0) | トラックバック (0)

2007年12月04日(火)

【JavaScript】リンクオブジェクトのhref参照時のブラウザ毎の振る舞いの違い

JavaScriptでリンクオブジェクトのhrefを参照したときの振る舞いが、ブラウザ毎に異なることに気がつきました。 きっと常識なんでしょうけど……。 例えば、UTF-8のページ上で、日本語がエンコードされた参照先(URI)を持つ a href="http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E" id="testlink ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/12/04(火) 00:39 | | コメント (0) | トラックバック (0)

2007年11月29日(木)

【JavaScript】各種色指定用の文字列を16進カラーコード(#xxxxxx)に変換

JavaScript(CSS)で色を扱おうとすると、同じ赤色でも"red"・"#ff0000"・"#f00"・"rgb(255,0,0)"といった様々な表記が可能です。 指定する分にはいろんな書き方が出来るのは便利でよいのですが、逆のケース、つまり既に指定されている色を取得する場合に、どのフォーマットで返ってくるかわからない、というのでは、少々困ってしまいます。 そこで、色指定用の各種の文字列 ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/11/29(木) 04:16 | | コメント (0) | トラックバック (0)

2007年11月28日(水)

「はかる」ということ。

とりあえず『目を通し終えた』ものの、自分程度の理解力ではとても『読んだ』とは言えないレベル。せめて、『わかったつもり』になるためにも再読を要す。 今度は通勤途中じゃなくて腰を据えて。 (function(src){ var imgObj=(function(obj){while(obj){if(obj.nodeName.toLowerCa ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/11/28(水) 22:54 | | コメント (0) | トラックバック (0)

2007年10月14日(日)

戦国武将のララバイの覚書

昨日入ったカラオケ屋で、名曲『戦国武将のララバイ』が入っていたため、嬉々として入れた、は良かったのですが。 (function(src){ var imgObj=(function(obj){while(obj){if(obj.nodeName.toLowerCase()=="script")break;obj=obj.lastChild}; ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/10/14(日) 11:32 | | コメント (0) | トラックバック (0)

2007年8月19日(日)

CSSのプロパティ名をJavaScriptのstyle属性名に変換するには?

例えば、CSSプロパティ名の"font-size"は、JavaScriptのstyle属性名にするとfontSizeになりますが、この表記の変換はどうやるのがスマートでしょうかね? 簡単なことだと思うのですが、いざやろうとすると、ぱっと浮かばない……。 とりあえず、 functionchgCssPropToJsRef(cssProp){ returncssProp.replace(/-./ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/08/19(日) 10:54 | | コメント (0) | トラックバック (0)

2007年5月06日(日)

自宅サーバ復旧……かな?

3月下旬に故障して以来放置したままになっていた自宅サーバ(PC)をとりあえず復旧しました。 どうも原因を調べたりケースを開けていじったりする気力が湧かず、気がついたらひと月以上放置することに…… 原因としては、やはりCPUの熱暴走だったようです。 何回か電源を入れてみると、起動途中で落ちる箇所はばらばらで……後になる程早く落ちるようになり、ついにはBIOS画面で落ちる、という現象で。 やむ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/05/06(日) 21:02 | | コメント (0) | トラックバック (0)

2007年3月27日(火)

【ココログ】コメント出来ないときに使ってみるブックマークレット

最近、 海外在住の方がココログにコメントしようとするとエラーになる。 自分のココログにコメント出来なくなった。 という障害が散見されるようです。 そこで、これを回避するようなブックマークレットを作ってみました。 コメント可能にするおまじない 上のリンクをブラウザのお気に入り(ブックマーク)として登録しておき、コメントをしたいココログの記事に移動してから、登録しておいたブックマー ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/03/27(火) 23:18 | | コメント (23) | トラックバック (2)

2007年3月04日(日)

【覚書】サイドバー折り畳みボタン[+][-]を押した後でフォーカスを外す方法

KOROPPYの本棚 : 折りたたみボタンの色を開閉で変えるという記事で、 「+」と「-」の色は変更出来たものの、クリックするたびに外側のマスに黒のborderが残ってしまう というコメントをみかけ、『あぁ、確かに気になる人は気になるかも……』と思って、対処方法を調べてみました。 とりあえず、 document.onclick=function(e){var t=(e)?e.targ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/03/04(日) 21:44 | | コメント (5) | トラックバック (0)

2007年2月21日(水)

やっぱり温泉はいいなぁ

先週土曜の研修をサボるのは思いとどまりましたが(笑)、その日の早朝に宿を予約して、18(日)~19(月)の一泊、温泉旅行へと出かけて参りました。 19日は振休取得。 1泊しか出来ないので行先にはちょっと悩みましたが、最終的にはせっかく関東に出張しているのだからと、群馬県に決定。 18日早朝に大阪→神奈川に移動、そこで一旦出張先の寮に寄って荷物を置いてから、東京→高崎経由で、川原湯温泉まで。 ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/02/21(水) 07:59 | | コメント (0) | トラックバック (0)

2007年2月17日(土)

JavaScript用ヒアドキュメントライブラリを試作

ちょっと工夫して、下のようなヒアドキュメント・ライブラリを作ってみました。 一応、Windows XP 上の IE6 SP2、Firefox 2.0.0.1、Opera 9.10 でサンプルは動作するようです。 外部スクリプトの形でhttp://furyu.tea-nifty.com/script/heredocument.jsに置いてあります。 varhdocLists=newArray() ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/02/17(土) 07:48 | | コメント (0) | トラックバック (1)

2007年2月16日(金)

なんとか出来ないかな?<JavaScriptでヒアドキュメント

続いて、同じ記事から今度は『ヒアドキュメント』の方。 ちなみに『ヒアドキュメント』という名称を昨日初めて知った、というのは秘密ですよ? とりあえず、今日会社の昼休みに、 scripttype="text/javascript" functionhereDocToStr(fnc){ varlines=fnc.toString().split(/\r?\n/);lines.shift();l ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/02/16(金) 19:48 | | コメント (0) | トラックバック (1)

JavaScriptでsleepの実装を試みる

『ぼくはまちちゃん!(Hatena) - デブサミ』というところで、 JavaScriptで、sleep という話が出ているのを見かけ、そういえば1年程前のJavaScript触りはじめの頃に私も調べたなぁ……と懐かしく思い出されました……けれども、あれ、結局方法見付けたんだっけ? 確か、setTimeout()を駆使して実装している例を見つけた記憶があるのですが(当時はさっぱりわからなかっ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/02/16(金) 07:47 | | コメント (3) | トラックバック (0)

2007年1月29日(月)

きまぐれサカダチ日誌 ~連続断酒20日間~

きまぐれサカダチ日誌 ~蕎麦屋の罠~以来、割と順調にサカダチ生活が続いていました……が。好事魔多し。……ちょっと違うか? 出張帰りで気が抜けていたのか、電車に乗り込んだ時には缶ビールと缶チューハイ、つまみ系のもの何種類かを手にぶら下げていました。 まぁ、おかげで気持ちよく仮眠が取れたので、良しとしましょう。 それにしても、実に確信犯的な無意識だなぁ。 ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/01/29(月) 23:34 | | コメント (0) | トラックバック (0)

2007年1月14日(日)

Firefoxで正常に閲覧出来なくなってました

既に幾人かの方からメールやコメントにてお知らせいただきましたが、しばらく前からFirefox(1.5.0.9/2.0.0.1)で本ブログを閲覧しようとすると、 トップページの表示が不安定(目次が表示されたりされなかったり、折畳みが効いたり効かなかったり、ツリー化がされたりされなかったり、他)。 個別記事を表示させようとすると、一瞬表示されたかと思ったら、画面がホワイトアウトしてしまう。 とい ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/01/14(日) 03:26 | | コメント (10) | トラックバック (0)

2007年1月13日(土)

【ココログ】『みんなで解決!広場』フレーム版をバージョンアップ

『みんなで解決!広場』フレーム版(関連記事: 【ココログ】「みんなで解決!広場」にサイドメニューを捏造する(笑))をちょっとバージョンアップしてみました。 とりあえず、こちらで試験公開中です。 旧版とはURLが変わっていますのでご注意を。 主な変更点は、 公開用サーバの移行。 これまでHTMLやJavaScript等は@homepage上に、そこからコールされるCGIは自宅サーバ上に、そ ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/01/13(土) 16:25 | | コメント (0) | トラックバック (0)

2007年1月10日(水)

【ココログ】ココニール - CocoNiiru - :ブログ内全文検索CGI

ココログ(*1)のURLを指定してやることで、そのブログにある記事を検索するような CGI を試作してみました。 とりあえず、以下のリンクをクリックして、注意書きをよく読んでからご試用ください。 ココログ全文検索CGI:ココニール - CocoNiiru - (*1) http://~-nifty.com// のような URL を持つココログが対象。 なお、ココニール用の簡単なブック ...
続きを読む

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2007/01/10(水) 02:32 | | コメント (2) | トラックバック (1)

2007年1月07日(日)

バーコードリーダーを買ってみた

タイトル(『書庫のある庵』)に偽り有りとなりつつある本ブログですが(苦笑)、古代ローマ人に習ってまずはインフラ整備から、ということで、蔵書の整理&管理の促進を行うべく(?)、『快読ショップYomupara』さんで、バーコードリーダーを購入してみました。 お値段は送料(¥620)込みで¥9,440(本体:¥8,820)なり。相場がわかっていないので高いのか安いのかは?ですが。 【追記】 型番はDS ...
続きを読む

この記事をニフティクリップβに追加