keypressはブラウザによって反応するキーが違う

今回もアクセシビリティ対応で判明したのですが、jQueryのkeypressメソッドの判定がブラウザによって違うことがわかりました。

今回、アクセシビリティの改修を行うために調査したサイトで、よく見るフォントサイズを切り替えるボタンをjQueryのkeypressで実装していました。ところがこの動きがあまりよろしくなかったんです。

以下がそのサンプルです。(jQuery部分)

 サンプルを別ウィンドウで見る

上記サンプルの場合、font_s(小)、font_m(中)、font_l(大)のボタンの上で何かキーを押されると反応してフォントサイズが変わります。キーが特定されていないことですでにアクセシビリティに対応していないのですが、問題はFirefoxで起こりました。
キーボードのみで操作する場合、リンクの移動はTabキーで行いますが、FirefoxはこのTabキーの操作をkeypressで拾ってしまうんです。
例えば小ボタンにいるときにTabキーを押すとボタンは中に移動するが、サイトのフォントは小に切り替わってしまいます。IEやChromeではこの現象を確認できなかったので、現象はmozilla系のブラウザで起こるのではないかと考えています。

この現象をサンプルコードで解消するにはkeypressが反応するキーを限定する必要があります。例えばEnterキーのみに反応するようにするには以下のようにします。

 

すみません、もっとシンプルなコードがあると思うんですが…。
13はEnterキーのキーコードです。ifでこのキーコードを受け取った時だけフォントサイズを切り替えています。

IE、Chrome、Firefoxでいろいろとキーを押してみたのですが、ブラウザによって反応が違います。文字と関係ないキー、Fn(ファンクション)やCtrlなどの制御キーは反応が異なるので注意が必要ですね。と言うかフォントサイズを切り替えるのにkeypressを使うな! ってことでしょうか。

[tmkm-amazon asin=’486354149X’][/tmkm-amazon]

ページ内リンクを無効にしてタブメニューを動かす(jQueryのpreventDefault)

Webサイトでよく目にするタブメニュー。実装自体は難しくないのですが、最近アクセシビリティというものの対応案件がありマークアップでかなり四苦八苦しました。

はじめタブ部分はaタグで囲まず、cssでカーソルを手マーク(pointer)に変えていたのですが、それではTabキーでリンクを移動してきた際にタブにフォーカスが当たらずアクセシビリティとしてNGをくらいました。

そこでタブ部分をaタグで囲むようにマークアップを変更したのですが、ある問題が勃発!それはページ内リンクとして機能してしまい、タブをクリックするとページ内で表示位置が動いてしまうこと。
それをjQueryで回避する方法を調べました。

まずはダメな場合

恥ずかしいソースコードなのはご愛嬌
上記のコードのサンプル

大丈夫な場合

JSのみ更新
上記のコードのサンプル
return false;を使ってリンクを無効化する方法もあるのですが、その場合タブで切り替える部分も機能しなくなってしまいます。ページ内リンクのみを無効化したいためpreventDefaultを使用しました。

参考サイト
TAM Technical Team Tips Note
jQuery のバブリング、preventDefault() や stopPropagation() の使用例

ふじこのプログラミング奮闘記
jQueryのバブリングと、「return false;」「e.stopPropagation();」「e.preventDefault();」について

[tmkm-amazon asin=’4048913913′][/tmkm-amazon]

infinitescrollのオプション設定

このサイトでも使用している無限スクロールスプリクト「infinitescroll」ですがバージョンが上がり、一部仕様が変ったようです。

※動作検証はinfinitescroll version 2.0.2jQuery version 1.11.1で行っています。
※WordPressプラグインは使用していません。

infinitescrollでは追加コンテンツ読み込み時に好きな読み込み画像とテキストを表示できます。この設定を検索していると高確率でASCII.jpのこのページにたどり着くと思います。
このサイトもASCII.jpの説明の通りに設定して無限スクロールを実現してます。

ところが最近、新規に制作しているサイトでこれを実装しようとしたところ、動作しませんでした。どうやらオプションの設定方法が変更になったようで、以下のようにJS部分を記載したところオプションが無事反映されました。

 

さて、動いたのですが新規作成サイトでinfinitescrollに関する別の問題が発生しました。新規サイトはWordPressで構築しているのですがinfinitescrollが3ページ目を読み込まないのです。
WordPressのパーマリンク設定は変更していないので試しにURLに/?paged=2を付加して直接2ページ目を表示したところ、2ページ目からは3ページ目が読み込まれましたが今度は4ページ目が読み込まれません。
どうやら自ページの次ページしか表示できなくなっているようです。

その解決策がこちらのサイト(ARKの技術メモ)に記載されていました。
どうやら次のページ番号がURLのどの部分なのかinfinitescrollがわからなくなっているようです。
これもinfinitescrollのオプション設定でinfinitescrollに教えることができるようで、上記の設定を以下のように変更して解決しました。

[tmkm-amazon asin=’479736758X’][/tmkm-amazon]

jQueryとGoogle AJAX Feed APIを使って複数のRSSフィードを取得

ドリコムのドリコムRSS Liteが2011年9月30日でサービスが終了してしまうと言うことでドリコムRSSに変わるものを探していました。jQueryでなんとかならないか? と思ったのですがJavaScriptはクロスドメイン(別々のドメイン)で動かすことができない。
ダメか、と思っていたときGoogle AJAX Feed APIなるものを発見。さすがGoogle先生です。

今回はjQueryのプラグインjquery.googleMultiFeedを使って実現したいと思います。
jquery.googleMultiFeedの設置の仕方はこちらのサイト(開発元)に記載されています。

まずは被害の少ないDisneyPark Go!に設置。DisneyPark Go!ではMT,エキサイトブログ、FC2ブログ、 ブログのRSSを読み込んでみます。

数日後、あることに気がつきました。エキサイトブログのRSSフィードがうまく読み取れていないのです。ブログ側は更新されてもGoogle AJAX Feed APIがうまく解読できていないらしくいつまでたっても変更がありません。
W3C Feed Validation Service, for Atom and RSSでエキサイトブログのRSSをチェックしてみました。
結果はSorry。
どうやらエキサイトブログのRSSはお行儀があまりよくなさそうです。考えてみればドリコムRSS LiteもエキサイトブログのRSSをうまく読み込めていませんでした。でも、Google ReaderはエキサイトブログのRSSを読めてるんだけどなぁ。不思議。

最初、同じjQueryプラグインのjFeedMixerでやってみたのですが、こちらはFC2のRSSのURLがうまくGoogle AJAX Feed APIに渡せないようで、残念ながら使用をあきらめました。どうやらFC2のRSSのURLに含まれる“?”がダメなようです。自分で該当部分を直せるくらいの知識があるといいんですが。

エキサイトブログはほっておきましょう。とりあえずこれでドリコムRSS Liteの代わりになりそうです。あとは読み込むRSSの件数が増えた場合の挙動ですかね。