2

JavaScriptを利用したサブウィンドウをサイトに追加しています。基本的に、UIの一部は、ユーザーがリンクをトリガーするまで画面の左端から離れた位置に配置されます。次に、表示された位置に移動します。私は一連の5つのテストケースを持っていますが、それらを個別にリンクするためのレピュテーションポイントをまだ取得していません。

アクセシビリティの目的で、ドキュメントフラグメントを含むリンクを使用したいので、次のようになります。

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

対応するJavaScriptを使用して(jQueryを使用):

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

#quicklinks HREFは、スクリーンリーダーの内部カーソル(別名カレット)を、新しく表示されたUIの先頭にリダイレクトします。[クイックリンク]サブウィンドウに対応するリンクがあり、カーソルをドキュメントの主要部分にリダイレクトします(<a href="#main" id="close-quicklinks"></a>)。これはテストケース1で実際に動作していることがわかります。スクリーンリーダーで聞くと(私はNVDAでテストしています)、スクリーンリーダーは、リンクがトリガーされたときにクイックリンクにスキップし、メインドキュメントに戻ります。クイックリンクの終了リンクがトリガーされたとき。

また、ドキュメントの断片に応じてページを上下にスクロールしますが、これは醜くて煩わしいものです。これは、次を使用して抑制することができます。window.preventDefault()テストケース2を参照してください。これは非常にスムーズに機能し、ドキュメントをスクロールしません。したがって、次のようになります。

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

e.preventDefault(); });

残念ながら、preventDefault()を呼び出すと、ブラウザがカーソルを正しい場所に移動できなくなります。目の不自由なユーザーはそこでリンクをトリガーできます。その後、スクリーンリーダーは、クイックリンクUIではなく、ソースコード順に次のアイテムに進みます。これを修正する最も簡単な方法は、トリガーリンクの直後にクイックリンクサブウィンドウを定義するHTMLを配置することです。しかし、これが目的のCMSは、メニューに挿入されたHTMLの大きなブロックではうまく機能しないため、それはできません。

スクロールをなくすために、他のいくつかのアプローチを試しました。テストケース3は、ウィンドウを手動でスクロールバックします。

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

...これは機能しますが、下にスクロールしてから上に戻るため、目に見えてぎくしゃくした効果があります。これは、テストケース1よりも優れています。

テストケース4では、内部カーソルを手動で移動することを期待して、preventDefault()をfocus()と組み合わせて使用​​してみました。

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

しかし、#quicklinksはDIVであり、フォーカス可能な要素ではないため、機能しませんでした。クイックリンクHTMLに非表示のフォーカス可能な要素を追加できると思いますが、それは厄介です。

テストケース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");
});

これは、スクロールを許可するがカーソルの移動を妨げるという不幸な効果がありました。IDスワップのイベントのシーケンスが間違っていると思います。これはスクロールを抑制するために機能するはずですが、カーソルが移動できるかどうかは疑わしいです。

スクリーンリーダーユーザーのカーソルリダイレクトもキャンセルせずに、目の見えるユーザーのスクロールをキャンセルできないのは本当に迷惑です。

これまでのところ、FirefoxとNVDAでのみテストしました。ブラウザとスクリーンリーダーの他の組み合わせでこれがどのように機能するかはわかりません。

提案?

4

1 に答える 1

1

ドキュメント フラグメント リンクの使用を許可し、スクリーン リーダーのキャレット リダイレクトを許可し、ビューポートをスクロールしない回避策を考え出しました。その方法は

  1. リンク先の要素の上部に非表示の要素を配置します
  2. 後続のコンテンツではなく、非表示の要素へのリンク
  3. 固定位置を使用して、非表示の要素をビューポートの上部と同じ高さに移動します

このように、隠し要素を対象とするリンクをクリックすると、ブラウザーは画面を所定の位置に「スクロール」しようとしますが、画面は既にビューポートの上部にあるため、実際のスクロールは行われません。キャレット リダイレクトが発生するため、スクリーン リーダーのユーザーはリンクが指していた場所に移動します。

いくつかの癖があります。Opera、Safari、および Chrome では、このように配置されたリンクをクリックするとスクロールが発生しますが、ユーザーが既に下にスクロールしている場合のみです。なぜそうなのかはわかりません。おそらく、画面の左側にある固定位置要素の位置を更新していないのでしょうか? いずれにせよ、この問題は非常に特殊な一連の状況にのみ影響しますが、賢明なページ レイアウトによってほとんど回避できます。そのため、利点 (アクセスしやすく、比較的単純なコード) が欠点 (一部のブラウザーや状況での小さな視覚的な癖) を上回ると思います。

この手法の詳細については、次を参照してください。

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

これが他の誰かに役立つことを願っています。

于 2010-11-22T17:21:57.730 に答える