谷歌和雅虎如何替换浏览器状态栏中的 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】:这是一个多部分的过程。对于给定的<a>
标记,html 中的href
属性将指向实际页面。这允许没有 JavaScript 的浏览器去正确的地方。
接下来,链接上有一个mousedown
事件处理程序。当您将鼠标悬停在链接上时按下鼠标按钮时会触发 mousedown 事件。即使按下鼠标右键或中键也会触发此事件。该处理程序将href
替换为搜索引擎域中的重定向脚本。
这样他们仍然会在最后一刻显示正确的 URL,但他们仍然使用重定向命中记录器,即使您在新标签页中打开链接也是如此。
【讨论】:
【参考方案6】:看起来他们的做法与您在示例中的做法完全相反。它们具有 href="the link" 和 onclick 事件作为跟踪功能。
【讨论】:
以上是关于谷歌和雅虎如何替换浏览器状态栏中的 URL?的主要内容,如果未能解决你的问题,请参考以下文章
python 清理iOS屏幕截图的状态栏。状态栏中的时间保持不变,但所有其他图形都被删除并替换为w