Есть ли способ показать/скрыть элементы без CSS?

Я делаю один веб-интерфейс совместимым с 508, и в одном требовании говорится: «Работа с веб-интерфейсом, когда CSS отключен». У нас есть несколько мест, где мы показываем/скрываем элементы, используя style=display:inline и style=display:none, и соответственно вызываем их с помощью вызовов функций JS. Когда я отключаю CSS (используя WAT2.0), также отображаются скрытые элементы, что не делает пользовательский интерфейс хорошим. У нас есть такие вещи в нескольких местах, такие как свернутые/развернутые описания, всплывающие окна при перемещении мыши и т. д.,

Есть ли другой способ показать/скрыть элементы, кроме использования тегов стиля? Пожалуйста посоветуй!


person vpram86    schedule 12.01.2010    source источник


Ответы (10)


Это звучит громоздко, но вы можете создать простую библиотеку, которая на самом деле удаляет узлы из DOM и вставляет их обратно, когда они нужны. У вас все еще может быть объект, который сохраняет все удаленные узлы как переменные, чтобы вам не приходилось создавать их заново при вставке.

Однако я должен сказать, что когда в требованиях указано, что сайт должен работать с отключенным CSS, это редко означает, что он должен функционировать точно так же во всех отношениях с отключенным CSS. Например, если у вас есть раскрывающийся/сворачиваемый список, я бы предположил, что приемлемым компромиссом для тех, у кого отключен CSS, будет всегда показывать содержимое всех элементов в списке.

person David Hedlund    schedule 12.01.2010
comment
Спасибо, Дэвид. В моем случае, помимо развернуть/свернуть, есть много мест, где эта штуковина используется. Например, при наведении курсора мыши на определенную область мы открываем таблицу. Так что по умолчанию он скрыт. В случае отключения CSS эти таблицы отображаются, что на самом деле не имеет смысла для пользователя. - person vpram86; 12.01.2010

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

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

person kennebec    schedule 12.01.2010
comment
со стилем или script - это рабочая формулировка, я бы сказал, что вся остальная часть вопроса недействительна. - person David Hedlund; 12.01.2010

В этом случае сделайте это с помощью javascript. Просто удалите элемент из тега body и поместите его обратно, когда это необходимо.

window.holder = [];
function switchNodes(source, target){
    var parentNode = source.parentNode;
    if(parentNode && !target.parentNode){
        parentNode.insertBefore(target,source);
        parentNode.removeChild(source);
        return true;
    }

    return false;
}

function show(node){
    for(var i=0,item;item = holder[i];i++){
        if(item.node == node){
            var span = item.span;
            switchNodes(span, node); 
            holder.splice(i,1);
            return true;
        }
    }

    return false;
}

function hide(node){
    var span = document.createElement("span");
    if(switchNodes(node,span)){
        holder.push({node: node, span : span});
        return true;
    }
    return false;
}
person nemisj    schedule 12.01.2010

Вы также можете показать/скрыть элементы на стороне сервера. Вместо использования Javascript просто отправьте форму на сервер и используйте возможности taglib и EL в JSP.

E.g.

<c:if test="${someCondition}">
    <p>This is displayed if ${someCondition} evaluates to true.</p>
</c:if>

Дополнительным преимуществом является то, что это также сделает ваш Javascript ненавязчивым, что, безусловно, высоко ценится, когда речь идет о доступности.

person BalusC    schedule 12.01.2010

Я не совсем уверен, что это возможно. Похоже, дизайн страницы действительно должен соответствовать этому требованию.

Я думаю, вы должны подходить к этому так, как если бы у вас тоже не было JavaScript. Тогда вам придется полагаться на обновления страницы, чтобы показать/скрыть элементы. т.е. когда вы нажимаете, чтобы показать/скрыть что-то, обновите страницу, и тогда ваш код на стороне сервера будет выполнять логику того, было ли поле включено на страницу.

