Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.07.2018, 12:39
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

tabindex native javascript
Ребята, подскажите, пожалуйста, как мне решить следующую задачу:

У меня есть некий список элементов:
ul.nav__list
  li.nav__item
    a.nav__item-link
      span Players
  li.nav__item
    a.nav__item-link
      span Coaches
  li.nav__item
    a.nav__item-link
      span Refereed

div.navigation
  a(href="#") Navigation

Мне необходимо реализовать следующий функционал.
После загрузки документа, при нажатии на клавишу Tab, ссылки поочередно получают focus. Мне необходимо, чтобы порядок был слудующий. После фокуса на первой ссылке:
a.nav__item-link

при следующем нажатии на кноку Tab, у меня фокус перешел на:
a(href="#") Navigation

Затем на вторую ссылку:
a.nav__item-link

А после этого сноав на:
a(href="#") Navigation

Далее на третью ссылку
a.nav__item-link

И при следующем нажатии на Tab снова на:
a(href="#") Navigation

И так далее.

И наиболее важный вопрос: как мне в момент фокуса ссылки, вызывать какой либо обработчик.
Пример логики, которую я хочу реализовать есть на следующем сайте:
http://www.kentfa.com/
Ответить с цитированием
  #2 (permalink)  
Старый 18.07.2018, 14:15
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

<style>
ul li { display:inline; 
    border: 1px solid gray; 
}
div a{ border: 1px solid gray; }

</style>
<ul class='nav__list'>
  <li class = 'nav__item'>
    <a href="#" class='nav__item-link'>
      <span> Players </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link'>
      <span> Coaches </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link'>
      <span> Referees </span>
    </a>
  </li>

<div class='navigation'>
  <a  href="#"><span> Navigation</span> </a>
</div>
<script>
    var flag = true, idx = 0;
    var list = document.querySelectorAll('li a');
    var nav = document.querySelector('div a');
    nav.focus();
    document.onkeydown = function(e) {
        if(e.keyCode == 9) {
           e.preventDefault();
           if(flag) { 
              list[idx].focus(); 
              // здесь можно вызвать обработчик
              idx = (idx < list.length - 1)? idx + 1: 0;
           }
           else { nav.focus(); }
           flag = !flag;
        }
    }
    document.onkeyup = function(e) { if(e.keyCode == 9) e.preventDefault(); }
</script>

Последний раз редактировалось Dilettante_Pro, 19.07.2018 в 09:53.
Ответить с цитированием
  #3 (permalink)  
Старый 19.07.2018, 09:47
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Спасибо. Но в данном случае мне не надо делать e.preventDefault();
А без этого функция работает не корректно.
Ответить с цитированием
  #4 (permalink)  
Старый 19.07.2018, 09:54
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

s24344,
Делайте e.preventDefault(); только для e.keyCode == 9

Внес изменения в пример пост 2

И обработчики можно вешать не на document.onkeydown, а на нужный вам блок, в котором лежат эти элементы - если надо, чтобы в других частях страницы TAB работал по-другому

Последний раз редактировалось Dilettante_Pro, 19.07.2018 в 09:57.
Ответить с цитированием
  #5 (permalink)  
Старый 19.07.2018, 17:52
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2018, 07:46
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Вы могли бы подсказать ответ ещё на один вопрос. А если использовать событие focus, а не привязываться к onkeydown. Каким образом мне сделать такую же очередность? Например с помощью атрибута tabindex.

Последний раз редактировалось s24344, 20.07.2018 в 07:52.
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2018, 10:11
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Сообщение от s24344
с помощью атрибута tabindex.
Атрибут tabindex задает для каждого элемента только одно значение в последовательности переходов по нажатию клавиши TAB. Поэтому не получатся прыжки через раз на элемент Navigation.


Сообщение от s24344
А если использовать событие focus
Как вы себе это представляете? Что нужно делать при наступлении на элементе события focus?
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2018, 10:26
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Я уже реализовал задачу с помощью вашего решения, и всё работало отлично. Но teamlead сказал, что это не вариант и надо сделать с помощью tabindex. Сейчас это реализовываю, onFocusPrimaryLink(event) { console.log(event.target); } при событии focus и динамически меняю tabindex.
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2018, 13:25
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

По фокусу c tabindex.
<style>
ul li { display:inline; 
    border: 1px solid gray; 
}
div a{ border: 1px solid gray; }
:focus { background-color:lightgreen;}
</style>
<ul class='nav__list'>
  <li class = 'nav__item'>
    <a href="#" class='nav__item-link' tabindex="2">
      <span> Players </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link' tabindex="4">
      <span> Coaches </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link' tabindex="6">
      <span> Referees </span>
    </a>
  </li>
</ul>
<div class='navigation'>
  <a  href="#" tabindex="1"><span> Navigation</span> </a>
</div>
<script>
    var refs = document.querySelectorAll('a');
    var list = document.querySelectorAll('li a');
    var nav = document.querySelector('div a');
    nav.focus();
    [].forEach.call(refs, function(it) {
        it.addEventListener('focus',  function() {
           var ti = +this.getAttribute('tabindex');
           if(this == nav && (ti - 1)%list.length == 0) {
                [].forEach.call(list, function(el) {
                    el.setAttribute('tabindex',(+el.getAttribute('tabindex') + list.length * 2).toString() );
                });
           }
           ti = (ti + 1).toString();
           if(this != nav) nav.setAttribute('tabindex',ti );
       });
    });
</script>

Последний раз редактировалось Dilettante_Pro, 20.07.2018 в 15:23.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2018, 13:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

tab and focus
Сообщение от s24344
надо сделать с помощью tabindex.
хотел бы я видеть, как это возможно.
ниже иная вариация того, что предложил Dilettante_Pro,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  </head>

<body>
<style>
ul li { display:inline;
    border: 1px solid gray;
}
div a{ border: 1px solid gray; }
:focus {
    background-color: #228B22;
}

</style>
<ul class='nav__list'>
  <li class = 'nav__item'>
    <a href="#" class='nav__item-link'>
      <span> Players </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link'>
      <span> Coaches </span>
    </a>
  </li>
  <li class = 'nav__item'>
    <a  href="#" class='nav__item-link'>
      <span> Referees </span>
    </a>
  </li>
</ul>
<div class='navigation' >
  <a  href="#"><span> Navigation</span> </a>
</div>
<script src="https://cdn.polyfill.io/v1/polyfill.js?Element.prototype.closest"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
    var tabindex = document.querySelectorAll("[tabindex]");
    var li = document.querySelectorAll(".nav__item");
    var nav = document.querySelector(".navigation");
    var idx = 0;
    var ln = li.length;
    [].forEach.call(tabindex, function(elem) {
        elem.removeAttribute("tabindex")
    });
    [].forEach.call(li, function(elem, i) {
        elem.setAttribute("tabindex", i);
        elem.addEventListener("click", function() {
            idx = i
        })
    });
    li[0].focus();
    nav.setAttribute("tabindex", ln);
    document.addEventListener("keydown",
        function(event) {
            if (event.keyCode == 9 && event.target.closest(".nav__item")) {
                event.preventDefault();
                nav.focus()
            } else if (event.keyCode == 9 && event.target.closest(".navigation")) {
                event.preventDefault();
                idx = ++idx % ln;
                li[idx].focus()
            }
        }, true)
});
</script>

</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Native javascript css properties s24344 Элементы интерфейса 4 18.07.2018 11:04
Фильтрация коллекции (native javascript) s24344 Элементы интерфейса 2 13.07.2018 11:48
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34