2015-11-11 5 views
6

У меня есть сайт, который построен как одностраничный, и все запросы сделаны с помощью AJAX. Страницы похожи на site.com/#Page или site.com/#Page/Other.Пропустить навигацию для сайта с одной страницей

Теперь мне нужно реализовать ссылку Skip Navigation на сайте, но поскольку URL-адреса начинаются с #, я не могу использовать простой привязку. Есть ли способ сделать это без изменения всех URL-адресов? Благодарю.

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

+0

Вы используете систему SPA? Было бы полезно узнать подробности о том, как вы обрабатываете маршрутизацию. Например, есть некоторые [возможные решения для угловых] (http://stackoverflow.com/questions/14712223/how-to-handle-anchor-hash-linking-in-angularjs) пользователей. – Jasen

+0

@ Ясен Нет, я не.Я использую простую библиотеку JS для обработки истории браузера, но все. В примере, который вы видите, я вижу, что он только прокручивается, но не работает с клавиатурной навигацией или экранными программами. –

ответ

2

У вас есть две вещей, чтобы сделать:

  • имеет фокусируемый элемент (использование TabIndex = "- 1 "для элементов, которые не являются фокусируемыми по умолчанию, как h1)

  • фокуса его с помощью JavaScript/JQuery focus() метода

Пример:

document.getElementById("myEle").focus(); 

или

jQuery("#myEle").focus(); 
0

Чтобы достичь того, чего вы хотите, вы можете посмотреть на scrollTop() в JQuery: https://api.jquery.com/scrollTop/

+0

'scrollTop' только прокручивает окно, это не делает другие вещи, о которых я упомянул в _Note: _. Основная проблема заключается в том, что он не фокусируется на элементе, поэтому считыватели экрана не начинают читать оттуда. –

0

я наконец понял это. Я в основном пришлось

  1. Отключение рамки/скрипт, используемый для обработки хэш изменения
  2. Измените URL, чтобы указать на основное содержание
  3. Восстановить исходный URL и повторно включить то, что я отключил в # 1 ,

К примеру, у меня был случай, как это:

var onPageChange = function (newLocation, historyData) { 
    // load page 
}; 

Первый, я изменил его:

var pageChangeEnabled = true; 
var onPageChange = function (newLocation, historyData) { 
    if (pageChangeEnabled) { 
     // load page 
    } 
}; 

А потом, ссылка Skip Navigation выглядит следующим образом:

<a href="javascript:pageChangeEnabled=false;var oh=location.hash;location.hash='#content';location.hash=oh;pageChangeEnabled=true;void(0);" id='skipNav'>Skip Navigation</a> 

Для облегчения понимания, это код в href:

// disable navigation 
pageChangeEnabled=false; 

// save current hash 
var oldHash=location.hash; 

// update the hash/anchor, make everything work 
location.hash = '#content'; 

// restore the old hash, as there are no elements that have the same 
// name of the URL, it works 
location.hash = oldHash; 

// re-enable page navigation 
pageChangeEnabled=true; 

// void(0); is just to avoid the navigation of the link 
void(0); 

UPDATE: Как пояснил Адам, это не в полной мере работать как навигация с помощью клавиатуры не меняется. Я закончил делать: $('#content').attr('tabindex', '-1').focus();

+0

это не даст фокусу клавиатуры элементу. (нажатие на вкладку приведет вас к самой первой ссылке на странице) – Adam

+0

@Adam, вы правы. Я, хотя я пробовал свой ответ и не работал. Я попробовал (опять?) Сейчас, и он отлично работает на Chrome с NVDA :) Спасибо. –

+0

Если вы поместите это в функцию и прикрепите ее к ссылке с помощью 'link_elem.onclick = scroll_top_function', она станет более читаемой и поддерживаемой –