3

我对使用 Javascript/Jquery 非常陌生,因此感谢您的阅读和您对可能是一个简单问题的耐心。这是一个多层次的问题,所以让我解释一下。

我有几个数据绑定的 ASP 列表框。我还有几个复选框,每个列表框一个。我使用 Javascript 连接了复选框,以在单击时选择或取消选择所有列表框项目。

我的目标是构建一个方法,将复选框及其相应的列表框传递给 javascript 方法,然后选择或取消选择列表框中的所有内容。我可以在 C# 中非常简单地做到这一点,但我们不能使用回发,因为页面已经很慢而且很复杂。

所以这已经在 J​​avascript 中工作了(我将在下面发布我的代码),但我遇到的问题是,当我们有一个更长的列表框(即 20 多个列表项)时,IE 基本上会让你看着它滚动浏览所有这些并选择它们。Chrome 没有这个问题,而 Firefox 至少要快很多,但 IE 是我们 75% 以上的客户使用的浏览器。

ASP:

<asp:ListBox ID="StatusListBx" runat="server" DataSourceID="StatusLds" 
    DataTextField="Status" DataValueField="StatusID"  Width="140px" Height="55px" AppendDataBoundItems="true"
    SelectionMode="Multiple"/> 
<asp:LinqDataSource ID="StatusLds" runat="server" 
    ContextTypeName="ElementDataConnector.ElementDBDataContext" 
    Select="new (StatusID, Status)" Where="StatusID < 4" TableName="Lookup_Status" >
</asp:LinqDataSource>
<br />
<asp:CheckBox id="SelectAllProjectStatusChkbx" runat="server" Text="Select All" />

C#:

protected void Page_Load(object sender, EventArgs e)
{
    SelectAllProjectStatusChkbx.Attributes.Add("onclick", "selectDeselect(" + StatusListBx.ClientID + ",this)");
}

Javascript:

function selectDeselect(listbox, checkbox) {
    if (checkbox.checked) {
        var multi = document.getElementById(listbox.id);
        for (var i = 0; i < multi.options.length; i++) {
            multi.options[i].selected = true;
        }
    } else {
        var multi = document.getElementById(listbox.id);
        multi.selectedIndex = -1;
    }
}

(我已经为每个适用的列表框/复选框组合复制了这个 - 这是一个可扩展的任务)

所以对于实际问题:

  1. 如果我使用 JQuery 而不是 Javascript 来实现这个功能,我能避免整个“滚动/选择”效果吗?

  2. 如果我可以避免这种滚动效果,我如何动态地将列表框传递给 JQuery,而不必为每个列表框/复选框组合编写自定义方法?

感谢您阅读并感谢您提供的任何帮助。

4

2 回答 2

9

看看这篇文章:

http://www.craiglotter.co.za/2010/02/26/jquery-select-all-options-in-a-multiple-select-listbox/

jQuery:选择多选列表框中的所有选项

$("#multipleselect option").prop("selected",true);

一个多选列表框,其中已经为您选择了所有内容!

于 2014-04-03T16:57:02.340 回答
4

我手头没有 IE 来检查您所指的滚动效果,但它应该很容易让您测试。你可以保留你的 selectDeselect 函数,但它可能会变成这样(假设 jQuery ~ 1.7.2+):

function selectDeselect(listbox, checkbox) {
    var select_all = $(checkbox).prop('checked') ? true : false;
    var select = $(listbox);
    $('option', select).prop('selected', select_all);
}

我希望非 jQuery 代码更快,但试一试......

编辑:以上在 IE 中也很慢。

我不喜欢这种方法,但您可以尝试在选择下拉列表中替换实际的 HTML。就像是:

function selectDeselect(listbox, checkbox) {
    var select_all = $(checkbox).prop('checked') ? true : false;        
    var select = $(listbox);    
    if (select_all) {
        var clone = select.clone();
        $('option', clone).attr('selected', select_all);
        var html = clone.html();
        select.html(html);
    }
    else $('option', select).removeAttr('selected');    
}

它似乎在 IE9 中工作:jsfiddle

于 2013-03-05T20:00:26.127 回答