0

このコードがページを循環していて、選択ボックスがチェックされているときにわずかなページ ラグが発生します。コードを最適化する方法はありますか? 私はまだJavaScriptに非常に慣れていないので、いくつかのことを混同している可能性があります。

var OpeningEmployees = document.getElementById('opener');
var QuantityDDOptions = jQuery('#opener option').length;

var DropDownNames = new Array();
DropDownNames[0] = "opener";
DropDownNames[1] = "mid";
DropDownNames[2] = "closer";
DropDownNames[3] = "SRTW";
DropDownNames[4] = "CR";
DropDownNames[5] = "Aisles";
DropDownNames[6] = "BD";
DropDownNames[7] = "Fridge";
DropDownNames[8] = "AP";
DropDownNames[9] = "EPV";



OpeningEmployees.onchange = function () {
    var openerVals = $("#opener").val();
    for (var j = 1; j < DropDownNames.length; j++){
        for (var x = 0; x < QuantityDDOptions; x++) {
            var EmployeelNumLine = document.getElementById(DropDownNames[j]).options[x].value;
            if (openerVals == null){
                jQuery("select#"+DropDownNames[j]+" option")[x].removeAttribute("disabled");
                $("#"+DropDownNames[j]).multiselect("refresh");
            } else if(openerVals.indexOf(EmployeelNumLine) > -1) {
                jQuery("select#"+DropDownNames[j]+" option")[x]['disabled'] = "true";
                $("#"+DropDownNames[j]).multiselect("refresh");
            } else if(!openerVals.indexOf(EmployeelNumLine) > -1){
                jQuery("select#"+DropDownNames[j]+" option")[x].removeAttribute("disabled");
                $("#"+DropDownNames[j]).multiselect("refresh");
            }
        }
    }
}
4

1 に答える 1

1

一般に、ループがスレッドをロックしている場合は、タイムアウトを使用して呼び出される再帰ループとしてリファクタリングできます。これにより、UI がフリーズするのを防ぎます。

の値が大きい場合n、ブラウザがフリーズします。

for (i = 0; i < n; i++){
    //dosomething();
}

一方、これは速度を落としますが、ブラウザをロックしません:

(function iterate(i) {
    if (i < n) {
        //dosomething();

        setTimeout(function () {
            iterate(++i);
        }, 0);
    }
})(0)
于 2013-03-22T02:29:46.997 に答える