2010-11-08 5 views
2

Я добавляю под-окно под JavaScript на сайт. В основном часть пользовательского интерфейса располагается слева от экрана, пока пользователь не активирует ссылку; то он перемещается в видимую позицию. У меня есть серия из пяти test cases, но у меня нет точек репутации, чтобы связать их по-отдельности.preventDefault(), прокрутка и доступность

В целях доступности, я хочу использовать ссылку, содержащую фрагмент документа, таким образом:

<a href="#quicklinks" id="quicklinks-trigger">Quick Links</a> 

с соответствующими JavaScript (с помощью JQuery):

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
}); 

The #quicklinks HREF перенаправляет внутренний курсор (ака-карет) экранных считывателей к началу недавно обнаруженного пользовательского интерфейса. В вспомогательном окне Quick Links есть соответствующая ссылка, которая перенаправляет курсор обратно в основную часть документа (<a href="#main" id="close-quicklinks"></a>). Вы можете увидеть это в действии с тестовым примером 1. Если вы слушаете его с помощью программы чтения с экрана (я тестирую NVDA), программа чтения с экрана с радостью переходит к быстрым ссылкам при активации ссылки и обратно к основному документу когда активируется ссылка закрытия ссылок.

Он также прокручивает страницу вверх и вниз в ответ на фрагменты документа, что является уродливым и раздражающим. Это может быть подавлено с помощью window.preventDefault() - см Test Case 2, который работает очень плавно и не прокручивается вокруг документа, таким образом:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 

e.preventDefault(); });

К сожалению, вызов функции preventDefault() также не позволяет браузеру перемещать курсор в нужное место. Слепой пользователь может вызвать ссылку там, а затем программа чтения с экрана перейдет к следующему элементу в порядке исходного кода, а не к пользовательскому интерфейсу Quick Links. Самый простой способ исправить это означает, чтобы HTML определял под-окно Quick Links сразу после триггерной ссылки; но я не могу этого сделать, потому что CMS, для которого это предназначено, не играет хорошо с большими блоками HTML, вставленными в меню.

Я пробовал некоторые другие подходы к устранению прокрутки. Контрольный пример 3 прокручивает окно обратно вручную:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
window.setTimeout(function(){ scrollTo(0,0); }, 1); 
}); 

... который работает, но имеет явно прерывистый эффект, потому что она прокручивается вниз, а затем обратно вверх, так что не лучше, чем тест 1.

В Контрольный пример 4, я попытался с помощью preventDefault() в сочетании с акцентом() в надежде перемещения внутреннего курсора вручную:

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
$("#quicklinks").focus(); 
e.preventDefault(); 
}); 

Но это не сработало, потому что #quicklinks является DIV, не фокусируемым элемент. Я полагаю, что я мог бы добавить скрытый элемент в HTML Quick Links, но это было бы kludgy.

В тестовом примере 5, я попытался удалить атрибут ID из целевого элемента, перезапись идентификатора фрагмента с событием onhashchange, а затем восстановлением ID:

function cfl_hash(fragment){ 
// Get the section the fragment refers to. 
var target = $(fragment); 

// Save its current ID. 
var id = target.attr("id"); 

// Remove the ID so the browser won't scroll. 
target.attr("id",""); 

// Rewrite the hash to the desired fragment, only if onhashchange event supported. 
if("onhashchange" in window){ location.hash = fragment; } 

// Put the ID back in place. 
target.attr("id", id); 
} 

$("#quicklinks-trigger").click(function(e){ 
$("#shadow").removeClass("default"); 
$("#shadow").addClass("active"); 
cfl_hash("#quicklinks"); 
}); 

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

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

До сих пор я тестировал только Firefox и NVDA. Я понятия не имею, как это будет играть в других комбинациях браузера и устройства чтения с экрана.

Предложения?

ответ

1

Я придумал обход, который позволяет использовать ссылки на фрагменты документа, позволяет переадресовывать каретку для чтения с экрана и не прокручивает область просмотра. Метод

  1. Место скрытый элемент в верхней части элемента, который вы ссылаетесь
  2. Ссылка на скрытый элемент вместо содержимого, следующего за ним
  3. Использование фиксированного позиционирования для перемещения скрытого элемента заподлицо с верхней частью окна просмотра

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

Есть несколько причуд. В Opera, Safari и Chrome, щелкнув ссылку, расположенную таким образом, вы вызовете прокрутку, но ТОЛЬКО, если пользователь уже прокрутил вниз. Я не уверен, почему это так; возможно, они не обновляют позиции элементов фиксированной позиции, которые находятся слева от экрана? В любом случае этот вопрос затрагивает только весьма специфический набор обстоятельств, которых можно избежать в основном благодаря разумной компоновке страницы. Поэтому я считаю, что преимущества (доступный, сравнительно простой код) перевешивают недостатки (незначительная визуальная причуда в некоторых браузерах и обстоятельствах).

Для более полного обсуждения этого метода см:

http://www.accessifyforum.com/viewtopic.php?p=77132

Надеется, что это помогает кто-то другое.

Смежные вопросы