我在jQuery自动完成中解析我的JSON数据时遇到了麻烦。我的JSON来自这段代码:
<cfset theQ = lcase(q)>
<cfquery datasource="#source#" name="qry" maxrows="20">
select top 10 lastname
from info
where
lower(lastname) like '#theQ#%'
order by lastname
</cfquery>
<!---
Before we can serialize the query, we need to convert
it to an array of structs.
--->
<cfset rows = [] />
<!--- Loop over the query to convert it. --->
<cfloop query="qry">
<!--- Create a row struct. --->
<cfset row = {} />
<!--- Add each column to our struct. --->
<cfloop
index="column"
list="#qry.columnList#"
delimiters=",">
<cfset row[ column ] = qry[ column ][ qry.currentRow ] />
</cfloop>
<!--- Append the row struct to the row array. --->
<cfset arrayAppend( rows, row ) />
</cfloop>
<!---
Now that we have converted our query to an
array of structs, we can serialize it using the
serializeJSON() method.
--->
<cfset serializedQuery = serializeJSON( rows ) />
<cfoutput>#serializedQuery#</cfoutput>
我将查询转换为结构数组,然后将其序列化为JSON。现在,在jQuery自动完成中解析此JSON不起作用。我得到的数据如下:
[{"lastname":"abc"},{"lastname":"def"},{"lastname":"ghi"}]
以下是自动填充的代码:
$(document).ready(function() {
$("#name").autocomplete("data/name.cfm",{
minChars:1,
delay:10,
autoFill:false,
matchSubset:false,
matchContains:1,
cacheLength:10,
selectOnly:1,
dataType: 'json',
parse: function(data) {
var parsed = [];
var dataParsed = $.parseJSON(data);
for (var i = 0; i < dataParsed.length; i++) {
parsed[parsed.length] = {
data: dataParsed[i],
value: dataParsed[i].lastname,
result: dataParsed[i].lastname
};
}
return parsed;
},
formatItem: function(item) {
return item;
}
});
当我输入文本字段时,我将整个JSON字符串作为搜索结果。我已经查看了其他代码进行解析但仍然无法使其正常工作。有帮助吗?感谢。
参考文献: Simon Whatley自动完成; Ben Nadel查询结构数组并序列化为json
答案 0 :(得分:0)
一个问题是,在你的for循环中,当你应该迭代到data.length
时,你正在迭代到dataParsed.length
如果你使用Simon Whatley自动完成插件,根据他网站上的演示,该插件只是希望自动完成结果在各行上,例如:
abc
def
ghi
所以你应该摆脱你在jquery中提供的parse
函数,并修改你的coldfusion脚本每行返回一个名称,即abc\ndef\n...
不需要使用json或其他任何东西。 (至少那就是他的网站上的这个演示如何运作http://www.simonwhatley.co.uk/examples/autocomplete/jquery/data/country.php)
要确认一下,您应该在alert('aaa')
函数的内部添加parse()
,我打赌您会看到它永远不会被调用。