Почему переход к сетке DojoX с помощью табуляции приводит к ошибке JavaScript «Невозможно переместить фокус для управления»?

Проблема
У меня на странице есть несколько компонентов Dojo. Когда пользователь пытается перейти от компонента, подобного входу, к компоненту, подобному сетке, я получаю ошибку JavaScript «Невозможно переместить фокус для управления». База пользователей использует IE6.

Решение
Первый элемент в макете DojoX Grid не может быть скрыт. Если он скрыт, вы получите ошибку JavaScript «Невозможно переместить фокус для управления». Чтобы исправить это, я добавил строку #, которая отображается. См. ниже.

  var gridLayout = [
    new dojox.grid.cells.RowIndex({ name: "row #", 
                                    width: 2, 
                                    styles: "text-align: right;"
                                 }),
    {
      field: "ele_id",
      name: "Element ID",
      styles: "text-align:right;",
      width:5,
      hidden:"true"           
    },
    {
      field: "ele_nm",
      name: "Element Name",
      styles: "text-align:left;",
      width:8          
    }
  ];

Зачем тебе это нужно ??? Если пользователь хочет перейти к какому-либо полю ввода, он должен иметь возможность, не так ли? Вы хотите запретить Любые навигацию в это поле или только на основе табуляции?

Joachim Sauer 26.11.2008 18:59

Z не является полем ввода. У меня на странице есть несколько компонентов Dojo. Когда пользователь пытается перейти от компонента, подобного входу, к компоненту, подобному сетке, я получаю ошибку JavaScript «Невозможно переместить фокус для управления».

user290 26.11.2008 19:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 624
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Вы должны обработать событие нажатия клавиши и прослушать символ 9 (который является символом табуляции). Чтобы сделать событие недействительным, вы просто возвращаете false, когда пользователь нажимает символ 9.

function handleKeyDown(e)

{

var keynum;

var keychar;

var numcheck;

if (window.event) // IE

{

keynum = e.keyCode;

}

else if (e.which) // Netscape/Firefox/Opera

{

keynum = e.which;

}

return keynum != 9; `` }

Вы также должны иметь дело с Shift-Tab, идущим в противоположном направлении.

Bryan Oakley 26.11.2008 20:31
<input name = "z" onfocus = "this.blur()"/>

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

ARemesal 26.11.2008 19:03

Я согласен. Я просто пытаюсь ответить на вопрос.

Diodeus - James MacFarlane 26.11.2008 19:26

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

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

Обновлено: сообщение об ошибке, которое вы опубликовали, имеет некоторые результаты в Google, но похоже, что это может быть любое количество проблем, этот http://www.francoisfaubert.com/2008/03/06/cant-move-focus-to-control/ звучит так, как будто это может быть возможность. Проверьте свой HTML, чтобы увидеть, есть ли на странице другие элементы управления с таким же идентификатором.

прояснил вопрос выше. это для предотвращения перехода от поля ввода к компоненту сетки. какие еще способы вы бы предложили справиться с этим?

user290 26.11.2008 19:21

Что это за «сеточная составляющая»?

Bob 26.11.2008 19:34

Я использую сетку - это компонент DojoX.

user290 26.11.2008 20:41

Не проблема с удостоверением личности. Да, погуглил неэффективно, поэтому я подумал, что попробую здесь.

user290 26.11.2008 20:43

Вы можете установить Input-Z как отключенный элемент управления. Затем, когда пользователь переходит на Input-Y и заполняет его, измените Input-Z на enabled. Как это сделать:

<input id = "Input-x" type = "text" />
<input id = "Input-y" type = "text" onChange = "document.getElementById('Input_Z').removeAttribute('disabled');" />
<input id = "Input-z" type = "text" disabled />

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

я прояснил проблему выше. Спасибо что подметил это. какими еще способами вы могли бы справиться с подобным?

user290 26.11.2008 19:20

Если ввод Y не принимает пользовательский ввод, не делайте его полем ввода!

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

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

Chris 26.11.2008 19:11

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

user290 26.11.2008 19:23

Присвойте элементу компонента атрибут tabindex со значением -1.

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

tabindex = "- 1"

например:

<div id = "mygrid" tabindex = "-1"> <!-- Some stuff here --> </div>

Подробнее об отрицательных индексах табуляции: введение в вай-арию

Редактировать: Подробнее о ARIA: http://www.w3.org/WAI/intro/aria

По поводу сообщения об ошибке: От Танк фейка:

"odds are you have conflicting ids in your document. Also, remember IE 7 and the previous versions are alone to think a name attribute should be treated like an id."

Итак, во-первых, это ошибка IE. Во-вторых, измените свои идентификаторы. Похоже, что это то, что раньше поражало некоторые программы HP на основе HTML, и появилось, когда пользователи обновились с IE6 до IE7.

Что касается вопроса об отключении фокуса - просто скройте любые нежелательные вводы с помощью type = hidden в теге, и они перестанут быть проблемой. Никогда не возитесь с табуляцией людей - это единственное, что улучшило HTML по сравнению с приложениями Windows.

Мораль сказки:

  • Делай это правильно
  • Microsoft - дерьмо в Интернете
  • Не связывайтесь со стандартным поведением графического интерфейса пользователя
Ответ принят как подходящий

Решение
Первый элемент в макете DojoX Grid не может быть скрыт. Если он скрыт, вы получите ошибку JavaScript «Невозможно переместить фокус для управления». Чтобы исправить это, я добавил строку #, которая отображается. См. ниже.

  var gridLayout = [
    new dojox.grid.cells.RowIndex({ name: "row #", 
                                    width: 2, 
                                    styles: "text-align: right;"
                                 }),
    {
      field: "ele_id",
      name: "Element ID",
      styles: "text-align:right;",
      width:5,
      hidden:"true"           
    },
    {
      field: "ele_nm",
      name: "Element Name",
      styles: "text-align:left;",
      width:8          
    }
  ];

Другие вопросы по теме