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

kra*_*626 5 ajax performance jquery select web-services

我有几个选择,我使用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+/)]; });
}
Run Code Online (Sandbox Code Playgroud)

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

更新:(3)这工作得很好.虽然存在一些问题.我有onBlur(调用函数重新加载选择),当onBlur被激活并且选择重新加载时,页面只需要FOREVER加载,所以我必须停止它...不知道为什么?

    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);
} 
Run Code Online (Sandbox Code Playgroud)

Gab*_*oli 7

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

像这样

var vSelect = $('<select/>'); // our virtual select element
Run Code Online (Sandbox Code Playgroud)

并在each方法中使用它来追加options

vSelect.append('<option>..</option>');
Run Code Online (Sandbox Code Playgroud)

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

$(selectId).html( vSelect.html() );
Run Code Online (Sandbox Code Playgroud)

能加速你当前代码的其他东西是保持对select元素的引用(而不是它的id)并直接附加到它而不是让jquery在每个附加中找到元素(就像你现在一样)


使用完整代码更新

替换FilLSelect内部的部分

ServiceCall(service,
            param,
            <SNIP>...<SNIP>,
            FailedServiceCall);
            }
Run Code Online (Sandbox Code Playgroud)

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);
            }
Run Code Online (Sandbox Code Playgroud)

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

option_value:option_text<TAB>option_value:option_text<TAB>option_value:option_text... 那么你可以用正则表达式替换它,然后将它放在select元素中.

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