プロトタイプを使用するサイトがあります。 DOMのdocument.getElementsByClassName()
はNodeList
を返しますが、Prototypeのdocument.getElementsByClassName()
はNodeList
をJSスクリプトで作成できないため、Array
を返します。
Firefoxでは、あなたは、元のメソッドを取得するために
var node = document;
Components.lookupMethod(node, 'getElementsByClassName').call(node, /* className */);
を使用することができます。たぶん、Google Chromeは似たようなものを実装しています。私は何も見つかりませんでした(2分のグーグル)。あなたはこのようなものを使用することができます。この場合
:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
className = className.replace(/([\.\\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\$1');
var regex = new RegExp('(?:^|[\\n\\r ])' + className + '(?:[\\n\\r ]|$)');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(regex.test(nodeList[ i ].className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
あなたは不気味な正規表現を使用しない以下の機能を使用することができますnode.classList
Google Chromeが実装している場合:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(nodeList[ i ].classList.contains(className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
この機能を指定されたノード内のすべての要素を反復処理します。プロトタイプのような配列を返し、同じ欠点を共有します。配列はNodeList
のように「ライブ」ではありません。
事前にキャッシュすることも、ネイティブサポートが存在しない場合(ほとんどの場合はこれを行う必要があります)にのみサポートを追加するようにスクリプトを変更することはできますが、一度オーバーライドすると元に戻すことはできません。 – davin
@davin残念ながら、私はページやそのスクリプトを所有/制御していません。 – asleepysamurai
私が言ったように、私は、ページに埋め込まれているスクリプトではなく、ブックマークレットを書いています。だから私はgetElementsByClassNameをredineする関数を変更することができません。なぜなら、私はそれにアクセスする他の方法を探しているのです。 – asleepysamurai