JQuery меняется на клонированный виджет автозаполнения, только изменить оригинал - PullRequest
0 голосов
/ 04 мая 2011

Извините за заголовок, я действительно не знаю, как просто задать этот вопрос. У меня есть функция, которая клонирует 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 раз и повторять каждый раз, когда я что-то меняю.

1 Ответ

1 голос
/ 04 мая 2011

Вы пробовали использовать ключевое слово jQuery Live с автозаполнением?

редактировать

У меня была похожая проблема с плагином автозаполнения, который я использовал.

Я тоже, некоторое время назад, просто сделал что-то подобное;

$("#PositionsAvailableSkills").autoSuggest(...

после того, как я создал элемент управления, и он работал нормально.

...