[jquery] jQuery를 사용하여 선택 목록에서 옵션 숨기기

선택 목록에서 숨기거나 제거하려는 옵션의 키 / 값 쌍이있는 개체가 있습니다. 다음 옵션 선택기는 작동하지 않습니다. 내가 무엇을 놓치고 있습니까?

$.each(results['hide'], function(name, title) {
  $("#edit-field-service-sub-cat-value option[value=title]").hide();
  $("#edit-field-service-sub-cat-value option[@value=title]").hide();
}); 



답변

그만한 가치가있는 두 번째 양식 ( @)은 jQuery 1.3에 존재하지 않습니다. 변수 보간을 예상하고 있기 때문에 첫 번째는 작동하지 않습니다. 이 시도:

$("#edit-field-service-sub-cat-value option[value=" + title + "]").hide();

titlejQuery 선택기 메타 문자 가 포함 된 경우 여러 가지 끔찍한 방식으로 중단 될 수 있습니다.


답변

이 x- 브라우저는 할 수 없습니다. 내가 기억하면 문제가 있습니다. 가장 쉬운 방법은 항목을 제거하기 전에 선택 항목의 복제 사본을 보관하는 것입니다. 이렇게하면 누락 된 항목을 쉽게 제거한 다음 다시 추가 할 수 있습니다.


답변

더 나은 방법을 찾았으며 매우 간단합니다.

$("option_you_want_to_hide").wrap('<span/>')

다시 표시하려면 해당 옵션 (스팬 아님) 및 $("option_you_want_to_show").unwrap().

Chrome 및 Firefox 에서 테스트되었습니다 .


답변

네이티브 DOM 메서드로 인해 약간 더 빠를 가능성이 있습니다.

$.each(results['hide'], function(name, title) {
    $(document.getElementById('edit-field-service-sub-cat-value').options).each(function(index, option) {
      if( option.value == title ) {
        option.hidden = true; // not fully compatible. option.style.display = 'none'; would be an alternative or $(option).hide();
      }
    });
});


답변

이것은 Firefox 3.0에서 작동하지만 MSIE 8이나 Opera 9.62에서는 작동하지 않습니다.

jQuery('#destinations').children('option[value="1"]').hide();
jQuery('#destinations').children('option[value="1"]').css('display','none');

그러나 옵션을 숨기는 대신 간단히 비활성화 할 수 있습니다.

jQuery('#destinations').val('2');
jQuery('#destinations').children('option[value="1"]').attr('disabled','disabled');

위의 두 줄 중 첫 번째 줄은 Firefox 용이며 두 번째 옵션에 포커스를 전달합니다 (value = “2”가 있다고 가정). 생략하면 옵션이 비활성화되지만 드롭 다운하기 전에 “활성화 됨”옵션이 계속 표시됩니다. 따라서이를 방지하기 위해 다른 옵션에 초점을 전달합니다.


답변

크로스 브라우저에서 수행 할 수 있습니다. 맞춤 프로그래밍이 필요합니다. http://jsfiddle.net/sablefoste/YVMzt/6/ 에서 내 바이올린을 참조하십시오 . Chrome, Firefox, Internet Explorer 및 Safari에서 작동하도록 테스트되었습니다.

간단히 말해, #optionstore배열을 순차적으로 저장 하는 숨겨진 필드가 있습니다 (JavaScript에서 연관 배열을 가질 수 없기 때문에). 그런 다음 범주를 변경하면 기존 옵션을 구문 분석하여 (처음부터 만)에 쓰고 #optionstore모든 항목을 지우고 범주와 관련된 옵션 만 다시 넣습니다.

참고 : 사용자에게 표시되는 텍스트와 다른 옵션 값을 허용하기 위해 이것을 만들었으므로 매우 유연합니다.

HTML :

<p id="choosetype">
    <div>
        Food Category:
    </div>
    <select name="category" id="category" title="OPTIONAL - Choose a Category to Limit Food Types" size="1">
        <option value="">All Food</option>
        <option value="Food1">Fruit</option>
        <option value="Food2">Veggies</option>
        <option value="Food3">Meat</option>
        <option value="Food4">Dairy</option>
        <option value="Food5">Bread</option>
    </select>
    <div>
        Food Selection
    </div>
    <select name="foodType" id="foodType" size="1">
        <option value="Fruit1" class="sub-Food1">Apples</option>
        <option value="Fruit2" class="sub-Food1">Pears</option>
        <option value="Fruit3" class="sub-Food1">Bananas</option>
        <option value="Fruit4" class="sub-Food1">Oranges</option>
        <option value="Veg1" class="sub-Food2">Peas</option>
        <option value="Veg2" class="sub-Food2">Carrots</option>
        <option value="Veg3" class="sub-Food2">Broccoli</option>
        <option value="Veg4" class="sub-Food2">Lettuce</option>
        <option value="Meat1" class="sub-Food3">Steak</option>
        <option value="Meat2" class="sub-Food3">Chicken</option>
        <option value="Meat3" class="sub-Food3">Salmon</option>
        <option value="Meat4" class="sub-Food3">Shrimp</option>
        <option value="Meat5" class="sub-Food3">Tuna</option>
        <option value="Meat6" class="sub-Food3">Pork</option>
        <option value="Dairy1" class="sub-Food4">Milk</option>
        <option value="Dairy2" class="sub-Food4">Cheese</option>
        <option value="Dairy3" class="sub-Food4">Ice Cream</option>
        <option value="Dairy4" class="sub-Food4">Yogurt</option>
        <option value="Bread1" class="sub-Food5">White Bread</option>
        <option value="Bread2" class="sub-Food5">Panini</option>
    </select>
    <span id="optionstore" style="display:none;"></span>
</p>

JavaScript / jQuery :

$(document).ready(function() {
    $('#category').on("change", function() {
        var cattype = $(this).val();
        optionswitch(cattype);
    });
});

function optionswitch(myfilter) {
    //Populate the optionstore if the first time through
    if ($('#optionstore').text() == "") {
        $('option[class^="sub-"]').each(function() {
            var optvalue = $(this).val();
            var optclass = $(this).prop('class');
            var opttext = $(this).text();
            optionlist = $('#optionstore').text() + "@%" + optvalue + "@%" + optclass + "@%" + opttext;
            $('#optionstore').text(optionlist);
        });
    }

    //Delete everything
    $('option[class^="sub-"]').remove();

    // Put the filtered stuff back
    populateoption = rewriteoption(myfilter);
    $('#foodType').html(populateoption);
}

function rewriteoption(myfilter) {
    //Rewrite only the filtered stuff back into the option
    var options = $('#optionstore').text().split('@%');
    var resultgood = false;
    var myfilterclass = "sub-" + myfilter;
    var optionlisting = "";

    myfilterclass = (myfilter != "")?myfilterclass:"all";

    //First variable is always the value, second is always the class, third is always the text
    for (var i = 3; i < options.length; i = i + 3) {
        if (options[i - 1] == myfilterclass || myfilterclass == "all") {
            optionlisting = optionlisting + '<option value="' + options[i - 2] + '" class="' + options[i - 1] + '">' + options[i] + '</option>';
            resultgood = true;
        }
    }
    if (resultgood) {
        return optionlisting;
    }
}


답변

가장 좋은 방법은 비활성화하려는 옵션 항목에 disabled = true를 설정 한 다음 CSS 세트에서 설정하는 것입니다.

option:disabled {
    display: none;
}

이렇게하면 브라우저가 비활성화 된 항목 숨기기를 지원하지 않더라도 여전히 선택할 수 없습니다. 그러나 이를 지원하는 브라우저에서는 숨겨집니다.