Подтвердить что ты не робот

Как Google и Yahoo заменяют URL в строке состояния браузера?

На страницах поиска Google и Yahoo URL-адреса 10 ссылок результатов поиска фактически указывают на google.com или yahoo.com. У URL-адресов есть дополнительные аргументы, которые позволяют google.com или yahoo.com перенаправлять на фактический результат поиска при нажатии ссылки. Когда пользователь переводит ссылку на ссылку, URL-адрес результата поиска (а не URL-адрес google.com или yahoo.com) отображается в строке состояния браузера.

Мне интересно, как они это делают.

Много лет назад это было бы достигнуто с помощью некоторого javascript, который устанавливает window.status, но это, похоже, больше не работает, как объясняется Надежный кросс-браузерный способ установки текста строки состояния

У меня есть ссылка, которая выглядит так: <a href="#" onclick="location.href='http://somedomain.com/ReallyLongURLThatShouldNotBeSeenInTheStatusBar'; return false;" onmouseover="window.status='http://niceShourtUrl.com/'" onmouseout="window.status=''">Click Me</a>

Эта ссылка попыталась использовать стратегию window.status, но она не работает. Как исправить эту ссылку, чтобы она действовала как ссылки на страницах результатов поиска Google и Yahoo? В этом примере я хочу, чтобы " http://niceShourtUrl.com/" отображался в строке состояния, когда пользователь переводит ссылку по ссылке.

4b9b3361

Ответ 1

Трудно прочитать источник, но вы увидите, что на самом деле URL-адреса (в тегах <a>) являются правильными целевыми URL-адресами, поэтому в строке состояния браузера отображается правильный URL-адрес (вместо ссылки отслеживания что он перенаправляет вас, когда вы на самом деле нажимаете). Тогда есть некоторый JavaScript onclick, который может перехватить клики до того, как действие по умолчанию браузера (по ссылке) может иметь место.

Ответ 2

Я думаю, что на самом деле у них есть полная ссылка в href ссылки. НО они используют javascript, чтобы поймать onclick, а затем, когда вы нажимаете на ссылку, она проходит через их сайт.

Ответ 3

У Google есть обработчики onMouseDown по каждой ссылке, которые меняют ссылку из исходного источника, указывающего на перенаправление Google. Поэтому 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")), но я предполагаю, что это было неправильно использовано или было недостаточно надежным, чтобы они решили использовать технику изменения текущей ссылки.

Ответ 4

Например, ссылка на 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
 };

Не смотря на это подробно, важная идея состоит в том, что он вычисляет некоторый URL-адрес google и устанавливает this.href (= ссылка для ссылки!) на этот новый URL-адрес при нажатии ссылки. После этого ссылка затем оценивается, и браузер отправляет вас на этот измененный url, несмотря на то, что ранее показывал URL-адрес исходного кода.

Ответ 5

Это многопроцессорный процесс. Для данного тега <a> атрибут href в HTML указывает на фактическую страницу. Это позволяет браузерам без JavaScript работать в нужном месте.

Далее, в ссылке есть обработчик события mousedown. Событие mousedown срабатывает, когда вы нажимаете кнопку мыши, нависая над ссылкой. Это событие срабатывает, даже если нажата правая или средняя кнопка мыши. Обработчик заменяет href перенаправлением script в домене поисковой системы.

Таким образом, они до сих пор отображают правильный URL-адрес до последнего момента, но они все еще используют редизайн-журнал регистрации, даже когда вы открываете ссылку на новой вкладке.

Ответ 6

Похоже, что они прямо противоположны тому, что у вас есть в вашем примере. У них есть href= "ссылка" и событие onclick в качестве функции отслеживания.