#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 — это просто прототип для справки, поэтому он может содержать некоторые незначительные опечатки.