54

私は以下のスクリプトを持っています

var els = document.getElementsByTagName("a");
for(var i = 0, l = els.length; i < l; i++) {
  var el = els[i];
  el.innerHTML = el.innerHTML.replace(/link1/gi, 'dead link');
}

ただし、これはページ全体を検索し、多くのリンクがあるため、実行に約 20 秒かかります。

ただしa、特定の を持つのみをターゲットにする必要がありhrefます。「http://ドメイン.com/」

理想的には、フレームワークを使用せずに、jQuery と同様の方法でこれを実行できるようにしたいと考えています。だから何か

var els = document.getElementsByTagName("a[href='http://domain.com']");

その一致するオブジェクトのみを検索するように、これを行うにはどうすればよいhrefですか?

4

2 に答える 2

22

すべての要素のプロパティを読み書きすると、innerHTMLおそらく非常にコストがかかるため、速度が低下します。ブラウザに要素を「シリアル化」させ、それを正規表現で実行してから、再度「逆シリアル化」します。さらに悪いことに、一致しない場合でも、すべての要素に対してそれを行っています。 a

a代わりに、要素のプロパティを直接見てみてください。

var els = document.getElementsByTagName("a");
for (var i = 0, l = els.length; i < l; i++) {
    var el = els[i];
    if (el.href === 'http://www.example.com/') {
        el.innerHTML = "dead link";
        el.href = "#";
    }
}

W3C 準拠がはるかに優れている最新のブラウザーで編集document.querySelectorAll()すると、必要なリンクだけをより効率的に取得するために使用できるようになりました。

var els = document.querySelectorAll('a[href^=http://www.example.com/]');
for (var i = 0, l = els.length; i < l; i++) {
    els[i].textContent = 'dead link';
    els[i].href = '#';
}

http:ただし、一致させたいドメイン名が複数ある場合や、両方をhttps:同時に一致させたい場合など、これはあまり柔軟ではありません。

于 2012-05-13T15:07:53.217 に答える