2009-04-24 2 views
1

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

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
      .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
      .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
      .appendTo('#ingredients') 
      .hide() 
      .fadeIn('normal'); 
     }); 
</script> 

<script> 
    $(document).ready(function(){ 
     var data = "http://mywebsite.com/ingredients.php"; 
     $(".ingredient").autocomplete(data); 
    }); 
</script> 


<ul id="ingredients"> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
</ul> 
+0

Используйте tvanfosson в. – Kezzer

ответ

3

Вам необходимо перезапустить автозаполнение нового элемента после его добавления в DOM. Следующее будет ждать, пока элемент не исчезнет, ​​а затем настроит автозаполнение нового элемента с правильным классом.

<script type="text/javascript"> 
    var data = "http://mywebsite.com/ingredients.php"; 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
      .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
      .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
      .appendTo('#ingredients') 
      .hide() 
      .fadeIn('normal', function() { 
       $(this).find('.ingredient').autocomplete(data); 
      }); 
     }); 
     $(".ingredient").autocomplete(data); 
    }); 
</script> 
+0

Мне просто нужно сейчас проверить кеширование данных URL. Hrm. –

1

Проблема заключается в том, что автозаполнение только инициализируется при загрузке страницы. Таким образом, это не добавляется к динамически добавленным входам. Вы должны добавить автозаполнение к этим, снова вызвав автозаполнение. Поэтому после того, как вы apended новый вход просто вызовите функцию автозаполнения снова:

$(".ingredient").autocomplete(data); 
+0

Я пробовал, и это не сработало. –

+0

Или, возможно, я сделал это неправильно. –

+0

Это «не сработало», потому что я не использовал его правильно. Другой код сделал его явным, как использовать его, поэтому я принял его. Это было очень близко. –

2

Потому что вы делаете автозаполнения, прежде чем новый будет создан. Он не просто автоматически применяет его, он только делает это, когда DOM готов.

<script type="text/javascript"> 

$(document).ready(function() { 
    $('#addingredient').click(function() { 
     $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
     .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
     .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
     .appendTo('#ingredients') 
     .hide() 
     .fadeIn('normal'); 

     var data = "http://mywebsite.com/ingredients.php"; 
     $('.ingredient').autocomplete(data); 
    }); 
} 

</script> 

Попробуйте это вместо этого.

+2

Это приведет к повторному автозаполнению всех элементов, а не только нового. Это, наверное, хорошо, но слишком много. – tvanfosson

+0

Да, я думал об этом, поскольку это то, что я сделал. Если это для небольшой суммы, это не должно быть слишком большим давлением на браузер. – Kezzer

+0

Просто интересно, как это от этого зависит от моего ответа? (На какой d03boy прокомментировал, что это не работает) –

0

Улучшение на предыдущий ответ на tvanfosson (предотвращение ненужного DOM поиск): ответ

<script type="text/javascript"> 
    var data = "http://mywebsite.com/ingredients.php"; 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      var newIngredient = $('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />'); 
      $('<li />').append(newIngredient) 
       .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
       .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
       .appendTo('#ingredients') 
       .hide() 
       .fadeIn('normal'); 
      newIngredient.autocomplete(data); 
     }); 
     $(".ingredient").autocomplete(data); 
    }); 
</script>