谷歌和雅虎如何替换浏览器状态栏中的 URL?

Posted

技术标签:

【中文标题】谷歌和雅虎如何替换浏览器状态栏中的 URL?【英文标题】:How do Google and Yahoo replace the URL in the browser status bar? 【发布时间】:2011-02-18 07:26:53 【问题描述】:

在 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/”。

【问题讨论】:

+1 非常有趣的问题。 这对于那些甚至在 10 年后关注这个的人来说可能会很有趣。有人写了一个插件,它将使用真实的链接。使用 Adblockers 时非常有用,因为广告部分由于被阻止而不再起作用。查看更多 github.com/palant/searchlinkfix 和 chrome.google.com/webstore/detail/google-search-link-fix/… 【参考方案1】:

很难阅读源代码,但您会发现实际上 URL(在 <a> 标记中)是正确的目标 URL,这就是为什么浏览器的状态栏显示正确的 URL(而不是跟踪链接当您实际单击时它会重定向您)。然后有一些onclick JavaScript 可以在浏览器的默认操作(按照链接)发生之前拦截点击。

【讨论】:

所以,我猜他们不跟踪右键单击 > 在新选项卡中打开或中键 @Atomiton 当然,他们不会“跟踪”它。 Javascript 的浏览器实现将其视为合法点击并触发事件处理程序。 @Josh:会吗? right-click > open in new tab 不是简单地将href 复制并粘贴到新标签的地址栏中吗?我不记得在这种情况下触发的任何 javascript 事件。编辑:啊! mousedown 事件捕获所有按钮...左、右和中。 @Atomiton 是的,我想我错了。我认为它肯定会触发 onclick! @Josh。是的,不过,捕获 mousedown 是有意义的。【参考方案2】:

Google 在每个链接上都有 onMouseDown 处理程序,这些处理程序将链接从指向 Google 重定向的原始来源更改。所以 onmousedown 替换了链接,当 onClick 出现时(在 onmousedown 之后不久),链接已经指向原始方向以外的其他地方。

步骤 1. 用户点击链接(鼠标按钮按下)

步骤 2. onMouseDown 事件触发

步骤 3. 链接目标(一个 href 值)被更改

第 4 步。鼠标按钮出现

步骤 5. onClick 事件触发器

第 6 步。浏览器看到一个链接被点击并将用户转发到所需的目的地(由已更改的 href 值设置)

第 7 步。浏览器打开一个 Google 重定向页面,这会将用户转发到原始目的地

更新:Google 过去只跟踪 onmousedown 事件的点击,并没有更改链接目标。当在链接上按下鼠标按钮时,向谷歌服务器发出了图像加载请求,该服务器计算了点击次数(onmousedown => new Image("coogle.counter.server.com/link=www.pressed.com")),但我猜它被滥用了,或者它不够可靠,他们决定使用当前的链接更改技术.

【讨论】:

不,它没有。如果您仔细查看下面发布的代码,您会发现 href 从未真正更改过。 是的 - 它取决于当前使用的函数 - clk() 或 rwt()。 rwt() 完全符合我的描述。 实际上 clk 也改变了 href 我加载的谷歌页面有 clk() 函数,你在那个函数的什么地方看到它改变了 href? 查看代码示例的顶部:【参考方案3】:

我认为他们实际上在链接的href 中有完整的链接。但是他们使用 javascript 来捕获 onclick,然后当您单击链接时,它会通过他们的网站路由。

【讨论】:

是的,他们使用脚本记录该 URL 的一些唯一 ID 以进行跟踪,但它仍然是指向实际页面的实际链接。 @Mike W:您是否尝试使用 Firebug 查看源代码?您可以看到实际的 href 链接指向该页面,而不是 Google 页面。【参考方案4】:

例如 *** 的链接实际上是这样的:

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

现在 click 函数在最小化的源代码中的某个地方。这里有一些额外空格的代码:

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。

【讨论】:

我在这个函数中没有看到它实际改变'this.href'的任何地方,它只是通过初始调用发送到函数......对我来说,这个函数看起来改变了源某处的图像。【参考方案5】:

这是一个多部分的过程。对于给定的&lt;a&gt; 标记,html 中的href 属性将指向实际页面。这允许没有 JavaScript 的浏览器去正确的地方。

接下来,链接上有一个mousedown 事件处理程序。当您将鼠标悬停在链接上时按下鼠标按钮时会触发 mousedown 事件。即使按下鼠标右键或中键也会触发此事件。该处理程序将href 替换为搜索引擎域中的重定向脚本。

这样他们仍然会在最后一刻显示正确的 URL,但他们仍然使用重定向命中记录器,即使您在新标签页中打开链接也是如此。

【讨论】:

【参考方案6】:

看起来他们的做法与您在示例中的做法完全相反。它们具有 href="the link" 和 onclick 事件作为跟踪功能。

【讨论】:

以上是关于谷歌和雅虎如何替换浏览器状态栏中的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

python 清理iOS屏幕截图的状态栏。状态栏中的时间保持不变,但所有其他图形都被删除并替换为w

更改 Chrome 状态栏中显示的 URL

更改状态栏中的链接

如何在我的 iPhone / iPad 的状态栏中显示播放图标

从谷歌和雅虎收集搜索结果的程序[关闭]

pyqt - 如何从状态栏中的小部件中删除边框?