стиль.display= 'none' не работает с тегами опций в chrome, но работает в firefox

ОК, Вот пример кода, который демонстрирует проблему. если я нажму кнопку в firefox, первый вариант исчезнет. если я нажму кнопку в chrome, ничего не произойдет, или, скорее, если я проверю первый вариант, у него есть атрибут "style=" display:none", но сама опция на html-странице не скрыта.

<form>
<select>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<input type="button" onclick="document.getElementsByTagName('option')[0].style.display='none'" value="hide option 1">
</form>

почему это не работает в Chrome?

8 ответов


обходным путем является удаление option элементы в ответ на ваше событие и добавить их обратно, если и когда они необходимы. IIRC, IE не позволит вам установить display to none on option элементы. Я бы посоветовал хранить удаленные элементы в массиве, чтобы вы могли легко добавить их обратно.


вы, вероятно, должны удалить <option> вместо того, чтобы укрыть его. Если это не решение для вас, попробуйте его отключить.

document.getElementsByTagName('option')[0].disabled='disabled'

PS: возможно, вы захотите пересмотреть использование getElementsByTagName('option'), может стать грязным, если у вас есть больше <select> элементы.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script>
removeIt = function()
{
    var theSelect = document.getElementById("theSelect");
    var theOption = document.getElementById("theOption");
    theSelect.removeChild(theOption);
};
</script>
</head>
<body>
<select id="theSelect">
<option>1</option>
<option id="theOption">2</option>
<option>3</option>
</select>
<input type="button" onclick="removeIt()" value="remove it!"/>
</body>
</html>

я быстро заставил его работать, просто удалив его из родительского кода... очевидно, это будет взлом.
Я постараюсь найти лучшее решение для вас =)

кстати, добро пожаловать в Stack Overflow


вопрос скорее в том, почему это работает в любом браузере вообще?

параметры не используются в качестве элементов на странице, они содержат информацию для отображения в элементе select. Некоторые браузеры позволяют применять некоторые стили к параметрам, но обычно вы не можете ожидать поддержки кросс-браузеров для любых стилей.

Если вы хотите, чтобы опция не отображалась, вам просто нужно удалить ее из select.


Как мое решение (asp.net) .Я стараюсь поступать таким образом. 1.Создать dropdowlist будут все ListItems 2.Использование javscript для добавления или удаления ListItems (Примечание: добавить параметр нужно то же значение и текст в asp:dropdowlist элементов)

function removeOptionSelected()
{
  var ddl = document.getElementById('ddl_DropList');
  var i;
  for (i = ddl.length - 1; i>=0; i--) {

      ddl.remove(i);
  }
}
function addOptions3()
{
     removeOptionSelected();
     var ddl = document.getElementById('ddl_DropList');
    var elOptNew = document.createElement('option');

    elOptNew.text = 'Monthly Top Producer(Project)';
    elOptNew.value = 'GCE';
    try {
        ddl.add(elOptNew, null); // standards compliant; doesn't work in IE
      }
      catch(ex) {
        ddl.add(elOptNew); // IE only
      }
    elOptNew = document.createElement('option');
    elOptNew.text = 'Monthly Top Leaders - DD';
    elOptNew.value = 'DRE';
    try {
        ddl.add(elOptNew, null); // standards compliant; doesn't work in IE
      }
      catch(ex) {
        ddl.add(elOptNew); // IE only
      }
    elOptNew = document.createElement('option');
    elOptNew.text = 'Monthly Top Leaders - SDD';
    elOptNew.value = 'DRESDD';
    try {
        ddl.add(elOptNew, null); // standards compliant; doesn't work in IE
      }
      catch(ex) {
        ddl.add(elOptNew); // IE only
      }
    elOptNew = document.createElement('option');
    elOptNew.text = 'Monthly Top Leaders - GD';
    elOptNew.value = 'GRE';
    try {
        ddl.add(elOptNew, null); // standards compliant; doesn't work in IE
      }
      catch(ex) {
        ddl.add(elOptNew); // IE only
      }

для удаления одной опции из выбранной формы может использоваться jQuery $().эквивалент.)(удалить или.)($ снимать.)(

подобным было мое удаление одной строки таблицы из таблицы:

$('form table tr').eq(1).remove();

где:

$('form table tr')

скажем, что удаленным элементом будет строка таблицы (tr) из таблицы, заключенной в форму (form table).

eq(1)

говорят, что удален будет второй элемент (элемент с индексом 1)

remove()

говорят, что элемент будет удаленный.

но когда это должно использоваться на опции, то все необходимое будет (например):

$('select option[value="1"]').remove();

потому что проще найти опцию по значению, чем по номеру индекса (если у вас не будет больше ioption с тем же значением - но это ерунда, иметь такие опции). Использование индексного номера хорошо, если у вас нет других, которые вы можете использовать для поиска удаленного элемента.

также вы можете, конечно, добавить имя формы или имя формы и выбрать имя (или id, или class) в идентификацию элемента

$('form[name="date"] selection[name="day"] option[value="1"]').remove();
$('form#date selection#day option[value="1"]').remove();

но первый вариант лучше-и логичнее, благодаря серверным процессам, где нужно использовать атрибут имя вместо id или класс.


Я знаю, что теперь это старый, но вы могли бы - особенно если вы используете jQuery change parent.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Demo Page</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
        <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
        <script>

            function sourceListChange() {
                var oVisible = $('#destList');
                var newCategory = $( "#sourceList" ).val()||'';
                var oToShow = $();

                oHiddenDestList.append(oVisible.find('option'));

                if (newCategory) {
                    oToShow = oHiddenDestList.find('.'+newCategory);
                }           

                if (oToShow.length==0) {
                    oVisible.append (oHiddenDestList.find('.NA'));
                } else if (oToShow.length!=1) {
                    oVisible.append (oHiddenDestList.find('.SELECT'));
                }
                oVisible.prop('selectedIndex', 0);

                oVisible.append (oToShow);
            }

            $(document).ready(function() {
                sourceListChange();
            });

            var oHiddenDestList = $(document.createElement('select'));

        </script>
        <style>

        </style>
    </head>

    <body>

        Select a parent group:
        <select id="sourceList" onchange="sourceListChange()">
            <option class="SELECT" value="" selected disabled>Please Select</option>
            <option value="veg">Vegetables</option>
            <option value="fruit">Fruit</option>
        </select>

        <select id="destList">
            <option class="SELECT" value="*" selected disabled>Please Select</option>
            <option class="NA" value="" selected disabled>Not Applicable</option>
            <option class="fruit">Apple</option>
            <option class="fruit">Bannana</option>
            <option class="veg">Carrot</option>
            <option class="veg">Pea</option>
        </select>       
    </body>
</html>

устранение:

var ua = navigator.userAgent.toLowerCase();

var check = function(r) { return r.test(ua);};

var isChrome = check(/chrome/);
`
var f=document.getElementById('select_tag_id');

f.options[i].style.display='none';

if (isChrome) f.size=2;

поле выбора изменилось на 2 размера (например, несколько), но работает. Этот трюк не работает в safari : (