Как сделать вторые параметры автозаполнения, зависящие от первого выбора автозаполнения, используя jQuery? - PullRequest
1 голос
/ 16 ноября 2011

У меня есть форма с вводом текста и выберите опцию.В текстовом поле используется автозаполнение, чтобы пользователи могли выбирать параметры из списка.После того, как значение выбрано из автозаполнения, поле выбора выбора заполняется параметрами, зависящими от выбора.

Я работаю над тем, чтобы изменить код так, чтобы во втором поле также был текстовый ввод, чтобы не ограничивать выбор пользователей (т. Е. Оба поля должны разрешать ввод свободного текста, если пользователь не хочетвыберите из доступных вариантов).

Я думаю, что слишком долго смотрел на этот код и хотел бы немного помочь.Очевидно, что изменения должны быть внесены в функции loadCountry, populateSelect и loadcountrySelect.

Я использую PHP, jQuery и jQuery UI Autocomplete .

Любая помощь, которую вы можете предоставить, будет очень признательна!*

<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 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 guess(value){

        var oldValue = $('.continent_autocomplete').val();

        if (oldValue == value)

            return;

        $('.continent_autocomplete').val(value);

        $('.continent_autocomplete').caret(oldValue.length, value.length);

    }

    function clearGuess(){

        var field = $('.continent_autocomplete');

        field.val(field.val().substring(0, field.caret().start));

    }

    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(handler) {

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


        $.ajax({

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

            success: function(data) {

                handler(parseLineSeperated(data));

            },

            error: function(req, str, exc) {

                alert(str);

            }

            });

    }

    function populateSelect(select, options) {

        select.html('');

        if (options.length) {

            enableSelect();

            for (i in options){

                var option = options[i];

                select.append($('<option></option>').val(option).html(option));

            }

        } else {

            disableSelect('Country');

        }

    }

    function loadcountrySelect(continentObj){

        disableSelect('Loading...');

        loadcountry(function(options){

            populateSelect($('.country_autocomplete'), options);

        });

    }

    function disableSelect(message){

        var select = $('.country_autocomplete');

        select.html("<option>" + message + "</option>");

        select.attr('disabled', true);

    }

    function enableSelect(){

        var select = $('.country_autocomplete');

        select.attr('disabled', false);

    }

    populateSelect($(".country_autocomplete"), []);

    $("input.continent_autocomplete").autocomplete({

        source: loadcontinent,

        select: function(event, ui){

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

            loadcountrySelect(event.target);

        }

    });


    $("input.continent_autocomplete").keyup(function (event){

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

        if (code == 8) { // Backspace

            clearGuess();

        }

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

        loadcountrySelect(event.target);

    });
});

</script>

HTML:

<div id="continent_name">
    <label> Continent Name:</label>
    <input type="text" id="continent_name" name="continent_name" class="continent_autocomplete" />
</div>
<div id="country">
    <label> Country:</label>
    <input type="text" id="country_autocomplete" name="country_autocomplete" class="country_autocomplete" />
</div>

continent.php

<?php

$db_host        = 'XXX';
$db_user        = 'XXX';
$db_password    = 'XXX';
$db_name        = 'XXX';

$db = new mysqli($db_host , $db_user ,$db_password, $db_name);

