Многоуровневое автозаполнение JQuery, которое не устанавливает данные для следующего уровня

У меня работает автозаполнение для названий штатов и провинций. Я хочу передать аббревиатуру штата следующему каскаду автозаполнения. Я создал скрытый ввод и хочу установить для него аббревиатуру при выборе названия штата, затем я выберу аббревиатуру для использования в автозаполнении следующего уровня, чтобы ограничить запрос города только одним штатом. На предыдущем шаге у меня есть переключатели страны, устанавливающие ограничение штата в параметре данных .ajax, чтобы вы могли видеть (в целом), что я хочу сделать на этом уровне штата/города. Я пробовал несколько вещей, много искал в Google и читал книги по jQuery, но мне нужна помощь. Поле ввода stateProvince автоматически дополняется и выбирает полное имя штата. Скрытый ввод не задается аббревиатурой. Предупреждение пустое. Я не уверен ни в успехе ajax, ни в функциях выбора ajax. Как сделать, чтобы аббревиатура (а не имя) была значением скрытого ввода? и как я могу затем выбрать его в опции данных .ajax следующего уровня? Вот соответствующий код.

выбранный HTML без символов тегов:

тип ввода = "текст" id = "stateProvince" имя = "stateProvince" размер = "50" maxlength = "50" тип ввода = "скрытый" id = "hiddenState" имя = "hiddenState"

Исходный код автозаполнения ajax;

    $("#stateProvince").autocomplete
    ({
        source: function( request, response )
        {                           
            //Pass the selected country to the php to limit the stateProvince selection to just that country  
            $.ajax(
            {
                url: "getStateProvince.php",
                data: {
                        term: request.term, 
                        country: $('input[name=country]:checked').val()    //Pass the selected country to php
                      },       
                type: "POST", 
                dataType: "json",
                success: function( data )
                {                                          
                    response( $.map( data, function( item )
                    {
                        return{                                   
                                label: item.stateName,
                                value: item.name,
                                abbrev: item.stateAbbrev                                                                   
                               }
                    }));
                },
                select: function( event,ui )
                {
                $(this).val(ui.item.value);
                $("#hiddenState").$(this).val(ui.item.abbrev);
                }
            });
            alert('|' + $("#hiddenState").val() + '|2nd');  //doesn't trigger here; shows no content when placed in the next tier Autocomplete              
        },           
        minLength: 2
    });

Пример JSON, возвращенный из php:

[{"stateName":"Алабама","name":"Алабама","stateAbbrev":"AL"},{"stateName":"Аляска","name":"Аляска","stateAbbrev":"AK "}]


person Mike_Laird    schedule 21.04.2011    source источник


Ответы (2)


У тебя почти получилось! Я вижу следующие проблемы:

  1. select — это событие в виджете autocomplete. Ваш код в том виде, в каком он есть сейчас, определяет select как вариант вызова $.ajax({...});.

  2. Неудачный оператор alert находится внутри функции source для виджета автозаполнения. Я предполагаю, что он появляется сразу после того, как вы начинаете печатать. Причина, по которой он пуст, заключается в том, что он не находится внутри функции select (и это происходит до вашего успешного вызова AJAX).

Вы можете настроить свой код следующим образом:

$("#stateProvince").autocomplete
({
    source: function( request, response )
    {                           
        //Pass the selected country to the php to limit the stateProvince selection to just that country  
        $.ajax(
        {
            url: "getStateProvince.php",
            data: {
                    term: request.term, 
                    country: $('input[name=country]:checked').val()    //Pass the selected country to php
                  },       
            type: "POST", 
            dataType: "json",
            success: function( data )
            {                                          
                response( $.map( data, function( item )
                {
                    return{                                   
                            label: item.stateName,
                            value: item.name,
                            abbrev: item.stateAbbrev                                                                   
                           }
                }));
            }
        });             
    },      
    select: function( event,ui )
    {
        $(this).val(ui.item.value);
        $("#hiddenState").val(ui.item.abbrev);
        alert('|' + $("#hiddenState").val() + '|2nd');  //doesn't trigger here; shows no content when placed in the next tier Autocomplete 
    },     
    minLength: 2
});

Обратите внимание на расположение оператора alert и обработчика событий select.

