その方法は、 getComputedStyle要素のDOMメソッドの使用に基づいています。 HTMLAnchorElementによって呼び出されると、人気サイトの訪問済みと通常のリンク状態を区別できます。
バグは長い間クローズされており、使用できなくなりました。
私の方法は、ユーザーがアクセスしたサイトのfavicon.icoがキャッシュにある可能性が高いため、ユーザーがこれまでにアクセスしたことのないサイトよりも速くロードされるという事実に基づいています。 ブラウザは、favicon.icoを非常に積極的にキャッシュします。これにより、この方法の信頼性が向上するだけです。
以下は、このメソッドの概念実証実装の完全なソースコードです。 これを使用すると、habrahabr.ruにアクセスしていることを示すことができますが、hornet.comにアクセスしたことはありません。
var diffTreshold = 200; // , , , . var body = document.querySelector('body'); var testResults = []; var testCases = [ 'hornet.com', 'habrahabr.ru' ]; testCases.forEach(test); function test (host) { var start = new Date(); var img = new Image(); img.src = 'http://'+host+'/favicon.ico'; img.onload = function () { saveResult(host, start, new Date()); } body.appendChild(img); } function saveResult (host, start, end) { var diff = end - start; testResults.push({ host: host, start: start, end: end, diff: diff, visited: diff <= diffTreshold }); }
このコードは、経験的に選択されたdiffTreshold定数を使用するため、あまり正確な結果を提供しません。 この変数は、画像のダウンロードの開始から終了までに経過したミリ秒数です。これは、ブラウザキャッシュのヒットと見なされる必要があります。
より正確な方法は、最小画像読み込み時間と最大画像読み込み時間の間の平均値の計算に基づく必要がありますが、リンクの1つは、キャッシュに存在しない保証されたサイトアイコンにつながるはずです。 その後、この平均値よりも小さいものはすべてキャッシュヒットと見なされるため、ユーザーが指定されたサイトにいたことを示します。
この方法には、私が解決していない1つの欠点もあります。最初のテストの後、その後の起動では結果が役に立たなくなります。
そのような履歴スニッフィングの必要性は疑わしいように思えるかもしれませんが、オンラインストアまたはランディングページの所有者にとって、彼が訪問した競合他社またはパートナーのサイトの知識に基づいて、ユーザーに関連する広告を表示することは有用です。
UPD:
この投稿が招待に値するものになったことに驚きました。 どうやら、これは本当に非常に興味深いトピックです。 このメソッドを既製のライブラリの形で実装してみます。