开发者问题收集

jQuery 自动完成响应返回:无法读取 null 的属性“length”

2017-01-10
1048

我正在尝试创建一个函数,当“自动完成”未找到任何结果时,该函数将显示一个按钮。

PHP

echo json_encode($row_set);

JS

$( '#objNr' ).autocomplete({
    source: 'php/v.php',
    minLength: 2,
    response: function(event, ui) {
        // ui.content is the array that's about to be sent to the response callback.
        if (ui.content.length === 0) {
            $('#newTableBtn').removeClass('hidden');
        } else {
            $("#newTableBtn").addClass('hidden');
        }
    },
    error: function(err){
        console.log(err);
    }
});

搜索工作正常。我得到了结果。但是当我没有结果时,我收到此消息:

Uncaught TypeError: Cannot read property 'length' of null at HTMLInputElement.response

出了什么问题?

更新 PHP

 while ($row = $stmt->fetch()){
    $row['id'] = $i+1;
    $row_set[] = $row;//build an array
}
echo json_encode($row_set);//format the array into json data  

更新 JS

response: function(event, ui) {
        if (ui.content != null && ui.content.length < 1) {
            $('#newTableBtn').removeClass('hidden');
            console.log('if')
        } else {
            $("#newTableBtn").addClass('hidden');
            console.log('else')
        }
    },

这一条清除了错误消息..但无论是否有结果,else 情况都会发生...

2个回答

经过与 @björn-c 的长时间友好讨论,我们发现问题在于在获取结果之前没有初始化数组 $row_set 。这样,json_encode 会将结果编码为 null ,自动完成会抛出错误。

因此,解决方法是在从数据库获取结果的 while 循环中使用它之前放置

$row_set = array();

然后就大功告成了!:)

Erenor Paz
2017-01-10

尝试此操作:

if (ui.content != null && ui.content.length < 1) {
  $('#newTableBtn').removeClass('hidden');
} else {
  $("#newTableBtn").addClass('hidden');
}

如果 ui.content 为空,则在您尝试获取其 length 属性时会引发异常。请确保不是。

urbz
2017-01-10