person Andrew Whitaker    schedule 21.04.2011
comment
Андрей, спасибо за помощь. Оповещение теперь срабатывает и дает мне [объект, объект]. У меня есть другое предупреждение на следующем уровне, и оно говорит то же самое. Однако аббревиатура штата не передается на следующий уровень. (если я «жестко кодирую» аббревиатуру состояния, это работает) В функции выбора я пробовал ui.item.abbrev, ui.item.stateAbbrev и ui.item[2]. Я не могу сказать, заключается ли проблема в установке значения в скрытом вводе или в его получении. Как это отладить? - person Mike_Laird; 22.04.2011
comment
@Mike_Laird: я заметил ошибку в обработчике событий select, я обновлю свой ответ - person Andrew Whitaker; 22.04.2011
comment
@Mike_Laird: Кроме того, если вы используете Firebug с Firefox, вы можете установить точку останова и проверить значение ui.item, чтобы увидеть, существует ли вообще свойство abbrev. - person Andrew Whitaker; 22.04.2011
comment
@Andrew Whitaker: точка останова в строке сокращений в случае успеха показывает правильные сокращения состояний. Точка останова на предупреждении в select отображает аббревиатуру. Обычно при выборе в поле отображается название штата. Поэтому я считаю, что ввод hiddenState установлен правильно. Я не смог найти ui.item.abbrev или значение скрытого ввода в материалах Firebug для прямого чтения. Может подскажете, где искать. Моя текущая проблема связана с получением скрытых данных на третьем уровне. У меня есть строка данных: очень похожая на приведенную выше. adminCode1: AK, создает ответы Аляски. adminCode1: $(#hiddenState).val(), ошибка - person Mike_Laird; 22.04.2011
comment
@Mike_Laird: На самом деле вы можете ввести селектор jQuery прямо в консоли. Поэтому, если вы наберете $(#hiddenState").val(), вы должны получить аббревиатуру штата. Если это возвращает то, что вы ожидаете, возможно, вам поможет добавление неработающего кода к вашему вопросу. - person Andrew Whitaker; 22.04.2011
comment
@Andrew Whitaker: в разделе сценариев Firebug следите за $(#hiddenState).val($(this).val(ui.item.abbrev)); говорит, что это не определено - насколько я могу судить. Я новичок и не знаю, как использовать или читать Firebug. Возможно, опция select: не работает для установки скрытого ввода. Он устанавливает имя состояния в текстовом поле. Я попробовал раздел DOM Firebug. Я могу найти ссылки на скрытый ввод, но не ссылку на его значение. Я опубликую код jQuery как для 2-го, так и для 3-го уровня в ответе ниже. Они очень похожи. Уровень 3 работает, когда он «жестко запрограммирован» с аббревиатурой состояния. - person Mike_Laird; 22.04.2011
comment
@Mike_Laird: обязательно обновите исходный пост — не добавляйте новый ответ. - person Andrew Whitaker; 22.04.2011
comment
@Эндрю Уитакер: Ой, слишком поздно. Я сделаю это правильно в следующий раз. - person Mike_Laird; 22.04.2011
comment
@Mike_Laird: Хм... Вы уверены, что id вашего ввода равно hiddenState? (<input type="hidden" id="hiddenState" />). Также убедитесь, что вы используете $("#hiddenState").val(ui.item.abbrev);, а не $("#hiddenState").val($(this).val(ui.item.abbrev));. - person Andrew Whitaker; 22.04.2011
comment
@Эндрю Уитакер: Избавиться от $(this) удалось! Работает как шарм. Меня все еще смущает $(this), и мне придется снова поработать над этим. Большое спасибо за Вашу помощь. Вы не представляете, как долго я работал над этими несколькими строками, но я начал с того, что совсем не знал Javascript. Еще раз спасибо! - person Mike_Laird; 22.04.2011
comment
@Mike_Laird: Нет проблем! Рад слышать, что ты понял это. Пожалуйста, примите ответ, если он помог :) - person Andrew Whitaker; 22.04.2011

Вот код для 2-го уровня штата и 3-го уровня города автозаполнения.

    //2d tier - stateProvince: autocomplete selection
    //set the country for the 2nd tier to select stateProvince from only the country selected in the 1st tier         
    $("#stateProvince").autocomplete
    ({ 
        source: function( request, response )
        {                          
            //Pass the selected country to the php query manager to limit the stateProvince selection to just that country                                               
            $.ajax(
            { 
                url: "getStateProvince.php",
                data: {
                        term: request.term,   
                        country: $('input[name=country]:checked').val()    //Pass the selected country to php
                      },        
                type: "POST",  // a jQuery ajax POST transmits in querystring format in utf-8
                dataType: "json",   //return data in json format                                                                                                                                                        
                success: function( data ) 
                {                                           
                    response( $.map( data, function( item ) 
                    {
                        return{                                    
                                label: item.stateName,
                                value: item.name,
                                abbrev: item.stateAbbrev                                                                    
                               }
                    }));
                }
            });
        },
        select: function( event,ui )
        {
            $(this).val(ui.item.value);
            $("#hiddenState").val($(this).val(ui.item.abbrev));
            //alert('|' + $("#hiddenState").val() + '|1st');  //shows [object,Object] 
        },      
        minLength: 2
    });

    //3d tier - city: autocomplete selection  //                        
    $( "#city" ).autocomplete
    ({                 
        source: function( request, response ) 
        {              
            $.ajax(
            {
                url: "http://ws.geonames.org/searchJSON",
                dataType: "jsonp",
                data: 
                {
                    featureClass: "P",
                    country: $('input[name=country]:checked').val(),
                    adminCode1: $("#hiddenState").val(), //"AK", //works-delivers only Alaska towns.
                    style: "full",
                    maxRows: 10,
                    name_startsWith: request.term
                },

                success: function( data ) 
                {
                    response( $.map( data.geonames, function( item ) 
                    {
                        return{
                                label: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                                value: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : "")
                               }
                    }));
                }
            });
        },
        select: function( event, ui ) 
            {
                $(this).val(ui.item.value);
                //ui.item.option.selected = true;
                //self._trigger( "selected", event, {item: ui.item.option});
            },  //combo box demo uses this to bar illegal input. Other things are needed also. item.option is not defined
        minLength: 2,


        open: function() 
        {
            $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
        },
        close: function() 
        {
            $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
        }
    });
person Mike_Laird    schedule 22.04.2011