2010-06-15 85 views
1

当您在页面上托管Google搜索元素时,会创建一个包含指向Google AdSense广告页面的iframe的div。但是,如果没有针对特定查询的广告,Google会以某种方式更改您网域上的类,以使div(和iframe)不可见。神秘:Google如何进行跨域iframe通信?

他们不使用postMessage,因为它也适用于IE7。他们也没有使用片段标识符方法,因为没有哈希值出现在url中。那么他们如何做到这一点?

要检查我在说什么只是把下列常规HTML页面:

<!-- Google Custom Search Element --> 
<div id="cse" style="width:100%;">Loading</div> 
<script src="http://www.google.com/jsapi" type="text/javascript"></script> 
<script type="text/javascript"> 
google.load('search', '1'); 
google.setOnLoadCallback(function(){ 
new google.search.CustomSearchControl().draw('cse'); 
}, true); 
</script> 

,然后做“汽车”(或其他任何必定会对广告)和搜索然后“wzxv”,它没有广告...

+0

你有没有想出答案?心灵分享? – Sam3k 2011-02-06 04:09:35

回答

0

该脚本包含在您的框架中,因此它可以对您的页面进行任何操作。跨域限制仅针对引用外部脚本中来自外部域的内容的iframe中的脚本。 google.load('search', '1');在您的框架中运行,由您的域名拥有,不受任何限制。

+0

正如我在给Franci的回复中写道的,问题是为了隐藏div,它需要访问iframe网页(其位于不同的域!)以查看没有广告。它是如何做到的? – Shraga 2010-06-15 22:33:24

+0

为什么呢?它可以简单地询问Google服务器是否要在将来展示iframe中的广告,而不是根本创建iframe。 – MvanGeest 2010-06-16 15:58:00

0

脚本片段正在页面的DOM中执行,而不是在广告IFrame中执行。它创建IFrame作为HTML中父div的子元素,并设置其URL以加载广告,但由于它作为页面的一部分运行,因此它也可以选择隐藏父div。

更新:该脚本可以轻松地向广告服务器运行Ajax查询,并根据响应选择要执行的操作。事实上,该脚本可能足够愚蠢,甚至不关心响应,只是将其呈现在DOM中,并且广告服务器可以返回另一个脚本,根据结果做适当的事情 - 隐藏父div或注入广告iframe中。哎呀,如有必要,广告服务器可以直接返回适当的HTML来替换整个父div。所有初始脚本需要知道并传递给Ajax查询是它的父div的名称,您将它作为参数传递给它。

+0

Franci, 问题是,为了隐藏父div,它需要知道iframe中没有广告!我的问题是,它怎么知道这个...? – Shraga 2010-06-15 22:31:41

-1

答案是一个字长:jsonp

+0

您花了不止一个字给出一个单词的答案。这表明你可以提供更多细节。 – icedwater 2013-09-03 06:44:26