Использование автозаполнения с элементами «на лету»

#php #javascript #jquery

#php #javascript #jquery

Вопрос:

У меня есть автозаполнение, вложенное в jquery, который создает текстовые элементы «на лету». Автозаполнение корректно работает с #url текстовым полем в каждом текстовом поле, которое я создаю, однако я не могу заставить его работать с полем цены.

Это работает, только если nextUrlId не увеличивается каждый раз, когда я нажимаю «Добавить» (без nextUrlId ). Из-за этого я не могу автоматически заполнить поле цены при выборе из автозаполнения.

Это не работает:

     $('#AddUrl').click(function(){
        $('<p />').attr('id', 'urlParagraph'   nextUrlId)
                  .text("URL: ")
                  .appendTo('#inputBoxes');
        $( "#url" nextUrlId ).catcomplete({
         delay: 0,
         minLength : 2,
         source: "searchsku.php",
           select: function(event, ui){
           $("#price" nextUrlId).val(ui.item.price)}
    });
    NextUrlId  
 

HTML:

 <div id="inputBoxes">
   <table border="1">
       <tr>
         <td><p id="nameParagraph">Name: <input type="text" id="name" /></p>    </td>
       </tr>
       <tr>
         <td><p id="urlParagraph1">URL: <input type="text" id="url1" /></p> </td>
       </tr>
    </table>        
</div>
 

Комментарии:

1. Не могли бы вы также опубликовать HTML? Я не могу точно сказать, что происходит с вашим сообщением, может быть, также опубликовать дополнительную информацию?

Ответ №1:

Если я правильно понял, у вас есть два связанных поля для каждого URL. Один с полем автозаполнения, а другой с ценой. В зависимости от записи автозаполнения поле цены должно изменять значение. Я не тестировал это, но я считаю, что что-то подобное должно работать хорошо. Вместо того, чтобы отслеживать идентификаторы, вы просто смотрите на дочерний элемент поля автозаполнения. Много способов сделать это, два примера ниже, в предпочтительном порядке.

 <div id="inputBoxes">
  <p class="inputbox">
    <input type="text" class="autocompleter" name="autocompleter[]">
    <input type="text" name="price[]" class="price">
  </p>
  <input type="button" value="Add" id="addURL">
</div>
 

Решение 1

 $(".inputbox").find(".autocompleter").catcomplete({
  delay: 0,
  minLength : 2,
  source: "searchsku.php",
  select: function(event, ui){
    $(this).siblings(".price").val(ui.item.price);
  }
});
 
 $("#addURL").bind("click",function(){
  var last = $(".inputbox").last();
  var newItem = last.clone()
  newItem.insertAfter(last);
  newItem.find(".autocompleter").catcomplete({
    delay: 0,
    minLength : 2,
    source: "searchsku.php",
    select: function(event, ui){
      $(this).siblings(".price").val(ui.item.price);
    }
  });
});
 

Решение 2

Если вы предпочитаете фиксированную связь между полем автозаполнения и полями цены в каждом абзаце, я бы сделал что-то вроде этого.

 <div id="inputBoxes">
  <p class="inputbox">
    <input type="text" rel="1" class="autocompleter" name="autocompleter[]">
    <input type="text" rel="1" name="price[]" class="price">
  </p>
  <input type="button" value="Add" id="addURL">
</div>
 
 $(".inputbox").find(".autocompleter").catcomplete({
  delay: 0,
  minLength : 2,
  source: "searchsku.php",
  select: function(event, ui){
    $('.price[rel="' $(this).attr("rel") '"]').val(ui.item.price);
  }
});
 
 $("#addURL").bind("click",function(){
  var last = $(".inputbox").last();
  var newItem = last.clone()
  newItem.insertAfter(last);
  var lastRel = last.find(".autocompleter").attr("rel");
  newItem.find(".autocompleter").attr("rel",lastRel 1);
  newItem.find(".price").attr("rel",lastRel 1);

  newItem.find(".autocompleter").catcomplete({
    delay: 0,
    minLength : 2,
    source: "searchsku.php",
    select: function(event, ui){
      $('.price[rel="' $(this).attr("rel") '"]').val(ui.item.price);
    }
  });
});
 

Комментарии:

1. хм, похоже, не работает. Я также боюсь, что, как только я нажму, чтобы создать новый элемент, изменение исходного текстового поля не приведет к изменению цены, потому что к тому времени последние и новые изменились.. Надеялся на более элегантный подход по идентификатору. Но по какой-то причине я не могу заставить вложенный объект $ принимать динамическую переменную, привязанную к имени объекта. является ли это ограничением jquery?

2. Правда, вам также необходимо инициализировать автозаполнение для старого поля. Похожа ли структура HTML на то, что вы используете? Я бы все же рекомендовал посмотреть на родственного; но вы всегда можете добавить соединение между автозаполнителем и pricefield. Но если, так почему бы не добавить идентификатор в содержащий абзац? Я протестирую его на HTML-странице и отредактирую в нем как два отдельных решения.

3. извините, что вы имеете в виду под старым полем? исходное поле имеет отдельный автозаполнитель (не включен в текст выше).

4. Извините. Со старым полем я имею в виду исходное поле. Я не добавлял к этому автозаполнение. Если он у вас есть с тех пор, как раньше, он должен работать нормально, поскольку при клонировании элементов к каждому новому элементу добавляется automcompleter. Естественно, вы могли бы сделать это и с идентификаторами, если вы действительно предпочитаете. Но для этого вам нужно будет использовать больше кода. Я внес некоторые изменения выше, протестировал первый с помощью плагина common autocompleter. Second — это просто прототип для справки, поэтому он может содержать некоторые незначительные опечатки.