自动完成搜索框,从结果中选择多个值

Posted

技术标签:

【中文标题】自动完成搜索框,从结果中选择多个值【英文标题】:Auto-complete search box, selecting multiple values from results 【发布时间】:2011-03-15 15:53:42 【问题描述】:

我正在使用 php/mysql 创建自己的食谱框,而我坚持的一部分实际上是创建食谱,特别是选择成分。

我想做的是有一个自动完成的搜索框,我可以在其中输入成分的名称,将结果下拉到正下方,然后单击我要查找的那些。点击成分后,它会列在搜索框下方,输入输入数量,如果需要,可以删除“x”。这当然会根据配方需要多少成分而增长。最后,我只需将数据插入到我的数据库中。

我已经看过很多关于获取自动完成搜索框功能的 AJAX 教程,但没有任何内容与值选择相关联。可以在http://supercook.com 找到我所追求的最佳示例。他们有它,所以你可以搜索食谱。

有什么建议或在线资源吗?

谢谢!

【问题讨论】:

【参考方案1】:

你问了一个很好的问题。下面我写了一个简短的例子来帮助你入门。只需将其保存为 components.php 即可。当然,您需要添加数据库连接和查询以提供真实数据。我使用了 jQuery 库,因为它使 javascript 部分变得更加容易。

<?php

// connect to database here

if (isset($_POST['q'])) 
    if (trim($_POST['q']) === '') die('[]');
    // $q = mysql_real_escape_string($_POST['q']);
    // run a query like: "SELECT id, name FROM ingredients WHERE name LIKE '$q%'"
    // and put the result in the $result array.
    // This is sample data:
    $result = array(
        array('id' => 71, 'name' => 'apple'),
        array('id' => 3, 'name' => 'anchovies'),
        array('id' => 230, 'name' => 'artichoke'),
        );

    if (function_exists('json_encode')) die(json_encode($result));
    else 
        $escaped = array();
        foreach ($result as $r) $escaped[] = str_replace(array('\\', '"'), array('\\\\', '\"'), $r);
        die('["'.join('","', $escaped).'"]');
    


$data = array();
if (isset($_POST['ingredients'])) 
    foreach ($_POST['ingredients'] as $i => $ingredient) 
        $data[] = array(
            'ingredient' => $ingredient,
            'quantity' => $_POST['quantities'][$i],
            );
    
    // save data to the database here (or inside the foreach loop above)


?>
<html><head></head><body>
<style>
    #wrap  position: relative 
    #pop 
        position: absolute;
        border: 1px solid black;
        background-color: white;
        display: none;
    
</style>

<?php if (count($data)): ?>
<h3>Saved:</h3>
<pre><?php print_r($data) ?></pre>
<?php endif; ?>

<div id="wrap">
    <input id="adder" />
    <div id="pop"></div>
</div>
<form method="post">
    Ingredients:<br />
    <div id="recipe"></div>
    <input type="submit" value="Save" />
</form>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
    var last_query = '';
    jQuery(function() 
        jQuery('#adder').val('').keyup(function() 
            var query = jQuery(this).val();
            if (query != last_query) jQuery.post('ingredients.php', q: query, function(data) 
                var p = jQuery('#pop').html('').show();
                for (var i=0; i<data.length; i++) 
                    p.append(jQuery('<p>'+data[i].name+'</p>').bind('click',  ingredient: data[i] , function(e) 
                        add_ingredient(e.data.ingredient);
                        jQuery('#pop').hide();
                        jQuery('#adder').val('');
                    ));
                
            , 'json');
            else jQuery('#pop').show();
            last_query = query;
        );
    );
    function add_ingredient(data) 
        console.log(data);
        var ingredient = jQuery('<div> <input name="quantities[]" size="2" /> '+data.name
            + '<input type="hidden" name="ingredients[]" value="'+data.id+'" /></div>');
        var remover = jQuery('<span>X</span>').click(function() 
            jQuery(this).parent().remove();
        );
        jQuery('#recipe').append(ingredient.prepend(remover));
    
</script>
</body></html>

【讨论】:

哇,没想到这么多……太棒了!虽然我遇到了一些麻烦。再说一次,我是菜鸟。这应该能够按原样运行吗?我只是想看看这是否适用于您输入的示例数据,但事实并非如此。我收到此通知:“注意:未定义索引:第 5 行 C:\wamp\www\recipe\test.php 中的 q”此外,当我开始输入示例数据时,输入字段下没有弹出结果框。是否有任何先决条件才能使用? 是的,如果您将文件命名为 ingredients.php,它应该按原样运行。我刚刚编辑了代码以修复“未定义索引”错误,但我认为这不会阻止它工作。一种可能的可能性是您没有安装 JSON 模块,因此 json_encode() 函数不起作用。要检查这一点,请将这一行放入 PHP 文件中:echo function_exists('json_encode')? 'have json' : 'do not have json'; 如果没有,请尝试安装它。如果您在安装时遇到问题,请告诉我,我将重写代码,使其不再需要。 如果您使用的是来自 www.wampserver.com 的最新版本的 wamp,那么理论上您已经支持 JSON。您是否收到任何其他错误消息?尝试检查您是否还有任何 Javascript 错误。如果您使用的是 Firefox,Firebug 扩展可以帮助您进行调试。但是,这一切都可以在我的服务器和浏览器上完美运行......对不起,它不适合你! 好的,现在已经编辑,不需要json_encode了。 哦,我很傻,之前没有注意到您已重命名文件 test.php...您需要重命名文件成分.php 或替换 @ 987654323@ 和 jQuery.post('test.php'... 或任何你命名的文件。

以上是关于自动完成搜索框,从结果中选择多个值的主要内容,如果未能解决你的问题,请参考以下文章

从文本字段捕获数据时如何忽略自动完成值?

捕获自动完成文本框交叉图标的事件

使用具有多个值的EasyAutocomplete插件自动完成搜索输入

MVC 4,选择自动完成值时如何填充 3 个文本框?

Json 返回多个字段

JQuery UI 自动完成不结果显示在结果框中