JQuery запускает в форме - PullRequest
       10

JQuery запускает в форме

1 голос
/ 25 августа 2009

Ранее я получал помощь по проблеме, получая форму выбора нескольких вариантов для создания новых входных данных, в зависимости от того, сколько было выбрано. Приведенный ниже код работает на меня (кредит идет на Питер Бэйли )

<!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>

Я не знаю jQuery, поэтому мне нужна помощь с последней настройкой. Мне нужно иметь возможность ограничить выбранные параметры для создания новых полей. Таким образом, если выбран параметр со значением -1 или 0, новое текстовое поле не создается. Все остальное делает.

Также есть ли способ заставить другие формы выбора вызывать это для обновления? В обычном javascript вы будете использовать onChange = "" и функцию для его обновления. Причина этого заключается в том, что таблица выбора заполняется динамически на основе входных данных предыдущей таблицы выбора. Если вы вернетесь и внесете изменения в предыдущую таблицу выбора, она не обновит jQuery, предыдущие входные данные останутся.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 августа 2009

Вам необходимо настроить процедуру «инициализации» для <select>, чтобы при получении новых опций он мог переустанавливать связанные входы.

<!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 голосов
/ 25 августа 2009

Быстрое и простое решение - проверить значение в верхней части вызова функции .each, а если оно равно 0 или -1, вернуть (что работает как break в цикле .each).

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' )
      ;
    })
  ;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...