19

Google と Yahoo の検索ページでは、10 個の検索結果リンクの URL は、実際には google.com または yahoo.com を指しています。URL には、リンクがクリックされたときに google.com または yahoo.com が実際の検索結果にリダイレクトできるようにする追加の引数があります。ユーザーがリンクの上にマウスを置くと、検索結果の URL (google.com または yahoo.com の URL ではなく) がブラウザのステータス バーに表示されます。

彼らがどうやってそれをするのだろうと思います。

何年も前に、window.status を設定する JavaScript を使用することでこれが実現されていましたが、 Reliable cross browser way of setting Status bar text で説明されているように、それはもはや機能していないようです。

次のようなリンクがあります。 <a href="http://somedomain.com/ReallyLongURLThatShouldNotBeSeenInTheStatusBar" onmouseover="window.status='http://niceShourtUrl.com/'" onmouseout="window.status=''">Click Me</a>

このリンクは window.status 戦略を使用しようとしましたが、機能しません。Google や Yahoo の検索結果ページのリンクのように機能するように、このリンクを修正するにはどうすればよいですか? この例では、ユーザーがリンクの上にマウスを置いたときに、ステータス バーに「 http://niceShourtUrl.com/ 」が表示されるようにします。

4

6 に答える 6

14

ソースを読むのは難しいですが、実際には (<a>タグ内の) URL が正しい宛先 URL であることがわかります。これが、ブラウザのステータス バーに正しい URL が表示される理由です (リダイレクトするときに経由するトラッキング リンクではなく)。実際にクリックします)。onclick次に、ブラウザのデフォルト アクション (リンクをたどる) が実行される前に、クリックをインターセプトできる JavaScript がいくつかあります。

于 2010-05-11T19:05:46.843 に答える
8

Google には、リンクを元のソースから Google リダイレクトに向けて変更するすべてのリンクに onMouseDown ハンドラがあります。そのため、onmousedown がリンクを置き換え、onClick(onmousedown の直後) が表示されたとき、リンクは元の方向とは別の場所を指しています。

ステップ 1. ユーザーがリンクをクリックする (マウス ボタンが押されている)

ステップ 2. onMouseDown イベント トリガー

ステップ 3. リンク ターゲット (href 値) が変更される

ステップ 4. マウス ボタンが表示されます

ステップ 5. onClick イベント トリガー

ステップ 6. ブラウザーは、リンクがクリックされたことを確認し、ユーザーを目的の宛先 (既に変更された href 値によって設定) に転送します。

ステップ 7. ブラウザが Google リダイレクト ページを開き、これによりユーザーが元の宛先に転送されます

更新: Google は onmousedown イベントのクリックのみを追跡し、リンク先を変更しませんでした。リンク上でマウス ボタンが押されると、クリックをカウントする Google サーバーに対して画像の読み込み要求が行われました ( onmousedown => new Image("coogle.counter.server.com/link=www.pressed.com"))。

于 2010-05-11T19:17:48.280 に答える
6

私は彼らが実際にリンクの完全なリンクを持っていると思いますhref。しかし、彼らはJavaScriptを使用してキャッチしonclick、リンクをクリックするとサイトを経由します.

于 2010-05-11T19:06:15.843 に答える
3

たとえば、StackOverflow へのリンクは実際には次のようになります。

<a onmousedown="return clk(this.href,'','','res','1','','0CBwQFjAA')" class="l" href="http://stackoverflow.com/"><em>Stack Overflow</em></a>

クリック機能は、最小化されたソース コード内のどこかにあります。ここに、追加の空白を含むコードがあります。

window.clk = function ( e, f, g, k, l, b, m )
{
    if ( document.images )
    {
        var a = encodeURIComponent || escape,
            c = new Image,
            h = window.google.cri++;

        window.google.crm[h] = c;
        c.onerror = c.onload = c.onabort = function()
        {
            delete window.google.crm[h]
        };

        var d, i, j;

        if ( google.v6 )
        {
            d = google.v6.src;
            i = google.v6.complete || google.v6s ? 2 : 1;
            j = (new Date).getTime() - google.v6t; delete google.v6
        }

        if ( b != "" && b.substring( 0, 6 ) != "&sig2=" )
            b = "&sig2=" + b;

        c.src = [
                "/url?sa=T",
                "&source=" + google.sn,
                f ? "&oi=" + a(f) : "",
                g ? "&cad=" + a(g) : "",
                "&ct=",
                a( k || "res" ),
                "&cd=",
                a( l ),
                "&ved=",
                a( m ),
                e ? "&url=" + a( e.replace( /#.*/, "" ) ).replace( /\+/g, "%2B" ) : "",
                "&ei=",
                google.kEI,
                d ? "&v6u=" + a( d ) + "&v6s=" + i + "&v6t=" + j : "",
                b ].join( "" )
    }
    return true
 };

詳しく見なくても重要な点は、Google の URL を計算しthis.href、リンクをクリックしたときにその新しい URL に (= リンクのリンク ターゲット!) を設定することです。その後、リンクが評価され、以前に元のリンク URL が表示されていても、ブラウザーは変更された URL に送信します。

于 2010-05-11T19:17:46.423 に答える
1

これはマルチパート プロセスです。特定の<a>タグについてhref、HTML の属性は実際のページを指します。これにより、JavaScript を使用しないブラウザーでも適切な場所に移動できます。

次に、mousedownリンクにイベント ハンドラーがあります。リンクの上にカーソルを置いてマウス ボタンを押すと、mousedown イベントが発生します。このイベントは、マウスの右ボタンまたは中央ボタンが押された場合でも発生します。ハンドラーはhref、検索エンジンのドメイン内のリダイレクト スクリプトに置き換えます。

そうすれば、最後の瞬間まで正しい URL が表示されますが、新しいタブでリンクを開いた場合でも、リダイレクト ヒット ロガーが使用されます。

于 2010-05-11T19:19:45.363 に答える
0

あなたの例とは正反対のことをしているようです。追跡機能として href="the link" と onclick イベントがあります。

于 2010-05-11T20:58:17.897 に答える