最適化jQuery .each - DropDownListでの隠蔽オプションを最適化します
-
20-12-2019 - |
質問
私は2つのオプションセットを持っています。DDLProductが変更されたとき、私は非表示にしてddlpackageでオプションをいくつか表示します。製品とパッケージ間のマッピングは各パッケージオプションで値です。この
のように<select name="ctl00$MidContent$ddlPackage" class="selectpicker" id="ddlPackage" style="display: none;" data-width="100%" data-style="btn-own btn-select hideDisabled">
<option value="134260004;Administrace;AXAPTA">
.
この文字列を分割し、最後の部分を現在選択されている製品に比較しています。
DropDownListはブートストラップ拡張機能を使用します - 選択/
しかし遅すぎる。Expecialy IE
$("#ddlProduct").change(function () {
var product = $("#ddlProduct option:selected").text().trim();
$("#ddlPackage option").each(function () {
var optValues = $(this).val().split(";");
var opt2 = optValues[2].trim();
if (opt2 == "") {
$(this).show();
}
else {
if (opt2 == product) {
$(this).show();
}
else {
$(this).hide();
}
}
});
$("#ddlPackage").val($("#ddlPackage option:first").val());
$("#ddlPackage").selectpicker('refresh');
<asp:Panel ID="Panel39" runat="server" CssClass="row">
<asp:Panel ID="Panel40" runat="server" CssClass="row compenserow col-lg-4 col-md-4 col-sm-6">
<asp:Label ID="Label29" runat="server" CssClass="col-lg-4 col-md-4 col-sm-4 col-xs-4">Prudukt: </asp:Label>
<asp:Panel ID="Panel63" runat="server" CssClass="bootstrap-select col-lg-8 col-md-8 col-sm-8 col-xs-8">
<asp:DropDownList ID="ddlProduct" data-style="btn-own btn-select" data-width="100%" runat="server" CssClass="selectpicker" ClientIDMode="Static"></asp:DropDownList>
</asp:Panel>
</asp:Panel>
<asp:Panel ID="Panel41" runat="server" CssClass="row compenserow col-lg-4 col-md-4 col-sm-6">
<asp:Label ID="Label31" runat="server" CssClass="col-lg-4 col-md-4 col-sm-4 col-xs-4">Balík: </asp:Label>
<asp:Panel ID="Panel64" runat="server" CssClass="bootstrap-select col-lg-8 col-md-8 col-sm-8 col-xs-8">
<asp:DropDownList ID="ddlPackage" data-style="btn-own btn-select hideDisabled" data-width="100%" runat="server" CssClass="selectpicker" ClientIDMode="Static"></asp:DropDownList>
</asp:Panel>
</asp:Panel>
</asp:Panel>
. 解決
あなたの問題、私の意見では、その文字列操作です。多くのオプションのために処理するのにたくさん時間がかかります(私は約100のオプションを期待します)。使用する代わりにデータ属性を使用する必要があります。1つのオプション値の複数の情報の区切り文字として。
あなたのコードはこのように見えることができます:
<option value="134260004;Administrace;AXAPTA" data-id="134260004" data-text="Administrace" data-product="AXAPTA">
.
そして今、あなたはただjQueryで何を読んでください:
$("#ddlPackage option").each(function () {
var opt2 = $(this).data('product');
if (opt2 == "") {
$(this).show();
}
else if (opt2 == product)
{
$(this).show();
}
else $(this).hide();
}
});
.
このようにして、すべての変更イベントでたくさんの文字列を解析する必要があり、それははるかに速くなるはずです:)
他のヒント
クラスとしてフィルタリングする製品を追加する方法:
<option value="134260004;Administrace;AXAPTA" class="Administrace">
.
と
$("#ddlProduct").change(function () {
var product= $("#ddlProduct option:selected").text().trim();
$("#ddlPackage option:not(."+product+")").hide();
$("#ddlPackage option ."+product).show();
});
.
またはPirozekの方法で
<option value="134260004;Administrace;AXAPTA" data-text="Administrace">
.
と
$("#ddlProduct").change(function () {
var product= $("#ddlProduct option:selected").text().trim();
$("#ddlPackage option:not([data-text='"+product+"'])").hide();
$("#ddlPackage option[data-text='"+product+"']").show();
});
.
このようにして、その文字列のトリム操作は、以前の解決策で述べた。
所属していません StackOverflow