1

我正在尝试根据选择的单选按钮过滤下拉选项。过滤进行得很好,但问题是,在过滤发生后,第一个元素仍在显示。

查看演示:http: //jsfiddle.net/animeshb/7Wqfj/

<div id="step1">
    <input class="radiobutton" dataval="PAT" name="TemplateTypes" type="radio" />
    <div>Patient</div>
    <input class="radiobutton" dataval="EMPLOYEE" name="TemplateTypes" type="radio" />
    <div>Employee</div>
    <input class="radiobutton" dataval="MACHINE" name="TemplateTypes" type="radio" />
    <div>Machine</div>
    <select class="selectLDlist" id="ddlAllTemplates" name="AllTemplates">
        <option value="77492|ET_07|EMPLOYEE|08/16/13|08/16/14|Approved|Y|70744">EMPLOYEE</option>
        <option value="70470|testing|PAT|08/16/13|08/16/14|Approved|Y|70428">Patient</option>
        <option value="70472|testing|PAT|08/12/13|08/16/14|Approved|Y|30213">Patient</option>
        <option value="70472|testing|EMPLOYEE|08/13/13|08/16/14|Approved|Y|30213">EMPLOYEE</option>
        <option value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Patient</option>
        <option value="70472|testing|MACHINE|08/14/13|08/16/14|Approved|Y|30213">MACHINE</option>
        <option value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Patient</option>
    </select>
</div>

和 jQuery:

$('.radiobutton').change(function () {
    var templateType = $("#step1 input:radio[class=radiobutton]:checked").attr("dataval");

    var ddlAllTemplates = $('#ddlAllTemplates');
    var options = ddlAllTemplates.find('option');

    $('#ddlAllTemplates option').each(function () {

        var extract = $(this).attr('value').split('|')[2];
        if (extract == templateType) $(this).show();
        else $(this).hide();

    });
});
4

5 回答 5

3

编辑:要创建跨浏览器解决方案,您确实必须移动选项

其他人已经解决了最初的问题,以便使这对任何未来的读者更有用,这里是一个选择的通用版本(使用数据属性而不是管道分隔)。这个 jQuery 不需要创建额外的隐藏选择,它只会将选项作为目标选择的隐藏兄弟移动并根据需要将它们移回。

http://jsfiddle.net/2msfH/

<div id="step1">
    <input class="radiobutton" data-type="PAT" name="TemplateTypes" type="radio" /><div>Patient</div>
    <input class="radiobutton" data-type="EMPLOYEE" name="TemplateTypes" type="radio" /><div>Employee</div>
    <input class="radiobutton" data-type="MACHINE" name="TemplateTypes" type="radio" /><div>Machine</div>
    <select class="selectLDlist" id="ddlAllTemplates" name="AllTemplates">
        <option value="77492" data-type="EMPLOYEE" data-date="08/16/13">EMPLOYEE</option>
        <option value="70470" data-type="PAT" data-date="08/16/13">Patient</option>
        <option value="70472" data-type="PAT" data-date="08/12/13">Patient</option>
        <option value="70472" data-type="EMPLOYEE" data-date="08/13/13">EMPLOYEE</option>
        <option value="70472" data-type="PAT" data-date="8/14/13">Patient</option>
        <option value="70472" data-type="MACHINE" data-date="08/14/13">MACHINE</option>
        <option value="70472" data-type="PAT" data-date="08/14/13">Patient</option>
    </select>
</div>

查询:

$('.radiobutton').change(function () {
    var optionsToRemove = $('#ddlAllTemplates option[data-type!=' + $(this).data('type') + ']');
    var optionsToBringBack = $('#ddlAllTemplates ~ option[data-type=' + $(this).data('type') + ']');
    optionsToRemove.hide().insertAfter('#ddlAllTemplates');
    optionsToBringBack.show().appendTo('#ddlAllTemplates');
});

$('#ddlAllTemplates ~ option')将带回#ddlAllTemplates那场比赛的所有兄弟姐妹option

于 2013-08-22T09:38:00.007 回答
2

在查看先前答案的演示时,我有点困惑,它们都没有奏效。因此,Chrome (v29) 似乎根本不喜欢隐藏选择框上的选项。这可能是 chrome 本身的错误,也可能不是我想尝试解决它的问题。

我的解决方法是使用第二个“假”选择,每次都填充所需的选项,然后使用假选择来驱动真正的选择框。

理想情况下,真正的选择应该被隐藏,但我保持它对演示可见。我试图对 HTML 进行尽可能少的更改,因此大部分更改都在 javascript 内部。

$(document).ready(function(){ // When the document is ready populates the fakelist
    $('#ddlAllTemplates option').each(function (index) {
        $(this).attr('id', 'option-'+index);
        $(this).clone().attr('value', this.id).appendTo('#fakelist'); 
    });
});

$('.radiobutton').change(function () {
    var found = false; // Need this for later to find the first matching option
    var templateType = $(this).attr("dataval");

    $('#fakelist').html(''); // Empty the fakelist

    $('#ddlAllTemplates option').each(function (index) {
        var extract = $(this).attr('value').split('|')[2];      

        if (extract == templateType) {
            // Clone and push the option on the fakelist
            $(this).clone().attr('value', this.id).appendTo('#fakelist'); 

            if (!found) {
                found = true;
                $(this).prop('selected',true);
            }

        }

    });
});

$('#fakelist').change(function () {
    // And select the appropriate ID using the value from the fakelist option.
    var selected = $(this).children('option:checked').attr('id');
    $('#'+selected).prop('selected',true);
});

这是演示:http: //jsfiddle.net/edYHT/

