gpt4 book ai didi

jquery - 使用 Jquery ajax 填充 select 的最*有效*方法

转载 作者:行者123 更新时间:2023-12-03 23:01:01 25 4
gpt4 key购买 nike

我有几个使用 JQuery Ajax 填充的选择。大多数负载良好。然而,其中一两个查询在极少数情况下会返回大量记录到选择。我想知道我填充选择的方式是否是从客户端代码执行此操作的最有效方法。

我省略了一些内容以使代码更短。

$(function () {
FillAwcDll()
});
function FillAwcDll() {
FillSelect('poleDdl', 'WebService.asmx/Pole', params, false, null, false);
}

function ServiceCall(method, parameters, onSucess, onFailure) {
var parms = "{" + (($.isArray(parameters)) ? parameters.join(',') : parameters) + "}"; // to json
var timer = setTimeout(tooLong, 100000);
$.ajax({
type: "POST",
url: appRoot + "/services/" + method,
data: parms,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clearTimeout(timer);
alert("success");
if (typeof onSucess == 'function' || typeof onSucess == 'object')
onSucess(msg.d);
},
error: function (msg, err) {

}
}
});

function FillSelect(sel, service, param, hasValue, prompt, propCase) {
var selectId = 'select#{0}'.format(sel);
if ($(selectId) == null) {
alert('Invalid FillSelect ID');
return;
}
$(selectId + ' option').remove();
$('<option class=\'loading\' value=\'\'>loading...</option>').appendTo(selectId);
ServiceCall(service,
param,
function (data, args) {
$(selectId + ' option').remove();

if (prompt != null && prompt.length > 0) {
$('<option class=\'selectPrompt\' value=\'\' selected>{0}</option>'.format(prompt)).appendTo(selectId);
}
$.each(data, (hasValue)
? function (i, v) {
$('<option value=\'{0}\'>{1}</option>'.format(v.Key, (propCase) ? v.Value.toProperCase() : v.Value)).appendTo(selectId);
}
: function (i, v) {
$('<option value=\'{0}\'>{1}</option>'.format(v, (propCase) ? v.toProperCase() : v)).appendTo(selectId);
})

},
FailedServiceCall);
}

String.prototype.format = function () {
var pattern = /\{\d+\}/g;
var args = arguments;
return this.replace(pattern, function (capture) { return args[capture.match(/\d+/)]; });
}

所以这只是循环并填充选择。有一个更好的方法吗?请注意,alert("success") 行几乎立即触发,因此数据很快返回,但之后它会挂起并尝试填充选择。

更新:(3) 这运行得非常好。虽然有一些问题。我有 onBlur(调用函数来重新加载选择),当 onBlur 被激活并且选择重新加载时,页面只需要永远加载,所以很长一段时间我必须停止它......不知道为什么?

    ServiceCall(service,
param,
function (data, args) {
var $select = $(selectId);
var vSelect = '';
if (prompt != null && prompt.length > 0) {
vSelect += '<option class=\'selectPrompt\' value=\'\' selected>{0}</option>'.format(prompt);
}
if (hasValue) {
$.each(data, function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v.Key, (propCase) ? v.Value.toProperCase() : v.Value);
});
}
else {
$.each(data, function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v, (propCase) ? v.toProperCase() : v);
});
}
$select.html(vSelect);
delete vSelect;
delete data;
},
FailedServiceCall);
}

最佳答案

您是否尝试过在内存中创建一个 jquery 对象并填充该对象,最后将其放入 DOM 中?

像这样

var vSelect = $('<select/>'); // our virtual select element

以及each方法使用它来附加 options

vSelect.append('<option>..</option>');

最后在 DOM 中附加虚拟对象的 html

$(selectId).html( vSelect.html() );
<小时/>

可以加快当前代码速度的其他方法是保留对 select 的引用。元素(而不是它的 id)并直接附加到它,而不是让 jquery 在每个附加中查找元素(就像你现在所做的)

<小时/>

更新完整代码

替换FillSelect里面的部分

ServiceCall(service,
param,
<SNIP>...<SNIP>,
FailedServiceCall);
}

ServiceCall(service,
param,
function (data, args) {
var $select = $(selectId);
var vSelect = '';
if (prompt != null && prompt.length > 0) {
vSelect += '<option class=\'selectPrompt\' value=\'\' selected>{0}</option>'.format(prompt);
}
if (hasValue)
{
$.each(data, function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v.Key, (propCase) ? v.Value.toProperCase() : v.Value);
});
}
else
{
$.each(data,function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v, (propCase) ? v.toProperCase() : v);
});
}
$select.html( vSelect );

},
FailedServiceCall);
}

如果您的页面可以以字符串形式返回整个数据,格式为

option_value:option_text<TAB>option_value:option_text<TAB>option_value:option_text...那么你可以用正则表达式进行替换,然后将其放入选择元素中。

var options = data.replace( /([\S ]+)(?=:)(:)([\S ]+)/gi, '<option value="$1">$3</option>');
$(selectID).empty().append(options);

关于jquery - 使用 Jquery ajax 填充 select 的最*有效*方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4096671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com