2009-08-24 5 views
1

以前に選択した数に応じて、新しい入力を作成する複数のオプションの選択フォームを取得して、問題のヘルプを受け取りました。以下のコードは、私はので、私は最後の微調整を支援する必要があるのjQueryを知らないフォーム内のjQueryトリガー

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
<head> 
<title>test</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 
<script type="text/javascript"> 

$(function() 
{ 
    $('#test') 
    .after('<div id="option-inputs"></div>') 
    .find('option').each(function() 
    { 
     var $option = $(this); 
     $option 
     .data('$input', $('<span>' + $option.text() + ': </span><input><br>').appendTo('#option-inputs').hide()) 
     .bind('toggle-input', function() 
     { 
      var $input = $option.data('$input'); 
      if ($option[0].selected) 
      { 
      $input.show(); 
      } else { 
      $input.hide(); 
      }  
     }) 
     .bind('click', function() 
     { 
      $(this).siblings().andSelf().trigger('toggle-input'); 
     }) 
     .trigger('toggle-input') 
     ; 
    }) 
    ; 
}); 


</script> 

</head> 
<body> 

<select id="test" multiple="multiple"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
</select> 

</body> 
</html> 

(クレジットはPeter Baileyに行く)私のために働くことになったものです。私はどのオプションを選択して新しいボックスを作成するかを制限する必要があります。したがって、値が-1または0のオプションが選択されている場合、新しいテキストボックスは作成されません。それ以外は何もしません。

また、他の選択フォームでこれを更新して更新する方法はありますか?通常のjavascriptでは、onChange = ""とそれを更新する関数を使用します。これは、前の選択表の入力に基づいてselect表が動的に取り込まれるためです。以前のselectテーブルに戻って変更を加えた場合、jQueryが更新されず、以前の入力が残っています。

ありがとうございました!

答えて

0

あなたは、<select>のために「initilization」ルーチンを設定する必要があります入力。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
<head> 
<title>test</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 
<script type="text/javascript"> 

$(function() 
{ 
    // How you manage this data is up to you, this is just an example 
    var optionData = { 
     1: { 1: "1.1", 2: "1.2", 3: "1.3" } 
    , 2: { 1: "2.1", 2: "2.2", 3: "2.3" } 
    } 
    var $test = $('#test'); 

    $test.bind('init', function() 
    { 
    $optionInputs = $('#option-inputs'); 
    if (!$optionInputs.length) 
    { 
     $optionInputs = $('<div id="option-inputs"></div>').insertAfter($test); 
    } 
    $optionInputs.children().remove(); 
    $test.find('option').each(function() 
    { 
     var $option = $(this); 
     $option 
     .data('$input', $('<span>' + $option.text() + ': </span><input><br>').appendTo($optionInputs).hide()) 
     .bind('toggle-input', function() 
     { 
      var $input = $option.data('$input'); 
      if ($option[0].selected) 
      { 
      $input.show(); 
      } else { 
      $input.hide(); 
      }  
     }) 
     .bind('click', function() 
     { 
      $(this).siblings().andSelf().trigger('toggle-input'); 
     }) 
     .trigger('toggle-input') 
     ; 
    }); 
    }); 

    $('#changer').bind('change', function() 
    { 
    var $this = $(this) 
     , options = optionData[$this.val()] 
     , optionHtml = ''; 
    ; 

    for (var i in options) 
    { 
     if (options.hasOwnProperty(i)) 
     { 
     optionHtml += '<option value="' + i + '">' + options[i] + '</option>'; 
     } 
    } 
    $test.html(optionHtml).trigger('init'); 
    }).trigger('change'); 
}); 


</script> 

</head> 
<body> 

<select id="changer"> 
    <option value="1">Set 1</option> 
    <option value="2">Set 2</option> 
</select> 

<select id="test" multiple="multiple"> 
</select> 

</body> 
</html> 
+0

これは私が欲しかったよりも少しだと思います。私が欲しいのは、「チェンジャー」が、新しく作成された入力があればそれをクリアすることです。 たとえば、テスト選択で何かを選択して新しい入力が作成された場合、チェンジャーで何かを選択してその新しい入力を削除し、テスト選択で何かを再度選択すると、 –

+0

私は本当に何かが不足しています。なぜなら、あなたの説明からわかるように、これはまさにこれがしていることなのです。 –

0

.eachファンクションコールの先頭にある値を確認し、0または-1の場合は戻り値を返します(これはループのbreakのように機能します)。

if ($option.attr('value') == 0 || $option.attr('value') == -1) return; 

そして、あなたのコード全体のために:それは新しいオプションを受信したとき、それは再セットアップリンクできるように

$(function() 
{ 
    $('#test') 
    .after('<div id="option-inputs"></div>') 
    .find('option').each(function() 
    { 
     var $option = $(this); 
     //new code 
     if ($option.attr('value') == 0 || $option.attr('value') == -1) return; 

     $option 
     .data('$input', $('<span>' + $option.text() + ': </span><input><br>').appendTo('#option-inputs').hide()) 
     .bind('toggle-input', function() 
     { 
      var $input = $option.data('$input'); 
      if ($option[0].selected) 
      { 
      $input.show(); 
      } else { 
      $input.hide(); 
      }  
     }) 
     .bind('click', function() 
     { 
      $(this).siblings().andSelf().trigger('toggle-input'); 
     }) 
     .trigger('toggle-input') 
     ; 
    }) 
    ; 
}); 
関連する問題