在单个发布商页面上投放多个广告小部件
Serving multiple ad widgets on a single publisher page
我的主要问题是脚本 运行 在 DOM 加载之前,我无法使用 document.ready
事件。欲了解更多详情,请进一步阅读
我正在制作广告投放应用。我制作了一个小代码片段,将提供给发布商以添加到他们的网站上以加载我们的广告。样例如下:
<div class="my-widget" data-widgetId="1" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
HTML div 是通过其正下方的脚本显示广告的位置。
此脚本还包含验证在 div.
中添加和填充广告的方法
var adDiv = document.getElementsByClassName('my-widget')[0];
insertScriptWithSouce('http://myadserver.exp/serve.php?id=' + adDiv.dataset.widgetId);
function fillAds(htmlFromserver) {
adDiv.innerHTML = htmlFromServer;
}
This is only a example to understand the scenario
现在我的问题是,如果发布者在同一页面上添加多个小部件
该代码看起来像
<div class="my-widget" data-widgetId="1" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
<div class="my-widget" data-widgetId="2" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
没有自己的html
现在第二个小部件的广告被放置在第一个小部件的 div 中,而第二个小部件保持为空
我也尝试了很多循环 类 但是当每个脚本运行时它不知道它下面还有另一个小部件,因为它还没有加载到 DOM
Note: I can not use ids and jQuery as its forbidden by seniors
I also cant use document.ready
event as if document fails to load then my ads will not be served
没有多个脚本块,只有一个循环遍历页面上广告容器 div 的脚本引用。
function fillAd(htmlFromServer, widgetId) {
var adDivQuery = document.querySelectorAll('[data-widgetId="' + widgetId + '"]');
if (adDivQuery.length > 0) {
adDivQuery[0].innerHTML = htmlFromServer;
}
}
var adDivs = document.getElementsByClassName('my-widget');
for (var i=0, il=adDivs.length; i<il; i++) {
insertScriptWithSource('http://myadserver.exp/serve.php?id=' + adDivs[i].dataset.widgetId);
}
在这种情况下,由 insertScriptWithSource()
函数插入的脚本会将第二个参数传递给您的 fillAd()
函数,其中包含最初传递给它的小部件 ID。
没有找到解决方案,但仍然找到了最佳解决方案,所以我认为它可能对其他人有所帮助
这个javascript可以用来解决
var adDiv = document.querySelectorAll('my-widget:not([id])');
adDiv = adDiv[0];
adDiv.id = 'my-id' + (Math.random() * 100).toFixed(0);
insertScriptWithSouce('http://myadserver.exp/serve.php?id=' + adDiv.dataset.widgetId + '&origId=' + adDiv.id);
function fillAds(htmlFromserver, idSentFromHere) {
adDiv = document.getElementById(idSentFromHere);
adDiv.innerHTML = htmlFromServer;
}
我的主要问题是脚本 运行 在 DOM 加载之前,我无法使用 document.ready
事件。欲了解更多详情,请进一步阅读
我正在制作广告投放应用。我制作了一个小代码片段,将提供给发布商以添加到他们的网站上以加载我们的广告。样例如下:
<div class="my-widget" data-widgetId="1" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
HTML div 是通过其正下方的脚本显示广告的位置。 此脚本还包含验证在 div.
中添加和填充广告的方法var adDiv = document.getElementsByClassName('my-widget')[0];
insertScriptWithSouce('http://myadserver.exp/serve.php?id=' + adDiv.dataset.widgetId);
function fillAds(htmlFromserver) {
adDiv.innerHTML = htmlFromServer;
}
This is only a example to understand the scenario
现在我的问题是,如果发布者在同一页面上添加多个小部件
该代码看起来像
<div class="my-widget" data-widgetId="1" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
<div class="my-widget" data-widgetId="2" data-page-url="http://foo.bar/" ></div>
<script src="http://myadserver.exp/js/widget.js"></script>
没有自己的html
现在第二个小部件的广告被放置在第一个小部件的 div 中,而第二个小部件保持为空
我也尝试了很多循环 类 但是当每个脚本运行时它不知道它下面还有另一个小部件,因为它还没有加载到 DOM
Note: I can not use ids and jQuery as its forbidden by seniors I also cant use
document.ready
event as if document fails to load then my ads will not be served
没有多个脚本块,只有一个循环遍历页面上广告容器 div 的脚本引用。
function fillAd(htmlFromServer, widgetId) {
var adDivQuery = document.querySelectorAll('[data-widgetId="' + widgetId + '"]');
if (adDivQuery.length > 0) {
adDivQuery[0].innerHTML = htmlFromServer;
}
}
var adDivs = document.getElementsByClassName('my-widget');
for (var i=0, il=adDivs.length; i<il; i++) {
insertScriptWithSource('http://myadserver.exp/serve.php?id=' + adDivs[i].dataset.widgetId);
}
在这种情况下,由 insertScriptWithSource()
函数插入的脚本会将第二个参数传递给您的 fillAd()
函数,其中包含最初传递给它的小部件 ID。
没有找到解决方案,但仍然找到了最佳解决方案,所以我认为它可能对其他人有所帮助
这个javascript可以用来解决
var adDiv = document.querySelectorAll('my-widget:not([id])');
adDiv = adDiv[0];
adDiv.id = 'my-id' + (Math.random() * 100).toFixed(0);
insertScriptWithSouce('http://myadserver.exp/serve.php?id=' + adDiv.dataset.widgetId + '&origId=' + adDiv.id);
function fillAds(htmlFromserver, idSentFromHere) {
adDiv = document.getElementById(idSentFromHere);
adDiv.innerHTML = htmlFromServer;
}