有谁知道如何将 Google Adsense 广告放入 GWT 网络应用程序中?
8 回答
短版,您不能通过 Ajax 使用 Adsense 而不违反计划政策/t&c
长版...
通过 xmlhttp 调用传递的广告代码不会呈现,它只是被视为文本(因此,responseText)。执行js代码的唯一方法是使用“responseXML”加上“exec()”命令。
例如...
如果您的 xml 包含以下内容:
这是来自外部文件的内容 javascript 代码在这里
您将使用 ajax_obj.responseXML 分配一个变量(例如称为 page_data),通过解析器运行 XML 并运行
exec(此处来自 XML 的 js 变量或行);
从 Adsense 的角度来看并没有真正的帮助,但它就是这样做的。
还值得一提的是为什么我抛弃了 GWT:
另一个问题是我的 AdSense 横幅。由于页面上的内容不多,因此横幅有时会偏离主题。一个更大的问题是,当人们搜索不同的关键字时,横幅保持不变(因为 ajax 刷新不会触发 adsense 刷新)。我通过使用页面刷新而不是 ajax 调用进行搜索来解决这个问题。该网站的 ajax 部分仅限于排序、分面、i18n 和显示提示。
您可以将来自 Adsense 的 javascript 代码放在 GWT 开头的单个 HTML 页面中。这样广告就不会显示在与 GTW 相同的区域,而是显示在 GWT 代码的上方/下方。对于广告,可能还可以。
这个例子在应用程序上方放置了一个baner:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>www.javaoracleblog.com</title>
<script type="text/javascript" language="javascript" src="com.javaoracleblog.aggregator.nocache.js"></script>
</head>
<body>
<script type="text/javascript"..
ADsense code here
</script>
<!-- OPTIONAL: include this if you want history support -->
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
</body>
</html>
为了向 Google WT 表明可以信任 Google adsense 的站点,您需要将正则表达式匹配 URL 添加到 -whitelist 命令行参数。
请注意,这可能无法解决上述“我为什么抛弃 GWT”文章中描述的问题。
你可以看看我对 InfoQ的采访。它包括我书中的一个示例章节,它恰好是关于 SEO 的。
这不是微不足道的,但我认为本章中的解决方案让 GWT 在 SEO 很重要的环境中很好地工作。基本的解决方案是实现我称之为“引导”的东西。这意味着您的页面获取通常会在 GWT-RPC 请求中遇到的信息并将它们序列化到页面中。然后,GWT 小部件在没有 RPC 请求的情况下加载此信息。当您的页面将信息序列化为 JavaScript 时,也很容易将 <noscript> 写入可用于 SEO 的页面。
请查看此处包含的 PDF:InfoQ GWT,其中包含所有细节。整个示例项目在这里:google code with source on github。
如果您真的希望 AdSense 有点“内部”GWT,我会使用 Frame 小部件。基本上,Frame 小部件会在您的 GWT 代码中生成一个 <iframe ...>。首先,我认为 iframe,呃!但是 <iframe> 标记仍然是HTML5 规范的一部分,甚至已经被一些似乎正是为了这个“沙盒”目的而存在的属性扩展了。并且使用相应的 CSS 样式,您的 <iframe> 周围不会有任何滚动条。
这是实际的解决方案:
你应该把
<ui:style>
.sponsor {
border: 0em;
width: 20em;
height: 6em;
float: right;
display: inline;
}
</ui:style>
<g:HTMLPanel>
<g:Frame ui:field="sponsor" url="issue/extern/Google-AdSense.html" styleName="{style.sponsor}"/>
</g:HTMLPanel>
@UiField
Frame sponsor;
此外,您应该将实际的 Google AdSense 代码(<script> 内容)放入 GWT 公用文件夹内的单独 HTML 文件中,在本例中,该文件称为Google-AdSense.html,位于公用文件夹内的extern文件夹内。在这种情况下,问题(在 Frame url属性中)是 GWT 输出文件夹。
它的外观如下:右上角的广告。
顺便说一句,这也是将 Google Analytics 代码嵌入 GWT 的方式。
这是我的做法。我在这里有一个演示和源代码:http ://code.google.com/p/gwt-examples/wiki/DemoGwtAdsene
如果您在创建主机页面时要小心,您可以同时使用 AdSense 和 GWT,而无需使用框架或其他技巧。
关键是将您的 AdSense 代码包含在主机页面中,然后操作包含广告的 dom 元素,但不要将其与页面分离。因此,只要不更改 dom 结构,您就可以将广告重新定位到其他 gwt 代码的正文中。
如果您确实分离并重新附加包含的 dom 元素,那么它似乎可以在 Chrome 和 Firefox 中工作,但 IE 将显示一个空白区域。我最初尝试将广告 DIV 元素移动到 DockLayoutPanel 中,并认为一切都很好,直到我在 IE 中进行了迟到的测试。
所以这没关系:
Element element = Document.get().getElmentById("ad");
element.getStyle().setPosition(ABSOLUTE);
element.getStyle().setTop(20, PX);
但这不是:
myPanel.add(ElementWrapper.wrap(element));
因为将一个小部件添加到另一个小部件会重新成为它的父级。
这意味着您不能使用任何内置的 LayoutPanel 内容来保存您的广告 div,因为 Layout 无法包装现有元素(它在其构造函数中创建自己的 DIV)。您也许可以修改布局面板的内容,以便它包装一个元素并且不会重新设置它的父级......但我还没有尝试过。
我已经在 IE6+、Chrome 和 Firefox 中测试了结果。缺点是除非您加载新页面,否则您无法刷新广告。但在我的例子中,GWT 被用来增强 html 页面,所以这不是问题。无论如何...用户是否更有可能点击不同的广告而不是他们多次阅读的广告?不确定它是否如此重要。
我可以使用 DFP Small Business + Async Publisher tag + AdSense 集成来做到这一点:
这是代码:
在您的主机页面上,放置您的发布商标签,例如:
<head>
<script type="text/javascript" src="http://www.googletagservices.com/tag/js/gpt.js"></script>
<script type="text/javascript">
var slot1 = googletag.defineUnit('/XXXX/ca-pub-YYYYYYYYYYYYYYY/transaction', [468, 60], 'div-gpt-ad-ZZZZZZZ-0').addService(googletag.pubads());
googletag.pubads().enableSingleRequest();
googletag.enableServices();
</script>
...
</head>
我用 uiBinder 创建了一个视图,其中一个 div 的头部指定了 id,如下所示:
<g:HTMLPanel height="62px" width="100%">
<div id='div-gpt-ad-ZZZZZZZ-0' style='width:470px; height:60px;'>
</div>
</g:HTMLPanel>
在视图的 onLoad() 方法中,初始化广告,如下所示:
@Override
protected void onLoad() {
setupAd();
}
public static native void setupAd() /*-{
$wnd.googletag.cmd.push(function() {$wnd.googletag.display('div-gpt-ad-ZZZZZZZ-0')});
}-*/;
要刷新广告,只需为 head 指定的插槽调用刷新广告:
public static native void refreshAd() /*-{
$wnd.googletag.pubads().refresh([$wnd.slot1]);
}-*/;
就这样!
有关发布商代码的详细信息,请查看: http: //support.google.com/dfp_sb/bin/answer.py ?hl=en&answer=1649768
现在我正在努力了解如何让 AdSense 机器人抓取我的 ajax 应用程序。我已经实现了 Ajax Crawling 方案:
https://developers.google.com/webmasters/ajax-crawling/docs/getting-started
但我从 AdSense 论坛获得的信息表明,AdSense 机器人(Mediapartners-Google)不适用于“转义片段”Ajax 方案。有人知道谷歌是否计划在这方面取得任何进展吗?
这将这种方法限制为仅提供基于兴趣的广告,因为基于上下文的广告服务依赖于 ajax 抓取方案。
Google 的 AdSense 机器人会抓取您的网页以确定要投放的广告。因此,您不应该将 AdSense 放置在主要包含动态内容的网页上。它不会很好地工作。
也许您应该研究其他广告程序?