动态广告代码替换页面

时间:2010-09-27 03:34:18

标签: javascript ajax javascript-events jquery

我有一个使用移动广告提供商的应用程序;广告提供商的工作方式是我在服务器端发出请求,提供商返回标记,我将其包含在我的网站上。

为了使加载页面更快(这是我无法控制的要求),我对我的服务器进行了AJAX调用,然后调用服务器端,返回标记并包含标记在我的移动视图上。

大多数情况下,我收到的标记是<img>或类似的东西。

但是,当我收到<script>广告标记,动态拨打另一个广告来接收广告时,我从动态加载的<script>收到的标记最终会替换整个视图;和我一起留下广告。

我已经尝试过一些事情但到目前为止还没有成功。我能做些什么来确保动态接收的标记最终不会替换整个页面内容吗?

3 个答案:

答案 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)");
            }
        }
    }
//=============================================================================