JavaScriptの最近のブログ記事

まあ、択一選択にしたければ、最初からラジオボタンかセレクトボックスでフォームパーツを作ればいいのだが、場合によってはチェックボックスで択一選択のフォームを作りたいこともある。(多分そうそう機会はないと思うが)

例えばパラメタの都合上、各inputのname属性の値を別々にしたいときとか。
ラジオボタンでも、name属性の値が違えば、どちらもチェックできてしまう。

以下のようなチェックボックスのフォームが合った場合、

----------------------------------------------------------------------------------
<div class='parts_list'>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_A' value='1'> 選択肢A
    </td>
   </tr>
  </table>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_B' value='1'> 選択肢B
    </td>
   </tr>
  </table>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_C' value='1> 選択肢C
    </td>
   </tr>
  </table>
</div>
----------------------------------------------------------------------------------

これだと、そのままでは全てのチェックボックスにチェックを入れることができてしまうので、これをjQeryで制御する。
簡単にいえば、チェックされた以外のチェックボックスのチェックを外す。

以下が改良版。

----------------------------------------------------------------------------------
<script type="text/javascript" src='jquery.js'></script>

<script type="text/javascript">
 $(function(){

  $("div.parts_list table").each(
   $("input:checkbox",this).click(
    // チェックボックスをチェックした時のイベント開始
    function(){
     // 親要素(table)のセレクタ取得
     var parent = $(this).closest("table");
     // これより前のtableに対する処理
     parent.prevAll().each(
      function(){
       // チェックを外す
       $("input:checkbox",this).attr("checked",false);
      }
     );
     // これより後ろのtableに対する処理
     parent.nextAll().each(
      function(){
       // チェックを外す
       $("input:checkbox",this).attr("checked",false);
      }
     );
     // チェックボックスをチェックした時のイベント終了
    }
   ) // click閉じ
  ) // each閉じ

 )); // function閉じ
</script>


<div class='parts_list'>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_A' value='1'> 選択肢A
    </td>
   </tr>
  </table>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_B' value='1'> 選択肢B
    </td>
   </tr>
  </table>
  <table>
   <tr>
    <td>
     <input type='checkbox' name='check_C' value='1> 選択肢C
    </td>
   </tr>
  </table>
</div>
----------------------------------------------------------------------------------


以上。

jqueryは便利だなーやっぱり。

やりたいこと。

javascriptで画像ファイルの一覧を表示
    ↓
一覧から一つの画像を選択
    ↓
javascriptでその画像のサイズ指定画面を表示
    ↓
サイズを入力しOKを押すと画像名とサイズを表示
(実務的には、その情報をテキストエリアに入力させたりする)



【HTML】
<!-- JSファイル読み込み -->
<script type="text/javascript" src='./transition.js'></script>


<!-- 事前に遷移画面は用意しおき、隠しておく-->

<!-- 画像選択画面 -->
<div id="confirm1" style='visibility:hidden;position:absolute;'>
 <div>
  <div style="float:left;padding:3px;">
   <b>画像一覧</b>
  </div>
 <div style='text-align:right;padding:3px;'>
  <a href="javascript:void(0)" onclick="close_img_list();">閉じる</a>
 </div>
 <div style='overflow:auto;'>
  <table>
 <tr>
    <td style="padding:4px;">
     <!-- 画像のイメージと画像ファイル名 -->
     <div style="overflow:hidden;float:left;">
      <div style='clear:both;overflow:hidden;'>
       <img src='./hoge/hoge.gif' />
      </div>
      <div>
        <a href="javascript:void(0)" onclick="show_given_size('hoge.gif');">hoge.gif<a/>
      </div>
     </div>
        ・
        ・
        ・
    </td>
   </tr>
  </table>
 </div>
</div>

<!-- 画像サイズ指定画面 -->
<div id="confirm2" style='visibility:hidden;position:absolute;'>
 <div>
  <div style="padding:3px;">
   <b>画像サイズ指定</b>
  </div>
  <div style='padding:3px;'>
   <a href="javascript:void(0)" onclick="close_given_size();">閉じる</a>
  </div>
 </div>
 <div>
  <table>
   <tr>
    <td>
     画像の縦横サイズを指定してください
    </td>
   </tr>
   <tr>
    <td>
     <form name='given_size' action='#'>
      W <input type='text' name='img_w' value='' /> px × H <input type='text' name='img_h' value='' /> px
