ページに $ 記号がいくつあるかを見つける最善の方法を探しています。document.body.innerHTML
その上にある $-as の数を読んで計算するよりも良い方法はありますか?
2 に答える
質問は 2 つの部分に分けることができます。
- HTML タグなしで Web ページのテキスト コンテンツを取得するにはどうすればよいでしょうか。
2 番目の質問を少し一般化できます。
- 別の文字列に出現する文字列の数を見つけるにはどうすればよいでしょうか?
そして、「これを行うための最良の方法」:
Amaan はテキストを見つけるというアイデアを正しく理解しましたが、さらに進めてみましょう。
var text = document.body.innerText || document.body.textContent;
コードに追加すると、すべてのブラウザーでサポートされているわけではないtextContent
ため、より多くのブラウザーをカバーするのに役立ちます。innerText
2番目の部分は少しトリッキーです。それはすべて、ページ上の「$」記号の出現数に依存します。
たとえば、ページにシンボルが少なくとも 1 回出現することが確実にわかっている場合は、次のコードを使用します。
text.match(/\$/g).length;
指定された文字列に対してグローバルな正規表現の一致を実行し、返された配列の長さをカウントします。それはかなり速くて簡潔です。
一方、シンボルがページに少なくとも 1 回表示されるかどうかわからない場合は、コードを次のように変更する必要があります。
if (match = text.match(/\$/g)) {
match.length;
}
これは、match 関数によって返された値をチェックするだけで、null の場合は何もしません。
ページ内にシンボルが大量に出現する場合、または検索を何度も実行する場合にのみ、3 番目のオプションを使用することをお勧めします。これは、指定された文字列が別の文字列に出現する回数をカウントするためのカスタム関数 (ここから取得) です。他の 2 つよりも優れたパフォーマンスを発揮しますが、長くて理解しにくいものです。
var occurrences = function(string, subString, allowOverlapping) {
string += "";
subString += "";
if (subString.length <= 0) return string.length + 1;
var n = 0,
pos = 0;
var step = (allowOverlapping) ? (1) : (subString.length);
while (true) {
pos = string.indexOf(subString, pos);
if (pos >= 0) {
n++;
pos += step;
} else break;
}
return (n);
};
occurrences(text, '$');
これら 3 つの異なるアプローチを自分で比較できるように、小さな jsfiddleの「ベンチマーク」も含めています。
また、いいえ、本文を取得して「$」記号の数を数えるだけでなく、これを行うより良い方法はありません。
おそらく、document.body.innerText
またはdocument.body.textContent
を使用して、HTML で誤検知が発生するのを回避する必要があります。
このようなものが動作するはずです:
document.body.innerText.match(/\$/g).length;
私が考えることができる別の方法は、次のように使用することwindow.find
です:
var len = 0;
while(window.find('$') === true){
len++;
}
(これは、ユーザーが最後にクリックした場所に依存するため、信頼できない場合がありますonload
。ユーザー操作の前に実行すると、正常に機能します。)