if(!$db) {

    echo 'There was a problem connecting to the database';
} else {

    if(isset($_GET['startkey'])) {
        $mysearchString = $db->real_escape_string($_GET['startkey']);


        if(strlen($mysearchString) >0) {


            $query = $db->query("SELECT DISTINCTROW Continent 
                                FROM locations 
                                WHERE Continent 
                                LIKE '$mysearchString%' 
                                LIMIT 10"); 

            if($query) {

                while ($result = $query ->fetch_object()) {

                        print ucwords(strtolower($result->Continent))."\n";
                }

            } else {

                echo 'ERROR: There was a problem with the query.';
            }

        } else {

        } 

    } else {

        echo 'Access denied.';
    }
}
?>

country.php

<?php
$db_host        = 'XXX';
$db_user        = 'XXX';
$db_password    = 'XXX';
$db_name        = 'XXX';

$db = new mysqli($db_host , $db_user ,$db_password, $db_name);

if(!$db) {

    echo 'There was a problem connecting to the database';

} else {

    if(isset($_GET['key'])) {

        $mysearchString = $db->real_escape_string($_GET['key']);

        if(strlen($mysearchString) >0) {

            $query = $db->query("SELECT Continent,Country,Abbrev 
                                 FROM locations 
                                 WHERE Continent 
                                 LIKE '$mysearchString%' 
                                 ORDER BY Country
                                 LIMIT 20");    

            if($query) {

                while ($result = $query ->fetch_object()) {

                    print ucwords(strtolower($result->Country))."/".
                          ucwords(strtolower(strtok($result->Abbrev,";")))."\n";

                }

            } else {

                echo 'ERROR: There was a problem with the query.';

            }

        } else {

        } 

    } else {

        echo 'Access denied.';

    }

}
?>

Ответы [ 2 ]

0 голосов
/ 28 марта 2016

Плагин jQuery Автозаполнение, как у Google , поддерживает такие функции:

autocomplete.php (стиль agly, вся логика в одном месте - просто чтобы показать принцип)

if(!empty($_GET['foo_name']) && !empty($_GET['bar_number'])) {
    $sql = 'SELECT ... FROM ... WHERE';
    $db = new MySQLi(...);
    $db->query($sql);
    $numbers = [];
    while($row = $result->fetch_assoc()){
        $numbers[] = $row['bar_number'];
    }
}
echo json_encode($numbers);

autocomplete.html

<link href="/components/autocompletelikegoogle/jquery.autocomplete.css" media="screen" rel="stylesheet" type="text/css">
<script type="text/javascript" src="/components/autocompletelikegoogle/jquery.autocomplete.js"></script>
<script type="text/javascript" src="/js/autocomplete.js"></script>

<input type="text" name="foo_name" id="foo-name" value="">
<input type="text" name="bar_number" id="bar-number" value="">

autocomplete.js

$(function() {
    $("#foo").autocomplete({
        minLength: 3,
        limit: 5,
        source : [{
            url:"/my/ajax/controller/foo?data[foo_name]=%QUERY%",
            type:'remote'
        }],  
    });
});

$(function() {
    $("#bar").autocomplete({
        minLength: 3,
        limit: 5,
        appendMethod:'replace',
        source : [
            function(query, add) {
                fooName = $('#foo-name').val();
                $.getJSON("/my/ajax/controller/bar?data[bar_number]=" + query + "&data[foo_name]=" + fooName, function(response) {
                    add(response);
                })
        }],  
    });
});
0 голосов
/ 16 ноября 2011

Вам нужно будет изменить свой PHP, чтобы он работал оптимально (фильтрация происходит на сервере). Я бы обновил ваш PHP так, чтобы он запрашивал вашу базу данных с двумя параметрами (один для страны, другой для континента):

$continent = $db->real_escape_string($_GET['continent']);
$country = $db->real_escape_string($_GET['country']);

$query = $db->query("SELECT Continent,Country,Abbrev 
    FROM locations 
    WHERE Continent ='$continent' and Country like '$country%'
    ORDER BY Country
    LIMIT 20"); 

(Пожалуйста, возьмите зерно соли; я не знаю PHP)

В основном, передайте континент (который был выбран в первом input) вместе с строкой поиска страны (которая была набрана во втором вводе).

Далее вам нужно применить виджет автозаполнения ко второму input. Что-то вроде:

$("#country_autocomplete").autocomplete({
    source: function (request, response) {
        var continent = $("#continent_autocomplete").val()
            , country = request.term;

        $.ajax({
            url: '/db/country.php?continent=' + continent + "&country=" + country,
            success: function(data) {
                response(parseLineSeperated(data));
            },
            error: function(req, str, exc) {
                alert(str);
            }
        });
    }
});

Просто для некоторого блеска вы, вероятно, захотите очистить #country_autocomplete, когда #continent_autocomplete изменится. Вы можете сделать это, добавив обработчик событий для события change автозаполнения:

$("input.continent_autocomplete").autocomplete({
    source: loadcontinent,
    change: function () {
        $("#country_autocomplete).val('');
    }
});

Наконец, вы захотите удалить любой код, связанный с заполнением страны select, так как он вам больше не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...