[javascript] CSS로 <select> 메뉴에서 <option>을 숨기는 방법은 무엇입니까?

Chrome <option><select>. Firefox는 할 것입니다.

<option>검색 기준과 일치 하는를 숨겨야 합니다. Chrome 웹 도구에서 display: none;JavaScript 에 의해 올바르게 설정되고 있음을 알 수 있지만 <select>메뉴를 클릭하면 표시됩니다.

<option>메뉴를 클릭 할 때 내 검색 기준과 일치 하는 이러한 항목이 표시되지 않도록하려면 어떻게해야합니까? 감사!



답변

은폐를 위해 두 가지 방법을 구현해야합니다. display: noneFF에서는 작동하지만 Chrome 또는 IE에서는 작동하지 않습니다. 따라서 두 번째 방법은 배치되는 <option>A의을 <span>display: none. FF는이를 수행하지 않지만 (사양에 따라 기술적으로 잘못된 HTML) Chrome과 IE는 옵션을 숨 깁니다.

편집 : 오 예, 이미 jQuery에서 구현했습니다.

jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        if( jQuery( this ).parent( 'span.toggleOption' ).length == 0 )
            jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

편집 2 :이 기능을 사용하는 방법은 다음과 같습니다.

jQuery(selector).toggleOption(true); // show option
jQuery(selector).toggleOption(false); // hide option

편집 3 : @ user1521986이 제안한 추가 검사 추가


답변

HTML5의 경우 ‘hidden’속성을 사용할 수 있습니다.

<option hidden>Hidden option</option>

그것은되어 있지 IE <(11)에 의해 지원하지만 경우에 당신은 어쩌면 / 추가 요소를 제거하거나 의미 정확한 구조를 안하고 비교하여 더 나은 장애인과 함께 단지 설정 숨김 속성을하는 것, 몇 가지 요소를 숨길하기 만하면됩니다.

<select>
  <option>Option1</option>
  <option>Option2</option>
  <option hidden>Hidden Option</option>
</select>

참조 .


답변

래퍼 를 사용하는 솔루션 은 유효한 HTML이 아니기 때문에 사용 하지 않는 것이 좋습니다 <span>. 선호하는 해결책은 숨기려는 옵션을 실제로 제거하고 필요에 따라 복원하는 것입니다. jQuery를 사용하면 다음 세 가지 기능 만 필요합니다.

첫 번째 기능은 선택 의 원래 내용을 저장합니다 . 안전을 위해 페이지를로드 할 때이 함수를 호출 할 수 있습니다.

function setOriginalSelect ($select) {
    if ($select.data("originalHTML") == undefined) {
        $select.data("originalHTML", $select.html());
    } // If it's already there, don't re-set it
}

이 다음 함수는 위의 함수를 호출하여 원본 콘텐츠가 저장되었는지 확인한 다음 단순히 DOM에서 옵션을 제거합니다.

function removeOptions ($select, $options) {
    setOriginalSelect($select);
    $options.remove();
 }

마지막 기능은 모든 원래 옵션으로 “재설정”할 때마다 사용할 수 있습니다.

function restoreOptions ($select) {
    var ogHTML = $select.data("originalHTML");
    if (ogHTML != undefined) {
        $select.html(ogHTML);
    }
}

이 모든 함수는 jQuery 요소를 전달한다고 예상합니다. 예를 들면 :

// in your search function...
var $s = $('select.someClass');
var $optionsThatDontMatchYourSearch= $s.find('options.someOtherClass');
restoreOptions($s); // Make sure you're working with a full deck
removeOptions($s, $optionsThatDontMatchYourSearch); // remove options not needed

다음은 작동하는 예입니다. http://jsfiddle.net/9CYjy/23/


답변

Ryan P의 대답은 다음과 같이 변경해야합니다.

    jQuery.fn.toggleOption = function (show) {
        $(this).toggle(show);
        if (show) {
            if ($(this).parent('span.toggleOption').length)
                $(this).unwrap();
        } else {
            **if ($(this).parent('span.toggleOption').length==0)**
                $(this).wrap('<span class="toggleOption" style="display: none;" />');
        }
    };

그렇지 않으면 너무 많은 태그로 래핑됩니다.


답변

toggleOption 함수는 완벽하지 않으며 내 응용 프로그램에 불쾌한 버그가 발생했습니다. jQuery는 .val () 및 .arraySerialize ()와 혼동 될 것입니다. 내가 의미하는 바를 확인하려면 옵션 4와 5를 선택하십시오.

<select id="t">
<option value="v1">options 1</option>
<option value="v2">options 2</option>
<option value="v3" id="o3">options 3</option>
<option value="v4">options 4</option>
<option value="v5">options 5</option>
</select>
<script>
jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

$("#o3").toggleOption(false);
$("#t").change(function(e) {
    if($(this).val() != this.value) {
    console.log("Error values not equal", this.value, $(this).val());
    }
});
</script>


답변

선택 입력은 이런 방식으로 까다 롭습니다. 대신 비활성화하면 크로스 브라우저에서 작동합니다.

$('select').children(':nth-child(even)').prop('disabled', true);

이렇게하면 다른 모든 <option>요소 가 비활성화 되지만 원하는 요소를 선택할 수 있습니다.

다음은 데모입니다. http://jsfiddle.net/jYWrH/

참고 : 요소의 비활성화 된 속성을 제거하려면을 사용할 수 있습니다 .removeProp('disabled').

최신 정보

<option>숨길 요소를 숨겨진 선택 요소에 저장할 수 있습니다.

$('#visible').on('change', function () {
    $(this).children().eq(this.selectedIndex).appendTo('#hidden');
});

그런 다음 <option>원래 선택 요소에 요소를 다시 추가 할 수 있습니다 .

$('#hidden').children().appendTo('#visible');

이 두 예제에서 보이는 선택 요소의 ID는 visible이고 숨겨진 선택 요소의 ID는 hidden입니다.

다음은 데모입니다. http://jsfiddle.net/jYWrH/1/

참고 .on()jQuery를 1.7과이 답변에 대한 사용의 새로운 같이 동일 .bind(): http://api.jquery.com/on


답변

간단한 대답 : 할 수 없습니다. 양식 요소에는 매우 제한된 스타일 지정 기능이 있습니다.

가장 좋은 대안은 disabled=true옵션 을 설정 하는 것입니다 (그리고 IE 만 자동으로 수행하므로 회색 색상 일 수도 있음). 그러면 옵션을 클릭 할 수 없게됩니다.

또는 가능하면 option요소를 완전히 제거하십시오 .