我有以下功能:
function GetGames(request) {
//Replace spaces with a '+'
var url = request.term.replace(/\s/g,"+");
return $.ajax({
'url': "php/gamescript.php?search=" + url,
'dataType': 'json'
}).then(function(data){
return $.map(data.Game || [], function(v,i){
return {
label: v.GameTitle + ' Game (' + v.ReleaseDate + ')',
value: v.GameTitle
}
});
})
}
及其上方,处理返回数据的代码:
function AutoComplete() {
$(".searchbox").autocomplete({
source: function(request, response) {
$.when( GetGames(request) )
.done(function(games) {
var term = request.term.toLowerCase();
var combine = games
.map((v,i) => {
//precompute such values if possible
return {
titleLowerCase: v.value.toLowerCase(),
termOffset: (v.value.toLowerCase().indexOf(term)+1) || Infinity,
//and keep a reference to the original data
data: v
}
})
.sort((a, b)=>{
//sortOn(termOffset ASC, titleLowerCase ASC)
return (a.termOffset - b.termOffset) ||
(a.titleLowerCase !== b.titleLowerCase && a.titleLowerCase > b.titleLowerCase? 1: -1) || 0;
})
.map(v => v.data).slice(0, 15);
response(combine);
});
}
});
}
我的问题是,有时候,对gamescript.php的搜索将返回'undefined',这将导致此错误:“未捕获的TypeError:无法读取未定义的属性'toLowerCase'”
处理此错误的好方法是什么?我试着做一个简单的方法:
return {
label: v.GameTitle + ' Game (' + v.ReleaseDate + ')',
value: v.GameTitle || " "
}
至少使代码运行,但最终会创建自动填充建议,将'undefined'作为标签。我还试图在GetGames函数中编写一个if语句,但最终我努力引入新代码而不用它创建新的错误。
如果需要,gamescript.php代码为:
<?php
$xml_string = file_get_contents("http://thegamesdb.net/api/GetGamesList.php?name=".$_REQUEST['search']);
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
echo $json;
?>
编辑:我现在尝试了这段代码:
function GetGames(request) {
//Replace spaces with a '+'
var url = request.term.replace(/\s/g,"+");
return $.ajax({
'url': "php/phpscript.php?search=" + url,
'dataType': 'json'
}).then(function(data){
return $.map(data.Game || [], function(v,i){
if( typeof( v.GameTitle )!='undefined' ){
return {
label: v.GameTitle + ' Game (' + v.ReleaseDate + ')',
value: v.GameTitle
}
}
});
})
}
编辑:我已经意识到,如果我在GetGames函数中添加alert(data.Game.GameTitle);
,它会成功提醒游戏标题,尽管在自动填充列表中显示为“未定义”。我不知道为什么会发生这种情况......再次,当我搜索“饥饿”时会发生此错误。对于我尝试过的其他游戏查询,它运行正常。