对不起,我真的不知道如何简单地提出这个问题。我有一个函数,克隆一个TR及其所有子元素并重命名它们(id和name),它将克隆添加到原始元素下面。TR中的一个元素(目前只有一个,很快会变成4个)是一个jQuery UI自动完成小部件。
所以我的第一个问题是,当新的TR被添加时,继承的自动完成小部件不再是一个自动完成小部件—它只是一个普通的旧文本字段。这是有意义的,因为我必须对新创建的元素应用一个新的$(foo).autocomplete(bar)。
所以我的下一个问题来了,当我试图重新应用$(foo).autocomplete(bar)克隆元素,它似乎改变了原来的元素,而不是新的克隆!我调用$(foo).autocomplete(bar)的同时,我对相同的元素做了其他的改变,这些改变工作得很好(id和名称)。克隆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不是很有经验(你可能会说),我已经解决了这个项目的无数问题,我真的很接近。
编辑:我尝试使用。autocomplete("destroy")方法将克隆元素还原为纯文本字段,这样我就可以重新应用。autocomplete(),它实际上从两个元素中删除了它-不是我想要的。然而,我了解到jQuery UI不支持克隆,所以显然它是克隆元素,但克隆和原始共享相同的小部件或其他。
我仍然在寻找这个问题的递归解决方案,因为我有4个类似的函数和7个不同的元素,每一行需要自动完成-显然我不想复制和粘贴代码28次,并重复每次我改变的东西。
您是否尝试过使用jQuery Live关键字与自动完成?
编辑
我在使用自动完成插件时遇到了类似的问题。
我以前也做过这样的事;
$("#PositionsAvailableSkills").autoSuggest(...
在我创建控件之后,它工作得很好