Если это поле ввода, я полагаю, его все равно можно включить как скрытое поле?

Это может показаться немного неуклюжим, но на самом деле это неплохо, поскольку вы движетесь по пути к ненавязчивому JavaScript.

person James Wiseman    schedule 12.01.2010
comment
Спасибо, Джеймс. Я оставлю это решение в крайнем случае, если мне больше нечего делать. Как и сейчас, это требует большого трафика туда и обратно и может снизить удобство использования самого пользовательского интерфейса. :( - person vpram86; 12.01.2010

Вы можете удалить элементы из DOM вместо того, чтобы скрывать их, но я не думаю, что для этого есть веская причина. Насколько я знаю, скринридеры будут уважать display: none, и я не могу придумать никакой другой причины, по которой клиент должен поддерживать скрипты, но не CSS...

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

person Christoph    schedule 12.01.2010

Раздел 508, похоже, является своего рода нормативным актом США о доступности веб-сайтов.

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

Я бы предложил разработать ваши страницы с использованием чистого семантического HTML, который хорошо выглядит с отключенным CSS, а затем использовать CSS и JavaScript, чтобы сделать страницу более привлекательной или мощной там, где она поддерживается. Также попробуйте предварительно просмотреть свой сайт в Ссылках во время разработки.

person Tobias Cohen    schedule 12.01.2010
comment
Программы чтения с экрана текущего поколения, которые я тестировал, либо сидят поверх существующего браузера, либо встраивают браузер для отображения страниц, поэтому они достаточно хорошо справляются с динамическими сайтами. - person Colonel Sponsz; 12.01.2010

## Я обычно использую так: ##

  if (this.RadioButtonList1.SelectedValue == "Date") { this.divByDate.Attributes.Add("style", "display:block"); }
    else { divByDate.Attributes.Add("style", "display:none"); }
person civanm    schedule 12.01.2010

Я думаю о сети как о непрерывной строке символов, поэтому с моей методологией вы можете получить innerHTML элемента и изменить его, чтобы динамически манипулировать исходным кодом страницы. Есть несколько способов сделать это.

  1. Просто удалите содержимое родительского элемента, задав для его innerHTML пустую строку.

    document.getElementById('myElement').innerHTML = '';
    
  2. Еще один дешевый трюк, который я использовал, — это добавление HTML-комментариев в мой исходный код, чтобы я мог добавлять своего рода «теги» и захватывать текст между ними с помощью регулярного выражения.

    <body>
      <!--Start-->
        <div>Hello World.</div>
      <!--End-->
      <div>Au revoir.</div>
    </body>
    

    Затем вы можете сделать регулярное выражение JavaScript, чтобы заменить все между вашими тегами.

    document.body.innerHTML = document.body.innerHTML.replace(/\<!--Start--\>[\s\S]*\<!--End--\>/i, '');
    

    Регулярное выражение находит тег, а затем ноль или более пробельных или непробельных символов, за которыми следует мой тег, и заменяет его пустой строкой, оставляя вам следующее.

    <body>
      <div>Au revoir.</div>
    </body>
    
  3. И, конечно же, вы всегда можете использовать библиотеку JavaScript (jQuery, Mootools, Prototype и т. д.), чтобы помочь вам в этом. В этих библиотеках есть методы для удаления объектов DOM.

Если вы хотите иметь возможность записать содержимое обратно, просто сохраните его в переменной и вставьте в него HTML-комментарий с идентификатором. Замените еще одно регулярное выражение, и оно вернется.

person Brandon McKinney    schedule 12.01.2010

Да, с помощью элемента <details> вы можете создавать совместный контент:

<details>
    <summary>Details</summary>
    Something small enough to escape casual notice.
</details>

Элемент сворачиваемых сведений

Подробную информацию об этом теге HTML можно найти в веб-документах MDN.

person cseelus    schedule 12.01.2021