Javascript 如何检测服务广告维度

Javascript 如何检测服务广告维度,javascript,responsive-design,ads,google-dfp,Javascript,Responsive Design,Ads,Google Dfp,我目前正在使用带有DFP的google publisher标签为一个网站提供广告,该网站很快就会响应。我们有一个特定的广告槽,它可能提供2个潜在宽度,728或960,根据提供的宽度,我想在导航上方或下方呈现广告 因此,显而易见的第一个问题是,这是否有一点理智,而且可能吗?我想我应该定义两个不同的广告时段 不过,最主要的问题可能更像是一个学术性的问题,那就是我如何能够检测到一个已经发布的广告的维度?我怀疑这个解决方案对ad平台来说是不可知的,因为我基本上是检测到节点插入,然后检查容器元素的尺寸 我

我目前正在使用带有DFP的google publisher标签为一个网站提供广告,该网站很快就会响应。我们有一个特定的广告槽,它可能提供2个潜在宽度,728或960,根据提供的宽度,我想在导航上方或下方呈现广告

因此,显而易见的第一个问题是,这是否有一点理智,而且可能吗?我想我应该定义两个不同的广告时段

不过,最主要的问题可能更像是一个学术性的问题,那就是我如何能够检测到一个已经发布的广告的维度?我怀疑这个解决方案对ad平台来说是不可知的,因为我基本上是检测到节点插入,然后检查容器元素的尺寸


我一直在尝试DOMNodeInserted javascript事件,但它似乎会触发所有“但”广告。我对此感到困惑,除非gpt以不触发此事件的方式插入广告。

我在WiiMusic.net上与谷歌AdSense有类似的问题。我最后做的是用JavaScript检测包含广告的div的大小,然后加载广告。在这种情况下,一旦加载,就不可能更改我页面的分辨率或大小,所以这是可行的

在您的情况下,您的页面当然可以改变大小,而不是什么。我认为,如果你想根据你的响应性设计看到不同的广告版本,你必须在那时重新加载广告。如果您使用的是异步ad代码,这应该是可能的


总而言之,是的,这在JavaScript中是合理和可能的。你的广告需要JavaScript才能正常工作,所以这不应该是一个太大的障碍。

所以像往常一样,我一直在考虑这个问题。我没有检测到DOM更改的原因是,在我分配事件处理程序时,广告已经插入。当同步加载广告时,我可以立即测量容器div的尺寸并获得广告尺寸。异步加载时,我能够通过使用存储原始html并轮询更改,以及在更改发生时对容器div进行度量,来轮询内部html更改。感谢布拉德抽出时间。

我以前做过类似的事情。。。我决定使用的方法是重写一个内部DFP函数(rended),这样我就可以看到广告在屏幕上呈现的位置是什么

例如,要获得广告的尺寸,您可以执行以下操作(我只在chrome上测试过,但它离完全跨浏览器还不远):


DFP试验
var googletag=googletag | |{};
googletag.cmd=googletag.cmd | |[];
(功能(){
var gads=document.createElement('script');
gads.async=true;
gads.type='text/javascript';
var usesssl='https:'==document.location.protocol;
gads.src=(使用SSL?'https:':'http:')+
“//www.googletagservices.com/tag/js/gpt.js”;
var node=document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(gads,节点);
})();
googletag.cmd.push(函数(){
var slot1=googletag.defineSlot('/12345678/TEST',[266115],'div-gpt-ad-1340819095858-0')。addService(googletag.pubads());
slot1.oldRendered=slot1.rendered;
slot1.rendered=函数(){
window.console.log('width:'+document.getElementById('div-gpt-ad-1340819095858-0')。getElementsByTagName('iframe')[0]。contentWindow.document.width);
window.console.log('height:'+document.getElementById('div-gpt-ad-1340819095858-0')。getElementsByTagName('iframe')[0]。contentWindow.document.height);
slot1.oldRendered();
};
googletag.pubads().enableSingleRequest();
googletag.enableServices();
});
googletag.cmd.push(函数(){
谷歌标签显示('div-gpt-ad-1340819095858-0');
});

这可能不是您想要的,但重写该函数应该可以让您到达需要的位置。。。如果您有任何问题,请告诉我。

GPT有一个更新,允许以更优雅的方式完成此操作。 该活动将告诉您是否返回了创意,如果返回,则说明维度以及其他信息

googletag.pubads().addEventListener('slotRenderEnded', function(event) {
 console.log('Creative with id: ' + event.creativeId +
  ' is rendered to slot of size: ' + event.size[0] + 'x' + event.size[1]);
});

还有event.isEmpty,它将告诉您是否返回了实际的创意。

在我的情况下,我实际上需要做相反的事情。我将根据所服务广告的大小调整包含div的大小/位置,而不是相反。为了做到这一点,我需要找到一些方法来定义插入广告时的回调。正如我所说的,我已经尝试过DOMNodeInserted事件,而且我正在试验DOMSubertreeModified以检测何时插入广告内容。@sphoid,请原谅我的无知,但我认为DFP广告槽只能包含一个大小?DFP如何确定为您服务的广告大小?根据您收到的广告大小,您的页面大小会有所不同?我认为DOMNodeInserted问题是由于提供广告的iframe造成的。您可以在googletag.defineslot()中为一个插槽定义多个以逗号分隔的广告大小。我这样做主要是为了排行榜广告槽,它可以提供全页宽度的横幅以及更窄的中心横幅。我的一些广告不插入iFrame,而是动态生成一个div,插入一些脚本标记,如果创意是基于flash的,有时还会插入对象标记。我至少应该能够检测到这些元素何时被插入。我说得太快了。此解决方案仅适用于容器div可以并且将在创建时调整大小的情况
googletag.pubads().addEventListener('slotRenderEnded', function(event) {
 console.log('Creative with id: ' + event.creativeId +
  ' is rendered to slot of size: ' + event.size[0] + 'x' + event.size[1]);
});