编辑 我已经用我个人解决问题的方法做了一个演示,总是使用第二个选择框,但在这个演示中,第二个选择框变成了真正的选择框,前一个只是一个数据源(在这次我可能会构建一个 AJAX 脚本来从数据库中获取数据并在每次更改框时进行查询,可能会缓存数据。)

这允许将第二个框发送到表单并大大减少 javascript(并允许非 js 浏览器仍然将数据发送到表单)

我还保留了相同的“值”属性,因为这些值之间并没有真正的唯一 ID,但可能我会使用与数据库匹配的唯一 ID。

最后但不是最后一个,适用于 IE6 及更高版本(已测试),因此您的 IE8 不应该有任何问题。

标记:

<div id="form-step-1" class="form-step-single">
    <label for="radio-patient"><input class="radiobutton" id="radio-patient" value="PAT" name="TemplateTypes" type="radio" /> Patient</label>
    <label for="radio-employee"><input class="radiobutton" id="radio-employee" value="EMPLOYEE" name="TemplateTypes" type="radio" /> Employee</label>
    <label for="radio-machine"><input class="radiobutton" id="radio-machine" value="MACHINE" name="TemplateTypes" type="radio" /> Machine</label>

    <select class="selectlist hidden" id="ddl-all-templates">
        <option data-type="EMPLOYEE" value="77492|ET_07|EMPLOYEE|08/16/13|08/16/14|Approved|Y|70744">Jean Luc Picard</option>
        <option data-type="PAT" value="70470|testing|PAT|08/16/13|08/16/14|Approved|Y|70428">Flash Gordon</option>
        <option data-type="PAT" value="70472|testing|PAT|08/12/13|08/16/14|Approved|Y|30213">Jason Voorhees</option>
        <option data-type="EMPLOYEE" value="70472|testing|EMPLOYEE|08/13/13|08/16/14|Approved|Y|30213">Freddy Krueger</option>
        <option data-type="PAT" value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Darth Vader</option>
        <option data-type="MACHINE" value="70472|testing|MACHINE|08/14/13|08/16/14|Approved|Y|30213">ED209</option>
        <option data-type="PAT" value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Michael Knight</option>
    </select>
    <select class="selectlist" id="fakelist" name="AllTemplates">
        <option data-type="EMPLOYEE" value="77492|ET_07|EMPLOYEE|08/16/13|08/16/14|Approved|Y|70744">Jean Luc Picard</option>
        <option data-type="PAT" value="70470|testing|PAT|08/16/13|08/16/14|Approved|Y|70428">Flash Gordon</option>
        <option data-type="PAT" value="70472|testing|PAT|08/12/13|08/16/14|Approved|Y|30213">Jason Voorhees</option>
        <option data-type="EMPLOYEE" value="70472|testing|EMPLOYEE|08/13/13|08/16/14|Approved|Y|30213">Freddy Krueger</option>
        <option data-type="PAT" value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Darth Vader</option>
        <option data-type="MACHINE" value="70472|testing|MACHINE|08/14/13|08/16/14|Approved|Y|30213">ED209</option>
        <option data-type="PAT" value="70472|testing|PAT|08/14/13|08/16/14|Approved|Y|30213">Michael Knight</option>
    </select>
</div>

JS:

$('.radiobutton').change(function () {
    var type = $(this).val();
    $('#fakelist').html('');

    $('#ddl-all-templates option').each(function (index) {
        if (type == $(this).attr('data-type'))
            $(this).clone().appendTo('#fakelist'); 
    });
});

和演示:) http://jsfiddle.net/B6nEs/

最后一次编辑,我保证:JS 甚至可以更小:

$('.radiobutton').change(function () {
    $('#fakelist').html('');
    $('#ddl-all-templates option[data-type="'+$(this).val()+'"]').each(function() {
        $(this).clone().appendTo('#fakelist'); 
    });
});
于 2013-08-22T10:46:56.873 回答
0

我已经更新了小提琴中匹配选项元素的属性,如下所示

$('#ddlAllTemplates option').each(function () {

    var extract = $(this).attr('value').split('|')[2];
    if (extract == templateType) 
        $(this).prop("selected",true); //Changed line of code
    else 
        $(this).hide();

});

现在 DDL 显示基于所选单选按钮选项的值。你已经在样本中通过了 95%。

于 2013-08-22T09:05:52.670 回答
0

一种解决方案是在显示/隐藏选项后设置所选值:

$('#ddlAllTemplates').val($("#ddlAllTemplates option:visible:first").val());

请参阅编辑过的小提琴:http: //jsfiddle.net/7Wqfj/24/

注意:正如 Zac 所说,这只适用于 Firefox。替代解决方案是:

$('.radiobutton').change(function () {
    var templateType = $("#step1 input:radio[class=radiobutton]:checked").attr("dataval");

    var ddlAllTemplates = $('#ddlAllTemplates');
    var options = ddlAllTemplates.find('option');

    var validOption = false;
    $('#ddlAllTemplates option').each(function () {
        var extract = $(this).attr('value').split('|')[2];
        if (extract == templateType) {
            $(this).show();
            validOption = $(this).val();
        }
        else $(this).hide();

    });

    $('#ddlAllTemplates').val(validOption);
});

http://jsfiddle.net/7Wqfj/26/

于 2013-08-22T09:08:40.333 回答
-1

演示 i think you want like this

$('.radiobutton').change(function () {
    var templateType = $("#step1 input:radio[class=radiobutton]:checked").attr("dataval");


    var ddlAllTemplates = $('#ddlAllTemplates');
    var options = ddlAllTemplates.find('option:contains('+templateType+')').val();


});
于 2013-08-22T09:08:06.870 回答