JQuery Mobile заставляет VoiceOver сосредоточиться на заголовке после GotoPage

При активных JQuery mobile и VoiceOver после смены страницы с помощью

$.mobile.changePage("page1.html");

VoiceOver не зацикливайтесь на названии. Я хочу заставить фокус VoiceOver прочитать заголовок новой страницы

НЕ рабочие тесты:

$(".ui-page-active .ui-title").click().focus().tap();
$(".ui-page-active .ui-title").trigger("create");
$(".ui-page-active .ui-title").attr("role","alert");
$(".ui-page-active .ui-title").attr("role","dialog");

тестовая страница, не всегда работает https://jsfiddle.net/218xLbwd/14/

РЕШЕНИЕ: используйте событие beforeshow, чтобы сосредоточиться на заголовке. также благодарим Эрика Д. Джонсона за его усилия.

  //for Jquery till  1.4.0
  $(document).on('pagebeforeshow', function() {
    $(".ui-page-active > .ui-header h1").attr('tabindex', "-1");
    $(".ui-page-active > .ui-header h1").focus();
  });
  //for Jquery 1.6.0+
  $(document).on('pagecontainerbeforeshow', function() {
    $(".ui-page-active > .ui-header h1").attr('tabindex', "-1");
    $(".ui-page-active > .ui-header h1").focus();
  });

person Sano    schedule 12.04.2016    source источник


Ответы (1)


ОБНОВЛЕНИЕ: использование jQuery Mobile

Фрагмент Stackoverflow не запускается, см. https://jsfiddle.net/EricOP/wo40z1m9/3/

HTML

  <div data-role="header">
    <h1>Foo</h1>
  </div>

  <div data-role="content">
    <p>I'm first in the source order so I'm shown as the first page.</p>
    <p>View internal page called <a id="barclick" href="#bar">bar</a></p>
  </div>

  <div data-role="footer">
    <h4>Page Footer</h4>
  </div>

</div>

<!-- Start of second page -->
<div data-role="page" id="bar">

  <div data-role="header">
    <h1>Bar</h1>
  </div>

  <div data-role="content">
    <p>I'm the second in the source order so I'm hidden when the page loads. I'm just shown if a link that references my id is beeing clicked.</p>
    <p><a href="#foo">Back to foo</a></p>
  </div>

  <div data-role="footer">
    <h4>Page Footer</h4>
  </div>

</div>

CSS

/* CSS to prevent weird blue border in Chrome after setting focus */ 
h2:focus { outline: 0; }

JS

(function() {
  // For changing to a specific page. 
  // Also see https://api.jquerymobile.com/pagecontainer/#event-beforeshow which was helpful for Sano.
  $("#bar").on('pageshow', function(barPage) {
    console.warn('Pageshow on bar, Sano.', barPage);
    $("h1:visible").attr('tabindex', "-1");
    $("h1:visible").css('background-color', '#aaa');
    $("h1:visible").focus();
  });

  // For changing between all jQuery Mobile pages. https://api.jquerymobile.com/pagecontainer/#event-change
  $(document).on('pagecontainerchange', function() {
    console.warn('New cool event, that always triggers, Pagecontainerchange on document, Sano.');
    $("h1:visible").attr('tabindex', "-1");
    $("h1:visible").css('color', '#dd4814');
    $("h1:visible").focus();
  });

})();

Запуск по событию (https://api.jquerymobile.com/pagecontainer/#event-change ), обещание или обратный вызов лучше, чем использование ожидания по времени, чтобы избежать необходимости угадывать, сколько времени займет рендеринг ваших изменений отображения.

Сано особо отметил, что https://api.jquerymobile.com/pagecontainer/#event-beforeshow был полезен.

  //for jQuery until  1.4.0
  $(document).on('pagebeforeshow', function() {
    $(".ui-page-active > .ui-header h1").attr('tabindex', "-1");
    $(".ui-page-active > .ui-header h1").focus();
  });
  //for jQuery 1.6.0+ (Also works for 1.4)
  $(document).on('pagecontainerbeforeshow', function() {
    $(".ui-page-active > .ui-header h1").attr('tabindex', "-1");
    $(".ui-page-active > .ui-header h1").focus();
  });
person Eric D. Johnson    schedule 26.04.2016
comment
как упоминалось в моем коде .focus() .click() и т. д. и т. д. не работает - person Sano; 26.04.2016
comment
также в вашем коде есть ошибка, которая должна быть $(.ui-page-active .ui-title).focus(), потому что h1:visible выберет все элементы h1 на видимой странице - person Sano; 26.04.2016
comment
Вы не предоставили html, который используете, поэтому вам трудно помочь. Я сказал вам в своем ответе, что я устанавливаю фокус не на элемент навигации, а на h1 (в большинстве случаев вы должны быть только одним h1 на странице за раз) под заголовком , в теле. Я обновлю свой ответ, чтобы сделать это более заметным. - person Eric D. Johnson; 26.04.2016
comment
Кроме того, когда вы говорите, что не работает, вы имеете в виду, что даже выполнение $(".nav-item .page1").click(function() {alert("Hi Sano!");}); не работает? - person Eric D. Johnson; 26.04.2016
comment
@Sano добавил рабочий пример в мой ответ. Надеюсь, это поможет. - person Eric D. Johnson; 26.04.2016
comment
Эрик, прежде всего, когда я говорю, что не работает, я имею в виду, что VoiceOver после $.mobile.changePage(page1.html); не зацикливайтесь на названии. Ваш код работает с обычными браузерами, а не с озвучкой. По моему мнению, ваш код не связан с проблемой, которую я пытаюсь решить, возможно, мой первый пост не ясен. - person Sano; 27.04.2016
comment
Эрик, ты тестировал свой код с включенной озвучкой? - person Sano; 27.04.2016
comment
@Sano, я тестировал его на iPad mini с iOS 9.3.1 и включенным VoiceOver. Это сработало, как и ожидалось: вам нужно выполнить Выполнить фрагмент кода и нажать Вся страница (по какой-то причине VoiceOver ведет себя странно со встроенными фреймами). Я перечислю шаги, которые я использовал в ответе. - person Eric D. Johnson; 27.04.2016
comment
Эрик, jsfiddle.net/218xLbwd/14 это тестовая страница, если вы попробуете поиграть с ней много раз не всегда фокус работает так, как ожидалось. Поведение VoiceOver на веб-страницах с сафари немного отличается от поведения VoiceOver в MobileWebApp. - person Sano; 28.04.2016
comment
@Sano jsfiddle.net/EricOP/wo40z1m9 — это обновленная версия. В JS, если вы не можете использовать, подождите 1000 мс, пока представление обновится, и надейтесь, что это достаточно долго, как вы хотите. Вместо этого вы хотите инициировать обратный вызов или событие. В моем примере я запускаю событие api.jquerymobile.com/pagechange, например - person Eric D. Johnson; 28.04.2016
comment
Эрик, решение находится в событии beforeshow. Спасибо за ваши советы. Я думаю, хорошо, если вы обновите свое решение с меньшим количеством кода, чтобы сделать его более чистым. - person Sano; 02.05.2016
comment
@Sano хорошая командная работа. Рад, что мы решили это! Попытался сократить мой ответ вдвое и удалить ранние материалы, чтобы вы могли проголосовать и одобрить их с чистой совестью. - person Eric D. Johnson; 02.05.2016