对不起标题,我真的不知道如何简单地提出这个问题。我有一个函数,它用它的所有子元素克隆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次并重复每次我改变一些东西。
答案 0 :(得分:1)
您是否尝试过将jQuery Live关键字与自动填充功能结合使用?
修改强>
我使用的自动完成插件遇到了类似的问题。
前段时间我也做过类似的事情;
$("#PositionsAvailableSkills").autoSuggest(...
创建控件后,它运行正常。