Извините за заголовок, я действительно не знаю, как просто задать этот вопрос. У меня есть функция, которая клонирует TR со всеми его дочерними элементами и переименовывает их все (идентификатор и имя), добавляет клон под оригиналом. Одним из элементов в TR (в настоящее время только один, скоро будет 4) является виджет автозаполнения пользовательского интерфейса jQuery.
Итак, моя первая проблема в том, что когда добавляется новый TR, видящий автозаполнение виджет больше не является автозаполнением виджета - это просто старое текстовое поле. Это имеет смысл, потому что мне нужно применить новый $ (foo) .autocomplete (bar) к вновь созданному элементу.
Так что моя следующая проблема возникает, когда я пытаюсь повторно применить $ (foo) .autocomplete (bar) к клонированному элементу, который, кажется, меняет оригинальный элемент вместо нового клона! Я вызываю $ (foo) .autocomplete (bar) одновременно с внесением других изменений в те же элементы, и эти другие изменения работают нормально (идентификаторы и имена). После клонирования TR оригинал ведет себя именно так, как должен делать клон, и клон в основном ничего не делает!
Извините за длинное объяснение, вот код:
function cloneBelow(TR) {
var newRow = $(TR).clone();
var lastID = $(TR).attr('id');
var currID = Number(lastID.substring(3));
var newID = currID;
var i = 0;
while(i < 1){
newID = newID + 1;
if($(('#tr_' + newID).replace(/\./g, "\\.")).length < 1){
i = 1;
}
}
$(newRow).attr('id','tr_'+newID);
$(TR).after(newRow);
var i = 0;
$('#tr_'+newID).find("[type=text],td,.cellContent").each(function(){
var child = $(this);
var newVal = child.attr("id");
newVal = newVal.substring(0,newVal.indexOf("_")+1) +newID+newVal.substring(newVal.lastIndexOf("_"));
child.attr("id", newVal);
//apply changes to form autocomplete fields:
if($(child).attr('name')){ //this will filter out any non-text fields
child.attr("name", newVal);
//Begin code to make element a autocomplete widget
var tmpArray = ["test1","test2","test10"];
$(child).autocomplete({
source: tmpArray,
select: function(event, ui) {
var CTId = $(child).attr("id").substr(3);
var selectedObj = ui.item;
$('#CT_'+CTId).html(selectedObj.value);},
minLength: 0
}).addClass("ui-widget ui-widget-content ui-corner-left");
alert($(child).attr("id")+" - "+tmpArray);
}
});
$(".target").contextmenu(option);
}
Я не очень опытен с jQuery (как вы, вероятно, можете сказать), я работал над бесчисленными проблемами с этим проектом, и я очень близко подхожу.
EDIT:
Я попытался использовать метод .autocomplete ("destroy"), чтобы вернуть клонированный элемент обратно в простое текстовое поле, чтобы затем я мог повторно применить .autocomplete (), и он фактически удалил его из обоих элементов - не то, что я хотел. Однако я узнал, что пользовательский интерфейс jQuery не поддерживает клонирование, поэтому очевидно, что он клонирует элемент, но клон и оригинал используют один и тот же виджет или что-то еще.
Я все еще ищу рекурсивное решение этой проблемы, поскольку у меня есть 4 аналогичных функции и 7 различных элементов в строке, которые необходимо автозаполнять - очевидно, я не хочу копировать и вставлять код 28 раз и повторять каждый раз, когда я что-то меняю.