- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在寻找可以从 Google DFP 中的自定义广告素材内部扩展 SafeFrame 自定义广告的解决方案,这是否可能?
最佳答案
有两种可能的解决方案:
1) 使用 SafeFrame API
优点:
缺点:
2) 使用 window.postMessage()
编写您自己的 API javascript方法
缺点:
优点:
SafeFrame API
这个API真的很容易使用,你可以看一些例子 GPT Safeframe preview tool .
首先,您需要更新 <head>
中的 DFP 初始化脚本您的网站
var pageConfig = {
allowOverlayExpansion: true,
allowPushExpansion: true,
sandbox: true
};
googletag.pubads().setSafeFrameConfig(pageConfig);
这将允许在您的网站上展开 SafeFrame 广告。更多关于这个在 Control SafeFrame Container behavior through GPT .
现在您可以创建自定义广告素材并将其作为 SafeFrame 转换到您的网站上。这是我的一个例子。此示例可以“等待”直到它可见,然后将扩展到 <div id="container">
的高度在 SafeFrame 内部:
<div id="container">
some lines to make container height<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
line<br>
</div>
<script>
// global expanded indicator variable, because API don't have any
var expanded = false;
function expand() {
var self= $sf.ext.geom().self;
var config = {
push: true, // we want to push expanded content
b: 0
};
var el = document.getElementById('container');
var containerHeight = el.offsetHeight;
// get height from bottom, that need to be expanded
var expandBottom = containerHeight - self.h;
// if container is whole inside a SafeFrame, it will not expand
if(expandBottom < 0) return;
config.b = expandBottom;
$sf.ext.expand(config);
}
function expandDelayed(forceExpand) {
// expand will run just once, or you can force it to run again
// but collapse first is needed
if(expanded && forceExpand || !expanded) {
$sf.ext.collapse();
expanded = false;
// there must be some timeout, because .collapse(); method is deplayed somehow
setTimeout(expand, 0);
}
}
$sf.ext.register(160, 150, function(status, data) {
// this code will do whole magic of "waiting" for right moment
if (status === 'geom-update') {
expandDelayed();
}
// change global expanded status
if (status === 'expanded') {
expanded = true;
}
});
// init
expandDelayed();
</script>
window.postMessage()
编写您自己的 API javascript方法首先,您需要将此代码放入 <head>
中的 DFP 初始化脚本中你的网站。此代码会将广告位的 ID 添加为 #hash-tag
至 <iframe>
的 src,以便您可以从您的广告素材中获取它。
googletag.pubads().addEventListener('slotRenderEnded', function (event) {
var containerId = event.slot.getSlotElementId();
var containerEl = document.getElementById(containerId);
if (containerEl === null) return;
var iframeEl = containerEl.querySelectorAll('iframe')[0];
// it's delayed by 10 milliseconds, because iframe is not yet fully rendered
// and limited to max to 10 seconds to wait
var timeoutFunction = function () {
var src = "#" + containerId;
// `src` attribute is null, when iframe is FriendlyIframe, and
// when it's present, then it's SafeFrame
if (iframeEl.getAttribute('src') !== null) {
src = iframeEl.getAttribute('src').replace(/#.*/, "") + src;
} else {
var name = iframeEl.getAttribute('name') + "#" + containerId;
iframeEl.setAttribute('name', name);
}
iframeEl.setAttribute('src', src);
};
setTimeout(timeoutFunction, 10);
});
其次,您需要将此代码添加到您的网站,最好是单独的 .js 文件。
function onMessageReceivedGetStyle(e) {
// this will filter just setStyle commands from correct origin
if (
!(e.origin === 'http://tpc.googlesyndication.com' || e.origin === 'https://tpc.googlesyndication.com') ||
typeof e.data !== 'object' ||
typeof e.data.id !== 'string' ||
e.data.cmd !== 'setStyle' ||
typeof e.data.params !== 'object'
) {
return;
}
// remove # character from id, we don't use jquery
var elementId = e.data.id.replace(/#/, "");
var wrapperEl = document.getElementById(elementId);
if (wrapperEl === null) {
return;
}
var elements = [wrapperEl];
// you can target child elements too with query parameter
if (typeof e.data.query === 'string' && e.data.query) {
elements = wrapperEl.querySelectorAll(e.data.query);
}
elements.forEach(function (element) {
Object.keys(e.data.params).forEach(function (param) {
element.style[param] = e.data.params[param];
});
});
}
if (window.addEventListener) {
addEventListener('message', onMessageReceivedGetStyle, false);
}
else {
if (window.attachEvent) {
attachEvent('onmessage', onMessageReceivedGetStyle);
}
else {
window.onmessage = onMessageReceivedGetStyle;
}
}
第三件事是您在 DFP 中自定义类型的广告素材中的自定义代码。这是示例,类似于第一个例子,但这里这个脚本可以等到所有内容和图像都加载完毕,然后扩展/缩小你的带有广告素材的 iframe:
<div id="container">
<a href="#" target="_blank">
<img src="%%FILE:JPG1%%">
</a>
<a href="#" target="_blank">
<img src="%%FILE:JPG2%%">
</a>
</div>
<style>
a {
display: block;
margin-bottom: .5em;
}
img {
display: block;
max-width: 100%;
}
*:last-child {
margin-bottom: 0;
}
</style>
<script>
var container = document.getElementById('container');
function resizeOutsideSafeFrame() {
if (!window.top.postMessage) {
return false;
}
// get ID of your Ad unit <div> with this creative
var divGptAdId = '%%PATTERN:url%%';
if (divGptAdId.indexOf('#') !== -1) {
divGptAdId = divGptAdId.split('#')[1];
} else {
divGptAdId = window.location.hash;
}
if(!divGptAdId) {
if (window.name.indexOf('#') !== -1) {
divGptAdId = window.name.split('#')[1];
}
}
if(!divGptAdId) {
return;
}
// set with to fullwidth, and height to height of container inside creative
var width = '100%';
var height = container.offsetHeight + 'px';
// send our request to website
window.top.postMessage({
cmd: 'setStyle',
id: divGptAdId,
query: 'div, iframe', // we want to target child div and iframe and don't change container styles
params: {
display: 'block',
height: height,
width: width
}
}, '*');
}
document.onreadystatechange = function () {
// resize iframe when all is loaded
if (document.readyState == "complete") {
resizeOutsideSafeFrame();
}
};
// first resize must occur little bit later
setTimeout(resizeOutsideSafeFrame, 100);
</script>
就是这样。当您想从 iframe 内部更改您网站上的任何内容时,您可以在您的网站并从 iframe 内部调用此命令。
编辑 1:现在才注意到,var divGptAdId = '%%PATTERN:url%%;
不会以#hash的方式返回页面上div的正确id,所以现在需要给他一个正确的容器div id更改:
if(!divGptAdId) {
return;
}
到
if(!divGptAdId) {
divGptAdId = 'div-gpt-ad-container-div-id-1';
}
关于javascript - Google DFP - 从内部调整 SafeFrame 自定义广告素材外部 Iframe 容器的大小(展开广告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46144151/
我已使用我称为帐户 A 的帐户在我们的网站上实现了 dfp 广告代码。 我们与帐户 B 签订了契约(Contract),在我们网站上的几个展示位置上转换 100% 填充的广告。 广告网络 B 为我们提
我正在尝试了解如何将我的 DFP 广告添加到我的即时文章中。有没有人有任何经验?Facebook 提到这是可能的,但我在 DFP 或其他任何地方都看不到任何关于它的文档 最佳答案 根据他们的文档,有两
好像这个问题以前有人问过,没有答案。我正在尝试使用 Google Dfp 和 SafeFrame API 实现重叠式广告。我让 Google 控制台报告广告正在 SafeFrame 中提供,但没有检索
尝试弄清楚如何在不刷新整个页面或对页面上的所有广告调用 refresh() 的情况下为 DFP 生成新的相关因子值。网站的某个部分,页面的某些部分通过 AJAX 刷新而不是完全重新加载页面,但我们希望
我正在使用 Google DFP 中的一些新功能,但无法单独添加一个来刷新。我可以刷新页面上的所有广告,但我不能只刷新一个广告。 我一直在尝试以下代码来获得一个添加刷新而没有运气: var sl
我今天添加了 DFP 提供的代码,但在所有代码上出现以下错误。 getName on googletag.Slot is deprecated and will be removed. Use get
我希望就我们作为 DFP 广告管理系统标准版客户最近面临的一个问题寻求澄清。 我们有一个包含 2 个广告单元和 1 个广告素材的订单项。我们试图在同一页面上呈现两个单元。使用以下设置,第一个单元将显示
我是 dfp 代码的新手。我想要实现的是获取特定广告单元的关联订单项的所有事件广告素材。 到目前为止我做了什么: a) Chrome 扩展程序 Google 发布商工具栏:获取当前广告素材。无法帮助我
我正在使用 DFP 在网页上展示广告。有什么方法可以按名称引用特定的广告位?例如googletag.getSlotByName('abc')我的意图是刷新特定广告位中的广告。 最佳答案 是的。 pub
我正在测试我公司通过 DFP 运行的广告代码,并且在我们的一些发布商想要实现的页外流程方面遇到了一些问题。我一切正常,但我想知道我是否配置错误,因为有些事情对我来说没有意义。这是我目前的设置: 我创建
我需要在 DFP 广告管理系统完成页面上所有广告的渲染之后(或者至少在触发 collapseEmptyDivs(隐藏包含以下内容的广告单元)时)触发一些 JavaScript无订单项)。 有人知道如何
我们通常将广告转换到谷歌 DFP 广告管理系统,我们只是将第三方脚本作为创意,上传它,一切正常。这个特殊问题发生在返回 3 种不同尺寸广告的新第三方创意中。 我有一个位置可以放置 320x50 的移动
我有 Google DFP 提供的以下标准代码。不幸的是,它被列为解析器阻塞的跨源脚本,因为它是使用 document.write 实现的 (function() { var useSSL
我需要有关 Google DFP 集成的帮助。 我正在使用 The Google Media Framework player ,我正在尝试制作一个应该向我展示中置视频的广告系列 (Google DF
我有一个包含 dfp 广告的单页网络应用程序。我有两个我正在触发的 dfp adunits,它们位于内容之间,内容是特定类别的文章列表。 当我点击另一个类别时,它只会加载不同类别的文章(不会更改地址栏
我确定之前有人问过这个问题并回答过,但我无法找到答案,所以我再次提问。 我正在尝试实现 Google DFP。我能够动态创建转换广告的内联 javascript,因此我知道管理端应该正确配置。 虽然我
我想隐藏基于 google DFP 广告的容器是否未加载。未加载广告时,Iframe 主体为空白,如下所示。 _0__hidden__" name="google_ads_iframe_/100912
我想知道如何在 DFP 中为不同的浏览器宽度/屏幕分辨率创建不同的广告/创意尺寸。我找到了这篇关于这个问题的 DFP 文章,但它是专门针对移动用户的,他们没有给出任何代码,而只是一种方法。这是文章:
我正尝试在加载我的一个 DFP 广告时触发一个事件。广告加载在 iframe 中,因此我一直在尝试在 iframe 加载时触发事件,但它似乎只在某些时候有效,而不是每次都有效,因此并不可靠。我什至尝试
我正在加载 Google DFP 背景皮肤广告单元。我已经正确显示了它,但是一旦网络浏览器缩小到比图像宽度本身更小的宽度,我就无法让背景图像保持居中。相反,图像会固定在浏览器的左侧并从右向左折叠,导致
我是一名优秀的程序员,十分优秀!