<input type='button' name='ok' value='O K' onclick="alert(get_img_info\(\),'');close_given_size();" />
      <input type='hidden' name='img_name' value='' />
     </form>
    </td>
   </tr>
  </table>
 </div>
</div>


<!-- 初期画面 -->
<div>
 <a href='javascript:void(0)' onclick="show_img_list()">画像一覧を表示</a>
</div>


【javascript(transition.js)】

// 画像一覧表示
function show_img_list() {
 document.getElementById("confirm1").style.visibility="visible";
}

// 画像サイズ指定画面表示
function show_given_size(name) {
document.getElementById("confirm2").style.visibility="visible";
document.given_size.img_name.value = name;
}

// 画像一覧を非表示
function close_img_list() {
document.getElementById("confirm1").style.visibility="hidden";
}

// 画像サイズ指定画面を非表示
function close_given_size() {
document.getElementById("confirm2").style.visibility="hidden";
}

// 画像名と画像サイズを組み合わせて返却
function get_img_info(){
var img_name = document.given_size.img_name.value;
var img_w = parseFloat(document.given_size.img_w.value);
var img_h = parseFloat(document.given_size.img_h.value);
if((!img_h) || (!img_w) || (img_h < 1) || (img_w < 1) ){
alert("サイズは1以上の半角数字で指定してください");
}
return '画像ファイル名は' + img_name + 'で、サイズは横が' + img_w + 'PX、縦が' + img_h + 'PXです。';
}


------------------------------------------------------------------------

※ポイントは、hidennフィールドに後から値を付け足すということ。
テキストエリア挿入支援処理などを行うjavascriptの処理時に発見したこと。

Vista+IE8の環境で「getElementById("moji")」とかやるとなぜかエラーになる。

内容は「オブジェクトがありません」とのこと。


無いわけない。

ちゃんとid属性もname属性も指定して、値も一緒にしている。


ためしに、

getElementById(moji)

とやったら、「'moji'は定義されていません」というエラー。
まあ、当たり前だわな。

しかし、

getElementById('moji')

とやると、うまくいく。


IE7の時はこのエラーが出なかったような記憶がアルのだが・・・

協調性を無視し我が道をいくMicrosoftに感謝。


しかし何回も何回もソースを見直してたのがバカみたいだ。


最近はどの言語でも"moji"と書いたら文字列で処理するだろが。普通は。
よく使うのだが、なぜか忘れやすいのでメモ。


<html>
<head>
<script type="text/javascript">
 var count;
 function BoxChecked(check){
  for(count = 0; count < document.form1.checked_user.length; count++){
   document.form1.checked_user[count].checked = check;
  }
}
</script>
</head>
<body>
<form name='form1' action='' method='post'>

全てチェックを
<input type='button' onClick='BoxChecked(true);' value='入れる'>
<input type='button' onClick='BoxChecked(false);' value='外す'>

<input type='checkbox' name='checked_user' value='1'>
<input type='checkbox' name='checked_user' value='2'>
    ・
    ・
    ・

</form>
</body>
</html>
これに関していいものはないかと探していたら、素晴らしいスクリプトを
見つけた。
とても便利なのでかなりブックマークされてるようだ。

→ http://painter.mypets.ws/~raelian/tag/enclose.html

ボタンを押すだけで、テキストエリアのカーソルの位置に任意の文字が、ポンと
挿入できるスグレモノ。


さっそくMIlkyStepにも取り入れようということで・・・イタダキ。

基本的にHTMLタグとかスタイルシートとか編集する目的なので、文字をドラッグして
反転した場合は、実行すると、選択した文字列の前後でタグで挟むような仕様に
なっている。

これを、選択した文字を残さずに、挿入文字にそのまま置き換えるには、
「textarea.js」61行目あたりの、

el.value=click_s + s + click_m + e + click_e; を、
     ↓
el.value=click_s + s + e + click_e;

とすることで対応可能。


また、タグで挟むんじゃなくて、ただ単にある文字だけを挿入したい場合、
ボタンの要素指定時に、

<input type='button name='insbtn' value='挿入' onclick=\"enclose('hogehoge','');return false;\">

などとして、関数に渡す第2引数を空にしてやればOK。

第2引数を指定しないと、undefinedが返されるので注意。