Harukiya Archives

2006/02/07

category / javascript

どこで読んだのか忘れたがプログラムのバグというのは、朝取れるバグと夜取れるバグがあるそうだ。夜(つまり、これはコーディングやバグ取りを集中して続けてる間に夜になったという意味)に気付きやすいバグはスペルミスやケアレスミスが多く、朝(一旦作業をはなれ睡眠をとるなり食事するなり頭をリフレッシュした後)に突如天啓のごとく見つかるのが論理的な間違いや大局的な不具合である、といったような感じの話だった。

文章だってキーボードに向かって考えている時より、全然別のことをしているとプロットが浮かんだりする(それで、この程度の文章なんだよ、悪いか)。この法則はHTMLやCSSのソースにも当てはまるかもしれない。なので、スクリプトなんかを作ったら即アップせず、忘れるくらいまで放置するということをたまにやる。時間をおいて読み返すと、アラ不思議「なんで、こーなるの?」というミスを発見するのだ(そのまま本当に忘れてしまうことだってあるのだが)。

さて、前回のスクリプトにはある不具合が存在する。そこを直してみよう。(これは、考え方の考え方みたいなメタネタです。言いたいことはここまでに書いてあります。以下のスクリプトはテストすらしてません。

<form>のIDは一律でないから使えない。が、name属性はユニークなので代用できる。という部分が論理的というか、もっと根本的な所で間違えていた(スマン)。FC2ブログでは複数記事を表示していても、それぞれの記事にコメント送信フォームを置くことができる。comment[no] の <%pno>こそがブログ全体においてユニークな値である。どこのフォームからsubmitされたかは重要ではないわけだ(と、これは別のネタに繋がりそうな予感)。

前回のスクリプトでは、最初のcomment[body]を見つけた時点で探索を終えていた。これでは2番目以降のフォームから送られた”&”は”&amp;”に変換できない。個別記事だけにコメント送信フォームがあるテンプレでは変換・送信されるだろう(実際にはテストしてません)から、この不具合はひじょーに見つけにくいといえる。

で、修正したコード。

  1. var before_event = null;
  2. if ( document.getElementsByTagName ) {
  3.  var B = document.getElementsByTagName( "BODY" )[0];
  4.  if ( typeof B.onload == "function" ) before_event = B.onload;
  5.  B.onload = function() {
  6.   if ( before_event ) {
  7.    before_event;
  8.    before_event = null;
  9.   }
  10.   hoge();
  11.  }
  12. }
  13. function hoge() {
  14.  if ( document.forms && document.getElementsByTagName ) {
  15.   with ( document ) {
  16.    for ( var i=0; ( F = forms[i] ); i++ ) {
  17.     if ( F.innerHTML.match( /comment\[body\]/ ) ) {
  18.      if ( typeof F.onsubmit == "function" ) before_event = F.onsubmit;
  19.      F.onsubmit = function() {
  20.       if ( before_event ) before_event;
  21.       for ( var j=0; ( T = this.getElementsByTagName( "*" )[j] ); j++ ) {
  22.        if ( T.name && T.name == "comment[body]" ) {
  23.         T.value = T.value.replace( /&/g, "&amp;" );
  24.         return true;
  25.        }
  26.       }
  27.      }
  28.     }
  29.    }
  30.   }
  31.  }
  32. }

あまり変わってないように見える。前回、送信フォームとコメント文字列を持つ要素の探索は同時に行い、最初に見つけたところで処理を終え(break)ていた。ここを分割しすべてのフォームを調べるようにすれば良い。

修正案では、すべての<form>の探索後、その要素内にcomment[body]の文字列を含んでいれば(実はあやうい判定だ)、そのonsubmitイベントで、はじめてコメント文字列を持つ要素の探索と実体参照化を行うことにする。

複数の(可能性がある)フォームに割り当てられている(可能性がある)他のイベントはすべて同じものではない可能性(こちらはグンと高くなる)があるから、このままではまずい。そゆわけで、またしばらく放置しとくのである。(つづく・・・のか?)


writeback

  1. Chako : お久しぶりです。きっと今年初です(笑)今朝の雪は大丈夫でしたか?
    >朝取れるバグと夜取れるバグ
    な〜るほど、そうだったんですね...
    夜、一生懸命細部までチェックして共有に登録して、朝起きてみたら「なんだこりゃ〜〜〜!」という大ボケを発見するという毎度毎度の繰り返し...(__;)

    スクリプトへのコメントじゃなくてすみません(・_・)(._.)-08日01時
  2. マス : 今年もよろしくー(って2月)

    >夜、一生懸命細部までチェックして
    一生懸命が落とし穴な気もしますね。恋は盲目ってやつでしょーか。
    -08日20時
  3. kotori。 : 2月もよろしくー
    夜中書いた手紙は、朝読み直してから出さなきゃダメって聞きますよね?
    ん?全然違う?-08日23時
  4. マス : >夜中書いた手紙は、朝読み直してから出さなきゃダメ
    上の法則のとおりですね。

    ひとつ例外があって、ラブレターは書いたら読み返してはいけません。翌日でも10年後でも、です。-09日20時
  5. kotori。 : あら。。
    >ラブレターは書いたら読み返してはいけません。翌日でも10年後でも、です。

    ステキなお言葉〜!┣¨キ(*゚д゚*)┣¨キ-09日21時
  6. マス : .
    中島みゆき/ひとり http://muryo.xrea.jp/song/121018023.html
    小椋佳/時 (詞が見つからず)

    -10日21時
  7. kotori。 : 歌詞の紹介をありがとうね^^

    小椋佳さんの「時」の歌詞、見付けること出来たよ。
    塚原将さんと言う詩人さん(なのかな)が作詞なさってて
    この歌は中村雅俊さんも歌っていらっしゃったみたい。
    でも歌詞サイトには載っていなくてね
    そしたらファンのお方のブログで詩を紹介してくださっていたよ。

    「いつか手紙に書くはずの
     朝まで探した言の葉は
     今でも心に住んでます
     時がすべて流すなんて
     だれが言ったのですか」

    (著作権とかで↑ダメだったら消してね)-12日13時
  8. マス : 小椋佳の”時”は中2〜3の頃だったか・・・
    マセたガキでした。

    返信をネタにさせていただきました。
    http://sug.blog2.fc2.com/blog-entry-384.html-12日20時
  9. kotori。 : おませと言うか、
    聡明なお坊ちゃんだったんじゃない?^^

    スクリプトの記事に妙なコメントいっぱい入れちゃったけど記事がひとつ生まれたなんて嬉しいな〜!-13日13時
  10. マス : 確固たる目的地点がないので、なりゆきでエントリされていきます。
    よりみちブログと呼んでください。-13日19時
  11.  


< インターフェイス | DEATH NOTE 10 > | 表紙へ戻る | 探す | 案内


ホームページ アフィリエイト レンタルサーバー FC2ブログ キャッシング