Почему автозаполнение jQuery обновляет все элементы в моей клонированной форме?

У меня есть форма, которая использует функцию автозаполнения jQuery UI для двух элементов, а также имеет возможность клонировать себя с помощью SheepIt!.

Оба элемента представляют собой ввод текста. После выбора значения из первого автозаполнения (континенты) значения второго автозаполнения (страны) заполняются параметрами, зависящими от первого выбора.

Моя проблема в том, что при создании клонов, если пользователь выбирает вариант из первого автозаполнения (континент), он изменяет первые входные значения на всех клонах. Этого не происходит для второго входа (страна).

Что мне не хватает?

Примечание: # index # в форме id и name не CFML. Я использую PHP, а хеш-теги являются частью SheepIt! клонировать плагин.

Javascript:

<script src="../../scripts/jquery-1.6.4.js"></script>
<script src="../../scripts/jqueryui/ui/jquery.ui.core.js"></script>
<script src="../../scripts/jquery.ui.widget.js"></script>
<script src="../../scripts/jquery.ui.position.js"></script>
<script src="../../scripts/jquery.ui.autocomplete.js"></script>
<script src="../../scripts/jquery.sheepIt.min.js"></script>
<script type="text/javascript">

$(document).ready(function() {

    function ord(chr) {

        return chr.charCodeAt(0);

    }

    function chr(num) {

        return String.fromCharCode(num);

    }

    function quote(str) {

        return '"' + escape(str.replace('"', "'")) + '"';

    }

    String.prototype.titleCase = function () {

        var chars = [" ", "-"];
        var ths = String(this).toLowerCase();

        for (j in chars){

            var car = chars[j];
            var str = "";
            var words = ths.split(car);
            for(i in words){

                str += car + words[i].substr(0,1).toUpperCase() + words[i].substr(1);

            }

            ths = str.substr(1);

        }

        return ths;

    }

    function incrementTerm(term) {

        for (var i = term.length - 1; i >= 0; i--){

            var code = term.charCodeAt(i);

            if (code < ord('Z'))

                return term.substring(0, i) + chr(code + 1);

        }

        return '{}'

    }

    function parseLineSeperated(data){

        data = data.split("\n");

        data.pop(); // Trim blank element after ending newline

        var out = []

        for (i in data){

            out.push(data[i].titleCase());

        }

        return out;

    }

    function loadcontinent(request, response) {

        var startTerm = request.term.toUpperCase();

        var endTerm = incrementTerm(startTerm);

        $.ajax({

            url: '/db/continent.php?startkey='+startTerm+'&endkey='+endTerm,

            success: function(data) {

                var items = parseLineSeperated(data);

                response(items);

            },

            error: function(req, str, exc) {

                alert(str);

            }

            });

    }

    function loadcountry(request, response) {

        var startTerm = request.term.toUpperCase();

        var endTerm = incrementTerm(startTerm);

        var continent = $('.continent_autocomplete').val().toUpperCase();

        $.ajax({

            url: '/db/country.php?key=' + continent,

            success: function(data) {

                var items = parseLineSeperated(data);

                response(items);


            },

            error: function(req, str, exc) {

                alert(str);

            }

            });

    }

    $('#location_container_add').live('click', function() { 
        $("input.continent_autocomplete").autocomplete(continent_autocomplete);
        $("input.continent_autocomplete").keyup(continent_autocomplete_keyup);  
        $("input.country_autocomplete").autocomplete(country_autocomplete);     
        $("input.country_autocomplete").keyup(country_autocomplete_keyup);      
        $('input.country_autocomplete').focus(country_autocomplete_focus);
    });


    var location_container = $('#location_container').sheepIt({
            separator: '',
            allowRemoveLast: true,
            allowRemoveCurrent: false,
            allowRemoveAll: false,
            allowAdd: true,
            allowAddN: false,
            maxFormsCount: 10,
            minFormsCount: 1,
            iniFormsCount: 1
    });

    var continent_autocomplete = {

        source: loadcontinent,

        select: function(event, ui){

            $("input.continent_autocomplete").val(ui.item.value);

        }

    }

    var continent_autocomplete_keyup = function (event){

        var code = (event.keyCode ? event.keyCode : event.which);

        event.target.value = event.target.value.titleCase();

    }

    var country_autocomplete = {

        source: loadcountry,

    }

    var country_autocomplete_keyup = function (event){

        event.target.value = event.target.value.titleCase();

    }

    var country_autocomplete_focus = function(){           
        if ($(this).val().length == 0) {
            $(this).autocomplete("search", " ");
        }
    }   

    $("input.continent_autocomplete").autocomplete(continent_autocomplete);
    $("input.continent_autocomplete").keyup(continent_autocomplete_keyup);
    $("input.country_autocomplete").autocomplete(country_autocomplete);
    $("input.country_autocomplete").keyup(country_autocomplete_keyup);
    $('input.country_autocomplete').focus(country_autocomplete_focus);

});

</script>

HTML:

<div id="location_container">
    <div id="location_container_template" class="location_container">
        <div id="continent_name">
            <label> Continent Name:</label>
            <input type="text" id="continent_name_#index#" name="continent_name_#index#" class="continent_autocomplete" />
        </div>
        <div id="country">
            <label> Country:</label>
            <input type="text" id="country_autocomplete_#index#" name="country_autocomplete_#index#" class="country_autocomplete" />
        </div>
    </div>
</div>

person Michael    schedule 20.11.2011    source источник


Ответы (2)


    select: function(event, ui){

        $("input.continent_autocomplete").val(ui.item.value);

    }

Этот код явно говорит, что нужно установить значение каждого <input> с классом "continent_autocomplete" на выбранное значение.

Вы, наверное, хотите что-то вроде

        $(this).val(ui.item.value);

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

person Pointy    schedule 20.11.2011
comment
ааааааааааааааааааааааааааааааааааааааааааааааааа, большое спасибо думаю, я слишком долго начинал с этого! :) - person Michael; 20.11.2011

Эта строка: $("input.continent_autocomplete").val(ui.item.value); обновляет все входные данные с помощью класса continent_autocomplete.

ОБНОВЛЕНИЕ: из jQueryUI Autocomplete Doc: выберите:

Срабатывает при выборе элемента в меню; ui.item относится к выбранному элементу. По умолчанию действие select - заменить значение текстового поля значением выбранного элемента. Отмена этого события предотвращает обновление значения, но не предотвращает закрытие меню.

Вам вообще не нужен бит select, похоже, вы просто пытаетесь выполнить действие по умолчанию.

person nachito    schedule 20.11.2011
comment
Это не дает ответа? просто подчеркивает проблему ... вероятно, следовало написать комментарий или отредактировать OP ... - person rlemon; 20.11.2011
comment
Я шел туда, извините за задержку. Вопрос был в том, что мне не хватает? на что я технически ответил. - person nachito; 20.11.2011