在 JQuery/Classic ASP 滚动加载时自动完成
Autocomplete with load on scroll in JQuery/Classic ASP
经典 ASP 中有一个自动完成文本框。最小长度设置为 4,但自动完成列表 returns 超过 500 条记录时速度非常慢。
登录控制台returns 预期结果,如果少于 500 行,将在自动完成文本框中返回正确的列表。
如果我想在滚动时加载更多数据而不是加载页面,最好的方法是什么?
$(document).ready( function(){
var availableCode = new Array();
var strCode = "";
<%
Dim idxJs
for idxJs = 0 to UBound(CodeList)-1
%>
availableCode[<%=idxJs %>] = unescape('<%= Escape(CodeList(idxJs)) %>');
<% next %>
function customFilter(array, terms) {
arrayOfTerms = terms.split(" ");
var term = $.map(arrayOfTerms, function (tm) {
return $.ui.autocomplete.escapeRegex(tm);
}).join('|');
var matcher = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term+")(?![^<>]*>)(?![^&;]+;)" , "i");
return $.grep(array, function (value) {
console.log("result - " + matcher.test(value.label || value.value || value));
console.log("value - " + value)
return matcher.test(value.slice(0, 10));
});
};
$( "#frmCode" ).autocomplete({
multiple: true,
mustMatch: false,
minLength: 4,
delay: 100,
search: function (event,ui) {
window.pageIndex = 0;
},
source: function (request, response) {
response(customFilter(
availableCode, request.term));
}
});
} );
一些更新:
在经典的 ASP 代码的开头,我添加了下面的缓存控制,它做了一些改进,但仍然没有用。
<%@ Language=VBScript %>
<%
Response.buffer=true
Response.Expires = -1
Response.ExpiresAbsolute = Now() -1
Response.CacheControl = "no-cache"
Response.AddHeader "cache-control", "private"
Response.AddHeader "Pragma", "no-cache"
%>
瓶颈之一是将数据输出到数组 CodeList,然后循环遍历数据并写入每一行以填充您的 javascript 数组。如果数组CodeList中的数据不经常变化,我使用计划任务运行一天几次运行s一个vbscript生成html/asp页面,[=16] =] 数组没有 asp 循环。您将用实际的 javascript 数组数据替换 for/next asp 循环。该页面将加载得更快。
对于匹配器,我做了以下更改。
var matcher = new RegExp("" + term, "i");
我还添加了 "slice" 以仅显示前 100 个。这在这个问题上取得了显着的性能改进。
$( "#frmCode" ).autocomplete({
multiple: true,
multipleSeparator: " ",
mustMatch: false,
minLength: 2,
search: function (event,ui) {
window.pageIndex = 0;
},
source: function (request, response) {
response(customFilter(
availableCode, request.term).slice(0, 100));
}
谢谢大家的指教!
经典 ASP 中有一个自动完成文本框。最小长度设置为 4,但自动完成列表 returns 超过 500 条记录时速度非常慢。
登录控制台returns 预期结果,如果少于 500 行,将在自动完成文本框中返回正确的列表。
如果我想在滚动时加载更多数据而不是加载页面,最好的方法是什么?
$(document).ready( function(){
var availableCode = new Array();
var strCode = "";
<%
Dim idxJs
for idxJs = 0 to UBound(CodeList)-1
%>
availableCode[<%=idxJs %>] = unescape('<%= Escape(CodeList(idxJs)) %>');
<% next %>
function customFilter(array, terms) {
arrayOfTerms = terms.split(" ");
var term = $.map(arrayOfTerms, function (tm) {
return $.ui.autocomplete.escapeRegex(tm);
}).join('|');
var matcher = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term+")(?![^<>]*>)(?![^&;]+;)" , "i");
return $.grep(array, function (value) {
console.log("result - " + matcher.test(value.label || value.value || value));
console.log("value - " + value)
return matcher.test(value.slice(0, 10));
});
};
$( "#frmCode" ).autocomplete({
multiple: true,
mustMatch: false,
minLength: 4,
delay: 100,
search: function (event,ui) {
window.pageIndex = 0;
},
source: function (request, response) {
response(customFilter(
availableCode, request.term));
}
});
} );
一些更新: 在经典的 ASP 代码的开头,我添加了下面的缓存控制,它做了一些改进,但仍然没有用。
<%@ Language=VBScript %>
<%
Response.buffer=true
Response.Expires = -1
Response.ExpiresAbsolute = Now() -1
Response.CacheControl = "no-cache"
Response.AddHeader "cache-control", "private"
Response.AddHeader "Pragma", "no-cache"
%>
瓶颈之一是将数据输出到数组 CodeList,然后循环遍历数据并写入每一行以填充您的 javascript 数组。如果数组CodeList中的数据不经常变化,我使用计划任务运行一天几次运行s一个vbscript生成html/asp页面,[=16] =] 数组没有 asp 循环。您将用实际的 javascript 数组数据替换 for/next asp 循环。该页面将加载得更快。
对于匹配器,我做了以下更改。
var matcher = new RegExp("" + term, "i");
我还添加了 "slice" 以仅显示前 100 个。这在这个问题上取得了显着的性能改进。
$( "#frmCode" ).autocomplete({
multiple: true,
multipleSeparator: " ",
mustMatch: false,
minLength: 2,
search: function (event,ui) {
window.pageIndex = 0;
},
source: function (request, response) {
response(customFilter(
availableCode, request.term).slice(0, 100));
}
谢谢大家的指教!