typeahead.js使用时发现列表加载不全

2023-09-21 17:39:25

   维护老旧项目时发现在项目中输入框的搜索建议频繁性的显示不全,和数据接口返回的结果不一致,由于项目老旧以及交接文档不全难以维护,记录一下解决思路和过程,防止下次再遇到类似问题。

1. 问题排查思路

(1)确认使用插件

查看项目代码发现搜索建议的实现使用typeahead.js插件,版本号为v0.11.1
插件官网:https://twitter.github.io/typeahead.js

(2)排查参数/方法使用错误

将所有参数和方法对照文档再过一遍,没有发现任何代码问题,但是source参数(数据来源)使用了Bloodhound对象,由于技术水平受限没有使用过Bloodhound插件,所以第一反应是不是Bloodhound插件的使用上有问题。

// source参数为skuHound方法
source: skuHound,

第一步、使用ajax请求替换Bloodhound对象

// 原项目代码
skuHound = new Bloodhound({
	datumTokenizer : Bloodhound.tokenizers.obj.whitespace('name'),
	queryTokenizer : Bloodhound.tokenizers.whitespace,
	remote : {
		url : 'XXXXXX', // 数据接口请求路径
		prepare : function(query, settings) {
			settings.type = 'post',
			settings.data = {
				'name' : query.trim(), // 请求参数
			}
			return settings;
		},
		transform : function(parsedResponse) {
			return parsedResponse.info.rows; // 返回数据
		}
	}
});
// 我的ajax请求
skuHound = function(query, process, asyncResults) {
	$.ajax({
		url: 'XXXXXX', // 数据接口请求路径
		type: 'post',
		dataType: 'json',
		data: {
			'name' : query.trim(), // 请求参数
		},
		success: function(result) {
			var names = result.info.rows;
			console.log(names)
			asyncResults(names); // 返回数据
		}
	});
};

重启项目测试后发现并没有解决问题,控制台打印结果也正确,所以排除了是Bloodhound插件的问题。

第二步、对整个搜索建议的显示过程打断点

打断点后发现typeahead.js文件中这个方法有问题,在append元素时数量计算明显不正确。
在这里插入图片描述
例:最大显示数量设为20,即limit参数设置为20

数组长度插件计算的截取结束索引截取后数组长度结果是否正确
5155正确,数量为5
1644不正确,应为前16
30-1020正确,为前20

3. 解决办法

改变插件中的方法:

function async(suggestions) {
    suggestions = suggestions || [];
    if (!canceled && rendered < that.limit) {
        that.cancel = $.noop;
        rendered += suggestions.length;
        // that._append(query, suggestions.slice(0, that.limit - rendered)); // 原代码
        that._append(query, suggestions.slice(0, that.limit)); // 改写后的代码
        that.async && that.trigger("asyncReceived", query);
    }
}
更多推荐

基于SSM的高校教学业绩信息管理系统设计与实现

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用JSP技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统功能三、系统项目截图​编辑四、核心代码登录相关文件上传封装五、

Vue路由及Node.js环境搭建

1.介绍什么是Vue.js和Node.js?Vue.js和Node.js是两个不同的技术,分别用于前端和后端开发,具有不同的用途和功能:Vue.js:Vue.js是一款流行的前端JavaScript框架,也被称为渐进式框架。它由尤雨溪开发,并由社区支持和维护。Vue.js主要用于构建现代、交互式的Web用户界面。它的核

React中组件通信02——消息订阅与发布、取消订阅以及卸载组件时取消订阅

React中组件通信02——消息订阅与发布、取消订阅以及卸载组件时取消订阅1.前言1.1使用props通信1.2关于useEffect2.安装pubsub-js3.消息订阅与发布3.1简单例子-13.2简单例子-2(完善、优化)——订阅消息+使用消息4.取消订阅4.1取消单个topic4.2取消多个或更多语法4.3卸载

LeetCode 面试题 04.09. 二叉搜索树序列

文章目录一、题目二、C#题解一、题目从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树root,输出所有可能生成此树的数组。点击此处跳转题目。示例1:输入:root=[2,1,3]输出:[[2,1,3],[2,3,1]]解释:数组[2,1,3]、[2,3,

macOS 12 Monterey:一次全新的跨设备协作体验

macOS12Monterey是苹果公司的一次重大突破,它打破了设备间的壁垒,将不同设备无缝地连接在一起,极大地提升了用户的工作效率和娱乐体验。Monterey带来了通用控制、AirPlay、捷径等新功能,以及一些实用的新小功能。安装:macOS12Montereyv12.6.9正式版功能特点通用控制macOS12Mo

会“穿墙术”的神奇材料 ——超固体

超固体(supersolid)是一种具备超流特性的固体,也就是集“超流体+固体”特性于一身的物质。简单来说就是超固体既有晶体态中原子规则排布的特征,又可以像超流体一样无摩擦流动。在凝聚态物理学中,超固体是具有超流体特性的空间有序材料。超固体是一种晶体材料,其原子排列结构规则且重复,也能够永远流动而不损失任何动能。尽管它

SpringMVC之自定义注解

目录一、Java注解1.1注解简介1.2注解分类1.3JDK基本注解1.4JDK元注解1.5自定义注解1.5.1标记注解1.5.2元数据注解1.6如何自定义注解二、自定义注解的基本案例2.1案例一(获取类、方法以及属性上的注解)2.1.1@Ingerited的使用2.2案例二(获取类属性上的注解属性值)2.3案例三(获

全球变暖问题(floodfill 处理联通块问题)

全球变暖问题文章目录全球变暖问题前言题目描述题目分析边界问题的考虑岛屿是否被淹没判断:如何寻找联通块:代码预告前言之前我们介绍了bfs算法在二维,三维地图中的应用,现在我们接续进行拓展,解锁floodfill算法,准确的来说是用bfs算法解决联通块问题。后续还会更新bfs算法有关内容,喜欢的小伙伴可以点个关注啦。题目描

数据结构和算法之快速排序

快速排序是一种基于分治法的排序算法。它通过不断地将数组分成较小的子数组,并按照递归的方式对每个子数组进行排序,最终将整个数组排序。#mermaid-svg-Za26UnuASULzGzsM{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px

Vue路由与nodejs环境搭建

一.路由什么是路由什么是SPA路由的思路及实现实例建立一个HTML来编写路由测试结果​编辑二.nodejs环境什么是node.jsnpm是什么node.js的下载一.路由什么是路由路由(Routing)是指根据不同的URL地址,将用户导航到不同的页面或视图的过程。在前端开发中,特别是在单页面应用(SPA)中,路由起着至

Python实现MYSQL蜜罐

1LOADDATAINFILE介绍首先开启一个Mysql,看一下mysql是如何读取主机文件的。1.1linux搭建mysql1)docker运行mysql2)启动Mysqldockerrun-itd--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql3)进入容

热文推荐