はい、今日はこれで半日以上潰してしまいました… orz
発端は、Ajaxを利用してHTMLで戻ってきたフォームをダイアログウィンドウへ表示し、入力を取得しようとしたけどデータが取得できなかった、というものだ。
Ajaxは利用せず、それを簡略化したソースです。
<html> <head> <title>Test Dialog</title> <link rel="stylesheet" href="css/redmond/jquery-ui-1.8.5.custom.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/jquery-ui-1.8.5.custom.min.js"></script> <script type="text/javascript"> get_name = function() { var md = $("<div><input id=\"name\" type=\"text\" value=\"\" /></div>"); md.dialog( { modal: true, height: 100, width: 200, title: 'Input Dialog', resizable: false, buttons: { "OK": function() { alert($("#name").val()); $(this).dialog('close'); }, "CANCEL": function() { $(this).dialog('close'); }, } }); } </script> </head> <body> <h1>UI Dialog Test</h1> <input type="button" value="Fail Open" onclick="get_name()" /><br /> </body> </html>
これは「Fail Open」ボタンを押すとダイアログが開き、入力域に文字を入れて「OK」をクリックすると、次のように入力した文字をアラート表示する、というものだ。
ところが続いて同じことをしても input にタイプした内容が表示されず、前回の値がそのまま表示されるのだ。
これだと、繰り返し利用することができない。頭が痛い~。
しかし、jQuery UI のデモサイトでは、同じようなことはおきていない。違うバージョンなどいろいろ試して見て、ようやくどうすればそうならずに利用できるか分かった。そのソースが次だ。
<html> <head> <title>Test Dialog</title> <link rel="stylesheet" href="css/redmond/jquery-ui-1.8.5.custom.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/jquery-ui-1.8.5.custom.min.js"></script> <script type="text/javascript"> get_good_name = function() { $("#input_dialog").dialog( { modal: true, height: 100, width: 200, title: 'Input Dialog', resizable: false, buttons: { "OK": function() { alert($("#good_name").val()); $(this).dialog('close'); }, "CANCEL": function() { $(this).dialog('close'); }, } }); } </script> </head> <body> <h1>UI Dialog Test</h1> <input type="button" value="Good Open" onclick="get_good_name()" /> <div id="input_dialog" style="display:none"> <div> <input type="text" id="good_name" val="" /> </div> </div> </body> </html>
見ての通り、違いは「<input type=”text” />」を予めHTMLソースに忍ばせておくか、JavaScriptで追加するかだ。今のところ動的に追加したtextタイプでは、入力された値は正常に取り出せないようだ。
ただし同じ動的なinputでもradioタイプでは、valueで指定した値をval()で正しく取得できた。
jQuery 1.4.2 jQuery UI 1.8.5