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