Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery自动完成插件pengoworks版本不工作_Jquery - Fatal编程技术网

jQuery自动完成插件pengoworks版本不工作

jQuery自动完成插件pengoworks版本不工作,jquery,Jquery,您好,我正在使用jQuery插件(pengoworks版本),我有一个问题。。。当我最初在文本框中键入内容时,它会很好地显示建议框。但是,在文本框中键入几个字母后,如果暂停,然后继续键入,则只会过滤掉下面建议框中填充的内容,而不会再次运行查询以获得新结果。但每次我在初始暂停后按back键时,它都会重新运行查询。。。我希望你能理解我在说什么。对不起,有什么不清楚的地方,我是编程新手。我将提供我的html页面和php页面 <head> <meta http-equiv="

您好,我正在使用jQuery插件(pengoworks版本),我有一个问题。。。当我最初在文本框中键入内容时,它会很好地显示建议框。但是,在文本框中键入几个字母后,如果暂停,然后继续键入,则只会过滤掉下面建议框中填充的内容,而不会再次运行查询以获得新结果。但每次我在初始暂停后按back键时,它都会重新运行查询。。。我希望你能理解我在说什么。对不起,有什么不清楚的地方,我是编程新手。我将提供我的html页面和php页面

 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title></title>
    <script type="text/javascript" src="jquery-1.7.1.js"></script> 
    <script type="text/javascript" src="jquery.autocomplete.js"></script>
    <link href="jquery.autocomplete.css" rel="stylesheet" type="text/css" />


   <script type="text/javascript">
        $(document).ready(function() {
            $('#input_box').autocomplete("autocomplete_search.php");

        })
    </script>
   </head>

    <body>

        <input type="text" name="input_box" value="" id="input_box"   />

    </body>
    </html>

$(文档).ready(函数(){
$(“#输入框”).autocomplete(“autocomplete_search.php”);
})
这是我的PHP部分

    <?php
    include 'fh.inc.db.php';

    $db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or 
    die ('Unable to connect. Check your connection parameters.');
    mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

    $location = htmlspecialchars(trim($_GET['q'])); //gets the location of the search

    if(is_numeric($location)) {

       $query = "SELECT
           zipcode_id
       FROM
           user_zipcode
       WHERE
           zipcode_id LIKE '%$location%'
       ORDER BY zipcode_id DESC LIMIT 10";
    $result = mysql_query($query, $db) or die(mysql_error($db));

    } elseif(is_string($location)) {

    $query = "SELECT
            city
        FROM
           user_zipcode
       WHERE
           city LIKE '%$location%'
       ORDER BY city DESC LIMIT 10";
    $result = mysql_query($query, $db) or die(mysql_error($db));


    }


    while($row = mysql_fetch_assoc($result)) {

    extract($row);
    if(is_numeric($location)){
       echo "$zipcode_id \n";
    }elseif(is_string($location)){
       echo "$city \n"; 
    }

    }

   ?>

编辑:插件初始化中的bug

插件中似乎存在一个棘手的bug,它使您传递的选项
matchSubset:0
被忽略并更改为1

在初始化过程中,将根据作为第二个参数传递的选项和一些默认值构建一个
options
对象:

...
options.delay = options.delay || 400;
options.matchCase = options.matchCase || 0;
options.matchSubset = options.matchSubset || 1;
...
这种方法和数值变量存在问题:
matchSubset:0
在条件语句中返回false!在我们的例子中,
matchSubset
将始终等于1

我明白为什么会这样做。使用相同的符号检查变量是否
未定义
,因为它也返回false。但是,对于numeric,它并没有像预期的那样工作

如果你不能使用其他插件,我建议你改变默认选项的合并方式。您可以这样做,例如:

//options.matchSubset = options.matchSubset || 1;
options.matchSubset = typeof matchSubset !== undefined
    ? options.matchSubset
    : 1;
您还可以创建一个
defaults
对象文本,并使用
$.extend()
合并默认值和选项,就像在jquery插件中通常做的那样


初步答复 该插件默认使用缓存系统。如果当前查询不在缓存中,插件将检查是否存在子集

假设您键入“Foo”,插件将进行查询并缓存结果。然后添加一个“t”,结果是查询“Foot”。该插件找不到“Foot”的条目,但会找到“Foo”的条目,因此它会过滤该列表,而不是提出新的请求

// "q" is the query text
function loadFromCache(q) {
    if (!q) return null;
    if (cache.data[q]) return cache.data[q];
    if (options.matchSubset) {
        for (var i = q.length - 1; i >= options.minChars; i--) {
            var qs = q.substr(0, i);
            var c = cache.data[qs];
            if (c) {
                var csub = [];
                for (var j = 0; j < c.length; j++) {
                    var x = c[j];
                    var x0 = x[0];
                    if (matchSubset(x0, q)) {
                        csub[csub.length] = x;
                    }
                }
                return csub;
            }
        }
    }
    return null;
};
发自:

匹配子集(默认值:1)
自动完成程序是否可以使用缓存进行更具体的查询。这意味着“foot”的所有匹配都是“foo”所有匹配的子集。通常情况下是这样的,使用此选项可以减少服务器负载并提高性能。请记住将cacheLength设置为更大的数字,如10


嗨,谢谢你的建议,但它似乎不起作用。我按照建议进行了此更改,但仍然存在相同的问题。在我最初键入某个内容之后,如果我暂停,似乎只有退格才会显示新的查询结果。如有更多建议,将不胜感激$(document.ready(function(){$('#input_box')).autocomplete(“autocomplete_search.php”,{matchSubset:0,CacheLength:10});})插件中似乎有一个bug。我已经更新了我的答案。非常感谢。似乎解决了这个问题。只是想确定你想用“typeof matchSubset!==undefined”而不是“typeof matchSubset!=undefined”,区别是什么?再次感谢。“==”和“!==”是严格的(in)相等运算符()伟大的链接谢谢!我决定使用jQueryUI来满足我的自动完成需求,但我发现自己甚至无法实现基本功能。如果你碰巧是这方面的专家,那么请随意评论我刚刚发布的问题。再次感谢你的帮助!
$('#input_box').autocomplete("autocomplete_search.php", { matchSubset: 0 });