正しく書いた属性が、置き場所を変えたら邪魔になりました

前の工程で書いた1行が、次の工程で動作を止めていました。
書いた当時は正しくて、間違いを直したわけでもありません。
置かれた場所が変わったので、正しさの向きが変わった、という話です。

目次

前の工程では、正しかった

カードを並び替える ↑↓ のボタンは、見た目だけ先に作りました。
中身がまだ無いので、押しても何も起きません。

そのとき、送信を起こさない指定を付けました。
フォームの中にあるボタンは、既定では押すと送信が起きます。
まだ中身が無いのに送信されると困るので、起こさないようにする。
当時の書き方としては正しくて、意図の表明にもなっていました。

次の工程で、動かなくなった

翌日、そのボタンを実際に動くようにしました。
フォームで包んで、押したらサーバー側の処理が呼ばれる形にしました。

押しても、何も起きません。
無反応でした。

原因は、前に付けた「送信を起こさない指定」が残っていたことでした。
フォームは正しく組んであるのに、そのボタンだけが送信を起こしません。
当時の正しさが、そのまま障害になっていました。

同じ症状が3回、原因は毎回違った

この「押しても何も起きない」は、2日で3回目でした。

症状 原因
1回目 保存を押しても何も起きない 実装側の不具合
2回目 保存を押しても何も起きない クリックが送信を起こしていなかった
3回目 ↑↓ を押しても何も起きない 送信を起こさない指定が残っていた

3回とも見え方は同じです。
ボタンを押して、画面が変わらない。
原因の層は、実装・操作・過去の自分の意図と、毎回違いました。

「押しても何も起きない」は症状であって、原因ではありませんでした。
2回経験しても、3回目の原因は当てられませんでした。
毎回別でした。

そもそもなぜフォームなのか

ついでに書いておくと、クリックの処理を書くのではなくフォームにしたのには理由があります。

必要なもの JavaScript が無効なら
クリックの処理 ブラウザ側で動くコード 動かない
フォーム なし 動く

このファイルは、ブラウザに JavaScript を1バイトも送っていません。
サーバー側で組み立てて返すだけの作りです。
だからフォームである以上、送信を起こせるのは送信ボタンだけ、という単純な話でした。

前の工程の指定が残っていると、そのボタンは送信ボタンではなくなります。
仕様どおりに動いていただけでした。
バグではありません。

前の自分を疑うときは、前提の変化を探す

持ち帰ったのは、過去に書いたものの見方です。

前の自分が書いたものが動かないとき、つい間違い探しをします。
今回は、間違いは1つもありませんでした。
ゼロです。
変わったのは前提のほうで、ボタンがフォームの中に入ったことでした。

属性は動作の指定であると同時に、そのときの意図の表明でもあります。
意図が変わったら、見直す対象になる。
「間違っているところを探す」より「前提が変わったところを探す」ほうが、今回は早い道でした。

目次