我有一个使用移动广告提供商的应用程序;广告提供商的工作方式是我在服务器端发出请求,提供商返回标记,我将其包含在我的网站上。
为了使加载页面更快(这是我无法控制的要求),我对我的服务器进行了AJAX调用,然后调用服务器端,返回标记并包含标记在我的移动视图上。
大多数情况下,我收到的标记是<img>
或类似的东西。
但是,当我收到<script>
广告标记,动态拨打另一个广告来接收广告时,我从动态加载的<script>
收到的标记最终会替换整个视图;和我一起留下广告。
我已经尝试过一些事情但到目前为止还没有成功。我能做些什么来确保动态接收的标记最终不会替换整个页面内容吗?
答案 0 :(得分:2)
问题可能是广告使用document.write
作为输出。
document.write 是鲁莽依赖的 在时间上。如果调用document.write 在onload事件之前,它附加或 将文本插入页面。如果是 在onload之后称为,它完全是 替换页面,破坏了什么 来过之前。 - crockford.com
您可以做的是临时覆盖 document.write方法。它很简单:
// overwrite document.write with a custom function
var old = document.write;
document.write = function ( html ) {
document.getElementById("target").innerHTML += html;
};
// ad code goes here, calling
// our document.write sandbox
document.write("<div> advertisement </div>");
// restore standard document.write
document.write = old;
您可以看到一点 demo here 。
答案 1 :(得分:0)
简单的解决方案 - 将广告放入DIV或IFRAME(丑陋的方式)。
真正的解决方案 - 更改广告系统或与他们达成协议以扩展API。你做的讨厌的事情将花费你很多长期支持,无论以这种方式集成是多么容易。
如果移动广告系统做这样的事情 - 他们必须对有限资源的移动设备的开发知之甚少。
答案 2 :(得分:0)
AJAX( 'POST',的 'http:// mobileAdProvider /',requestPayload,函数(){insertHtmlAndScript( “someDivID”);});
OR
AJAX( 'GET',的 'http:// mobileAdProvider /的queryString', '',函数(){insertHtmlAndScript( “someDivID”);});
//=============================================================================
function injectJavascript(src)
{
var scripts = document.getElementById("scripts");
var javascriptSrc = document.createElement("script");
javascriptSrc.setAttribute("type", "text/javascript");
javascriptSrc.setAttribute("language", "JavaScript1.2");
javascriptSrc.innerHTML = src;
scripts.appendChild(javascriptSrc);
}
//=============================================================================
function insertHtmlAndScript(target)
{
if (req.readyState == 4) // 4 == "loaded"
{
if (req.status == 200) // 200 == "Ok"
{
var resp = req.responseText.split("^"); // delimiter for html and script
div = document.getElementById(target);
div.innerHTML = resp[0];
injectJavascript(resp[1]);
}
else
{
alert("Could not retreive URL:\n" + req.status + "\n" + req.statusText);
}
}
}
//=============================================================================
function ajax(method,url,payload,action)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else
{
alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
}
}
}
//=============================================================================