Почему автозаполнение jQuery обновляет все элементы моей клонированной формы? - PullRequest
0 голосов
/ 20 ноября 2011

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

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

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

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

Примечание: # index # в идентификаторе и имени формы не является 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>

Ответы [ 2 ]

2 голосов
/ 20 ноября 2011
    select: function(event, ui){

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

    }

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

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

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

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

1 голос
/ 20 ноября 2011

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

UPDATE: Из jQueryUI Autocomplete Doc: выберите :

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

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

...