どこで読んだのか忘れたがプログラムのバグというのは、朝取れるバグと夜取れるバグ
があるそうだ。夜(つまり、これはコーディングやバグ取りを集中して続けてる間に夜になったという意味)に気付きやすいバグはスペルミスやケアレスミスが多く、朝(一旦作業をはなれ睡眠をとるなり食事するなり頭をリフレッシュした後)に突如天啓のごとく見つかるのが論理的な間違いや大局的な不具合である、といったような感じの話だった。
文章だってキーボードに向かって考えている時より、全然別のことをしているとプロットが浮かんだりする(それで、この程度の文章なんだよ、悪いか)。この法則はHTMLやCSSのソースにも当てはまるかもしれない。なので、スクリプトなんかを作ったら即アップせず、忘れるくらいまで放置するということをたまにやる。時間をおいて読み返すと、アラ不思議「なんで、こーなるの?」というミスを発見するのだ(そのまま本当に忘れてしまうことだってあるのだが)。
さて、前回のスクリプトにはある不具合が存在する。そこを直してみよう。(これは、考え方の考え方みたいなメタネタです。言いたいことはここまでに書いてあります。以下のスクリプトはテストすらしてません。)
という部分が論理的というか、もっと根本的な所で間違えていた(スマン)。FC2ブログでは複数記事を表示していても、それぞれの記事にコメント送信フォームを置くことができる。<form>のIDは一律でないから使えない。が、name属性はユニークなので代用できる。comment[no] の <%pno>こそがブログ全体においてユニークな値である。どこのフォームからsubmitされたかは重要ではないわけだ(と、これは別のネタに繋がりそうな予感)。
前回のスクリプトでは、最初のcomment[body]を見つけた時点で探索を終えていた。これでは2番目以降のフォームから送られた”&”は”&”に変換できない。個別記事だけにコメント送信フォームがあるテンプレでは変換・送信されるだろう(実際にはテストしてません)から、この不具合はひじょーに見つけにくいといえる。
で、修正したコード。
var before_event = null; if ( document.getElementsByTagName ) { var B = document.getElementsByTagName( "BODY" )[0]; if ( typeof B.onload == "function" ) before_event = B.onload; B.onload = function() { if ( before_event ) { before_event; before_event = null; } hoge(); } } function hoge() { if ( document.forms && document.getElementsByTagName ) { with ( document ) { for ( var i=0; ( F = forms[i] ); i++ ) { if ( F.innerHTML.match( /comment\[body\]/ ) ) { if ( typeof F.onsubmit == "function" ) before_event = F.onsubmit; F.onsubmit = function() { if ( before_event ) before_event; for ( var j=0; ( T = this.getElementsByTagName( "*" )[j] ); j++ ) { if ( T.name && T.name == "comment[body]" ) { T.value = T.value.replace( /&/g, "&" ); return true; } } } } } } } } あまり変わってないように見える。前回、送信フォームとコメント文字列を持つ要素の探索は同時に行い、最初に見つけたところで処理を終え(break)ていた。ここを分割しすべてのフォームを調べるようにすれば良い。
修正案では、すべての<form>の探索後、その要素内にcomment[body]の文字列を含んでいれば(実はあやうい判定だ)、そのonsubmitイベントで、はじめてコメント文字列を持つ要素の探索と実体参照化を行うことにする。
複数の(可能性がある)フォームに割り当てられている(可能性がある)他のイベントはすべて同じものではない可能性(こちらはグンと高くなる)があるから、このままではまずい。そゆわけで、またしばらく放置しとくのである。(つづく・・・のか?)
< インターフェイス | DEATH NOTE 10 > | 表紙へ戻る |
>朝取れるバグと夜取れるバグ
な〜るほど、そうだったんですね...
夜、一生懸命細部までチェックして共有に登録して、朝起きてみたら「なんだこりゃ〜〜〜!」という大ボケを発見するという毎度毎度の繰り返し...(__;)
スクリプトへのコメントじゃなくてすみません(・_・)(._.)-08日01時
>夜、一生懸命細部までチェックして
一生懸命が落とし穴な気もしますね。恋は盲目ってやつでしょーか。
-08日20時
夜中書いた手紙は、朝読み直してから出さなきゃダメって聞きますよね?
ん?全然違う?-08日23時
上の法則のとおりですね。
ひとつ例外があって、ラブレターは書いたら読み返してはいけません。翌日でも10年後でも、です。-09日20時
>ラブレターは書いたら読み返してはいけません。翌日でも10年後でも、です。
ステキなお言葉〜!┣¨キ(*゚д゚*)┣¨キ-09日21時
中島みゆき/ひとり http://muryo.xrea.jp/song/121018023.html
小椋佳/時 (詞が見つからず)
-10日21時
小椋佳さんの「時」の歌詞、見付けること出来たよ。
塚原将さんと言う詩人さん(なのかな)が作詞なさってて
この歌は中村雅俊さんも歌っていらっしゃったみたい。
でも歌詞サイトには載っていなくてね
そしたらファンのお方のブログで詩を紹介してくださっていたよ。
「いつか手紙に書くはずの
朝まで探した言の葉は
今でも心に住んでます
時がすべて流すなんて
だれが言ったのですか」
(著作権とかで↑ダメだったら消してね)-12日13時
マセたガキでした。
返信をネタにさせていただきました。
→ http://sug.blog2.fc2.com/blog-entry-384.html-12日20時
聡明なお坊ちゃんだったんじゃない?^^
スクリプトの記事に妙なコメントいっぱい入れちゃったけど記事がひとつ生まれたなんて嬉しいな〜!-13日13時
よりみちブログと呼んでください。-13日19時