アクセスキーに関する実験その2

「その2」なんて予定外ですが、脱線しすぎてしまったためにページを分けます。サンプルが重複するのを避けるためでもありますが。ここまで来たら、Mozillaについても脱線してみます。

Mozillaの謎

IEは散々叩きました。次はMozillaです。accesskey属性を取り除いたり、その値を取り除いたりしても、全く反映されないのはどうしたことでしょうか。

もう一度、こんどはDOM1で行える全ての方法で試してみます。結構たくさんの方法があるんですね。これが。

<li><a href="#" accesskey="B" id="back">[B]ack</a></li>
var obj = document.getElementById('back');
function trySetAttributeMethod(){
 obj.setAttribute('accesskey', '');
}
  • IE5.5×
  • IE6×
  • Mozilla×
function tryRemoveAttributeMethod(){
 obj.removeAttribute('accesskey');
}
  • IE5.5×
  • IE6×
  • Mozilla×
function tryRemoveAttributeNodeMethod(){
 obj.removeAttributeNode('accesskey');
}
  • IE5.5はスクリプトエラー
  • IE6×
  • Mozilla×
function tryRewritingAccessKeyProperty(){
 obj.accessKey = '';
}
  • IE5.5○
  • IE6○
  • Mozilla×
function tryRemoveNamedItemMethod(){
 obj.attributes.removeNamedItem('accesskey');
}
  • IE5.5はスクリプトエラー
  • IE6○
  • Mozilla×
function tryRewriteAttrNodeValue(){
 obj.attributes.getNamedItem('accesskey').nodeValue = '';
}
  • IE5.5はスクリプトエラー
  • IE6○
  • Mozilla×

DOM1をフルサポートするMozillaには、6つもの手段がありながら、どれもアクセスキーを無効にすることはできませんでした。私は、「馬鹿は死ななきゃ直らない」を連想しました。このA要素は、一回死ななければAccesskeyを手放しません。それともイベントオブジェクトが関係しているのでしょうか。

結論

やはり、Mozillaに関してはcloneNodeで複製したものに対してこれらの処理を施した後、置き換える必要があるようです。IE6は色々で可能です。

function deleteAttribute(attr){
 var _clone = obj.cloneNode(true);
 _clone.removeAttribute(attr);
 obj.parentNode.replaceChild(_clone, obj);
}

accesskeyのKを大文字にすれば、IEにも使えます。

なんか疲れたので、続きはまたいつか。

SOPHIA w650s@mcn.ne.jp