Страница замены динамического рекламного кода - PullRequest
2 голосов
/ 27 сентября 2010

У меня есть приложение, которое использует провайдера мобильной рекламы; поставщик услуг работает так, что я делаю запрос на стороне сервера, поставщик возвращает мне наценку, и я включаю ее на своем сайте.

Чтобы ускорить загрузку страницы (это требование, которое я не контролирую), у меня есть AJAX-вызов на мой сервер, который затем выполняет вызов на стороне сервера, возвращает разметку, и я включаю разметку на моем мобильном телефоне.

Большую часть времени я получаю разметку <img> или что-то подобное.

Однако, когда я получаю разметку объявления с <script>, которая динамически совершает другой вызов для получения объявления, разметка, полученная от динамически загруженного <script>, заканчивается заменой всего представления; оставив со мной только объявление.

Я пробовал несколько вещей вокруг этого, но пока не увенчался успехом. Могу ли я что-нибудь сделать, чтобы динамически полученная разметка не заменяла все содержимое страницы?

Ответы [ 3 ]

2 голосов
/ 02 октября 2010

Проблема, вероятно, в том, что в объявлении используется document.write.

document.write безрассудно зависит по срокам. Если document.write называется перед событием 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;

Здесь вы можете увидеть небольшую демоверсию .

0 голосов
/ 30 сентября 2010

ajax ('POST', 'http://mobileAdProvider/',requestPayload,function(){insertHtmlAndScript("someDivID");});

ИЛИ

ajax (' GET ',' http://mobileAdProvider/queryString','',function(){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)");
            }
        }
    }
//=============================================================================
0 голосов
/ 29 сентября 2010

Простое решение - поместить объявление в DIV или IFRAME (безобразно).

Реальное решение - поменяйте рекламную систему или заключите с ними сделку, чтобы расширить API. Противные вещи, которые вы делаете, обойдутся вам в долгосрочную поддержку, независимо от того, насколько легко было интегрироваться таким образом.

Если мобильная система AD делает такие вещи - у них должно быть мало представления о разработке для мобильных устройств с ограниченными ресурсами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...