フォーム送信前にJavaScriptでdisabled解除

Posted by joeartsea on 2009-03-06

意外と知らない人も多いinput要素(HTML)でのdisabled。変更できないテキストボックスをHTMLだけで手軽に表現できます。見た目はテキストボックスの中の色がグレーになっていかにも「変更できませんよー」という感じです。似た属性にreadonlyというものがありますが、こちらは見た目が通常のテキストボックスと変わらないのでちょっと紛らわしいかもしれません。

CakePHPのFormヘルパーでも属性に指定することで手軽に入力できないテキストボックスが表現できます。もちろんテキストボックスだけでなくdisabledなら他の要素にも使用できます。

1
2
3
//CakePHPのFormヘルパーで入力不可の要素を生成する場合
e($form->input('password', array('label' => 'パスワード', 'disabled' => 'disabled')));
e($form->input('password', array('label' => 'パスワード', 'readonly' => 'readonly')));

しかし気をつけなければいけない点があります。disabledを指定した要素はreadonlyのような「読み取り専用」ではなく「使用不可」という意味になります。したがってdisabledを指定した要素の値はフォームを送信してもサーバ側には渡らないのです。それを回避する方法は以下のような感じではないでしょうか。

  • 送信したい値をhidden, cookie, sessionなどで持ちまわす
  • 値を送信したい要素はdisabledを使わずreadonlyを使いCSSで見た目を変える
  • disabledを使いフォーム送信前にJavaScriptでdisabledを解除する

今回は最後のJavaScriptでの方法を書いておきます。

dump.php

1
<?php print_r($_POST); ?>

test.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<head>
<title>テスト</title>
<script type="text/javascript">
<!--
function undisabled()
{
document.getElementById(&#39;text&#39;).disabled = null;
return true;
}
-->
</script>
</head>
<body>
<form method="post" action="dump.php">
<input type="text" name="text" id="text" value="テスト" disabled="disabled" />
<input type="submit" value="送信" onclick="undisabled()" />
</form>
</body>
</html>

ん~でも現実的なのはreadonlyでCSS加工かな~。なんかすごい複雑なことする時の参考にでもどうぞ。