我是JQuery的新手,试图从ColdFusion查询中提取远程数据,以便在我的文本框中显示。
我在调用CFC时收到firebug中的错误:
未捕获的TypeError:无法使用'in'运算符来搜索'453'
我不知道这可能是什么意思。我可以看到这是从我的数据库中提取数据,因为在我的控制台输出中,我看到了我的数据:
[{"value":1,"label":"Test article"}] jquery-1.10.2.js:997
任何人都可以帮助解决此错误吗?
完整的HTML代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<!---Autocomplete Script --->
<link href="css/jquery-ui-1.10.4.custom.css" rel="stylesheet" type="text/css">
<script src="Scripts/jquery-1.10.2.js"></script>
<script src="Scripts/jquery-ui-1.10.4.custom.js"></script>
<!---<script src="Scripts/auto_correct.js" type="text/javascript"></script> --->
<script>
$(function() {
$( "#searchField" ).autocomplete({
source: function(request, response){
$.ajax({
url: "kb/cfcs/search.cfc?method=lookupTitle&returnformat=json",
dataType: "json",
data: {
searchterm: request.term
},
success: function(data){
response(data);
}
})
},
minLength: 3,
select: function(event, ui) {
$('#searchField').val(ui.item.value);
$('#defaultArticleID').val(ui.item.label);
}
});
});
</script>
</head>
<body class="oneColFixCtrHdr">
...
<!--- Main Container --->
<div id="container">
<cfform name="doesntmatter" method="post">
<label for="searchField">Search KB Articles</label>
<cfinput type="text" id="searchField" name="searchField" size="30em;" value=""/>
<cfinput type="hidden" name="defaultArticleID" id="defaultArticleID" value="0" />
</cfform>
</div>
...
</body>
</html>
我的CFC:
<cfcomponent>
<cffunction name="lookupTitle" access="remote" output="no"
hint="I return a list of titles" returnformat="JSON">
<cfargument name="searchterm" required="false" default="" />
<!--- Define variables --->
<cfset var returnArray =ArrayNew(1)>
<!--- Do search --->
<cfquery name="data" datasource="#datasource#">
SELECT ID, title
FROM kbArticles
WHERE title LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#arguments.searchterm#%" />
</cfquery>
<!--- Build result array --->
<cfloop query="data">
<cfset titleStruct = structNew() />
<cfset titleStruct['value'] = ID />
<cfset titleStruct['label'] = title />
<cfset arrayAppend(returnArray,titleStruct) />
</cfloop>
<!--- And return it --->
<cfreturn returnArray />
</cffunction>
</cfcomponent>
更新
在进行建议的更改时,我仍然在自动填充表单字段中没有收到任何数据。如果我在CFADMIN控制台中启用**启用请求调试输出**,我会看到此错误:
未捕获的TypeError:无法读取未定义的属性“文档”。
当我点击控制台输出中错误旁边的链接时,显示的是:
function writeToWindow( win ) {
if( document.getElementById ) { // NS6
// failing on <table ... 100%> for unescape() ?, and failing on writeCSS without unescape(), no the issue is with ns6 writing out the <link> tag for css
// NS6 needs unescape() or else it writes 'showHide%28%27cf_debug_parameters%27,%27img_cf_debug_parameters%27%29;' for methods
//win.document.write(unescape(document.getElementById("cf_debug").innerHTML));
//NS6.2 wants it escaped
win.document.write(document.getElementById("cf_debug").innerHTML);
} else {
win.document.write(document.all['cf_debug'].innerHTML);
}
win.document.close();
win.focus();
}
答案 0 :(得分:2)
(扩展自评论......)
As mentioned here,错误意味着代码期望解析的JSON 对象,但是传递了一个简单的字符串。 jQuery没有将您的cfc响应字符串解析为JSON对象。相反,它只是将普通字符串传递给response()函数,这会导致错误,因为该函数需要一个数组。未自动解析响应的原因是datatype
具有错误的大小写。它应该是:
dataType: "json" // Note, upper case "T"
顺便说一句,不要忘记var/local
范围所有函数局部变量,包括查询名称。
<强>更新强>
我认为这里更简单的方法是将cffunction参数名称更改为term
,然后使用URL作为源。此外,由于您没有使用cfform的任何额外功能,因此也可以切换到普通的html元素。
<script>
$(document).ready(function() {
$( "#searchField" ).autocomplete({
source: "/kb/cfcs/search.cfc?method=lookupTitle&returnformat=json",
minLength: 3,
select: function(event, ui) {
$('#searchField').val(ui.item.value);
$('#defaultArticleID').val(ui.item.label);
}
});
});
</script>
...
<form>
<label for="searchField">Search field: </label>
<input id="searchField">
<input id="defaultArticleID">
</form>