IEと他のブラウザで異なる挙動の一つに、 Document.getElementsByNameがある。
これは、
<![CDATA[document.getElementsByName()[0];]]>
と
<![CDATA[document.getElementById();]]>
が同じ結果になる、という謎仕様。
先日、社内システムが何故IEでしか動作しないか調べていたら、 コレにぶちあたった。
なので今回はこの違いをUserscriptで吸収してみた。
という訳でコード。
<![CDATA[ document.getElementsByNameOrig=document.getElementsByName; document.getElementsByName=function(name){ var a=document.getElementsByNameOrig(name); if(a.length==0){ a.push(document.getElementById(name)); } return a; }; ]]>
やっているのは、Document.getElementsByNameを上書き。 上書き後のDocument.getElementsByNameの挙動は、
まずは通常のDocument.getElementsByName通り
1.の結果が空なら、Document.getElementByIdを実行して結果を追加
になる。 ただし、 <![CDATA[ // ==UserScript== // @name ほげほげ〜 // @namespace https://fuga.fuga/ : // @run-at document-start // @grant none // ==/UserScript==]]>
みたいに@run-at属性に、document-startを付けて、 他のスクリプトが実行される前に、上記上書き処理が走らないといけない。
確認している回避環境は Firefox+Greasemonkey Chromium+Tampermonkey # Safari+NinjaKitは未検証
















