【发布时间】:2021-05-23 07:25:50
【问题描述】:
我们有一个显示大量(大)表格的 Web 应用程序。对于用户友好的 UI,我们使用 ajax 实现了搜索(过滤器)在您键入时并加载部分视图。
简而言之:
- 输入控件
tbSearch带有keyup事件的侦听器:
.on('keyup', 'input.filter', function () {
showList(this);
}
-
showList()从 Controller 中获取_PartialView,然后将过滤后的结果加载到 div/table (section-list) 中:
function showList(control) {
// search text
var searchString = $('#tbSearch').val();
// url
var url = 'mycontroller/myaction';
//parameters
var data = {
searchString: searchString,
};
$('.section-list').load(url, data, function () {
});
}
到目前为止,使用 ajax 加载非常基本的局部视图。而且大多数时候效果都很好。
当用户快速键入并且搜索数据库的查询有点复杂时会出现问题。在这种情况下(因为 ajax.load 是异步的)showList() 函数可以在先前的搜索甚至加载之前为新的搜索字符串触发。这可能会导致用户输入的实际关键字的结果被先前的关键字之一覆盖。
例如,我开始在搜索框中快速写入:
- 米
- 我的
- 我的
- 我的
- 我的海
- mysearc
- mysearch(停止输入)
而不是显示过滤到“mysearch”的数据的结果实际上可以是“mysea”。
我正在考虑将 ajax get partialview 代码放入一个单独的异步函数(返回一个 Promise),添加一个计数器(在页面上计数 keyups)并等待 ajax 函数完成,如果计数器与最后一个请求匹配,单独加载div的内部html...不过这似乎是个复杂的解决方案。
有什么想法(对于更简单的解决方案)?
【问题讨论】:
-
嗨@TheMixy,尝试使用input event 或change event 来获取输入的值。
-
嗨@Zhi Lv.输入的值不是问题。我通过
keyup事件阅读它就好了。问题是显示结果的顺序 - 因为 ajax 正在异步工作。 -
嗨@TheMixy,根据您的代码,我已经使用keyup 事件创建了一个示例,正如您所说,如果快速键入,该事件可能不会立即触发。所以,在我之前的回复中,我建议你可以尝试使用 input 或 change 事件。对于Ajax功能,可以考虑将the
asyncproperty设置为false,这样会同步发送请求。 -
我正在考虑将 async 设置为 false,但我认为这会对用户体验产生负面影响
标签: javascript jquery asp.net-core asp.net-ajax partial-views