Исправлено размещение рекламы в IE

Может перейти к редактированию для более подробного объяснения.

Я не могу настроить объявление, которое выписывается через document.write() в фиксированную позицию. Он отлично работает во всех других браузерах, кроме IE, и включает IE9.

Вот пример: http://htinteractive.com/bottom_bar/demo.html

Любые предложения будут высоко оценены. У меня заканчиваются идеи.

Спасибо.

Edit:

Я сузил проблему до следующей проблемы IE, которую я имею. Чтобы упростить его...

<style type="text/css">
    #temp1
    {
        position:fixed; 
        bottom:0; 
        height:100px; 
        width:100px; 
        border:solid 2px red;
    }
</style>

<!--WORKS IN IE-->
<div id="temp1">
    <script type="text/javascript">
        document.write("<scr" + "ipt type=\"text/javascript\">\nif(typeof(cachebuster) == \"undefined\"){var cachebuster = Math.floor(Math.random()*10000000000)}\nif(typeof(dcopt) == \"undefined\"){var dcopt = \"dcopt=ist;\"} else {var dcopt = \"\"}\nif(typeof(tile) == \"undefined\"){var tile = 1} else {tile++}\ndocument.write('<scr'+'ipt src=\"http://ad.doubleclick.net/adj/shz.bloomington/home;pos=728x90_1;' + dcopt + ';tile=' + tile + ';sz=728x90;ord=' + cachebuster + '?\"></scr'+'ipt>');\n</scr" + "ipt>");
    </script>
</div>


<!--FAILS TO FIX POSITION IN IE-->
<script type="text/javascript">
    document.write('<div id="temp1">');
    document.write("<scr" + "ipt type=\"text/javascript\">\nif(typeof(cachebuster) == \"undefined\"){var cachebuster = Math.floor(Math.random()*10000000000)}\nif(typeof(dcopt) == \"undefined\"){var dcopt = \"dcopt=ist;\"} else {var dcopt = \"\"}\nif(typeof(tile) == \"undefined\"){var tile = 1} else {tile++}\ndocument.write('<scr'+'ipt src=\"http://ad.doubleclick.net/adj/shz.bloomington/home;pos=728x90_1;' + dcopt + ';tile=' + tile + ';sz=728x90;ord=' + cachebuster + '?\"></scr'+'ipt>');\n</scr" + "ipt>");
    document.write('</div>')
</script>

В любом случае мне действительно нужен второй метод, и я вытягиваю свои волосы, пытаясь понять, как это сделать.

Спасибо.

Ответ 1

Возможно, IE нуждается в завершении temp1 DIV перед записью элемента script:

<script type="text/javascript">
    document.write('<div id="temp1"><' + '/div>');
    document.write("<scr" + "ipt type=\"text/javascript\">\nif(typeof(cachebuster) == \"undefined\"){var cachebuster = Math.floor(Math.random()*10000000000)}\nif(typeof(dcopt) == \"undefined\"){var dcopt = \"dcopt=ist;\"} else {var dcopt = \"\"}\nif(typeof(tile) == \"undefined\"){var tile = 1} else {tile++}\ndocument.write('<scr'+'ipt src=\"http://ad.doubleclick.net/adj/shz.bloomington/home;pos=728x90_1;' + dcopt + ';tile=' + tile + ';sz=728x90;ord=' + cachebuster + '?\"></scr'+'ipt>');\n</scr" + "ipt>");
</script>

EDIT (в ответ на ваш комментарий):

Поскольку вы хотите, чтобы объявление script проходило внутри div, вам нужно будет отложить document.write в сторону и создать программный код script, поэтому вы можете просто вызвать appendChild, чтобы поместить его в div:

<script type="text/javascript">
    document.write('<div id="temp1"><' + '/div>');
    if(typeof(cachebuster) == "undefined") {
        var cachebuster = Math.floor(Math.random() * 10000000000);
    }
    if(typeof(dcopt) == "undefined") {
        var dcopt = "dcopt=ist;";
    } else {
        var dcopt = "";
    }
    if(typeof(tile) == "undefined") {
        var tile = 1;
    } else {
        tile++;
    }    
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "http://ad.doubleclick.net/adj/shz.bloomington/home;pos=728x90_1;"
        + dcopt 
        + ";tile=" + tile
        + ";sz=728x90;ord=" + cachebuster + "?";
    divTemp.appendChild(script);
</script>

Обратите внимание, что я не могу быть на 100% уверен, что не сделал опечатки при переформатировании script со всеми этими экранированными последовательностями...

Ответ 2

Не тестировалось, но похоже, что он должен работать:

<script>
(function(){
  var w = window,
    d = document,
    s = d.createElement('script'),
    div = d.createElement('div'),
    el = [].slice.call(d.getElementsByTagName('script'), -1),
    baseUrl = 'http://ad.doubleclick.net/adj/shz.bloomington/home;pos=728x90_1;';
  // end var block

  if(!("cachebuster" in w)){
    cachebuster = Math.floor(Math.random()*10000000000);
  }
  dcopt = "dcopt" in w ? "" : "dcopt=ist;";
  tile = "tile" in w ? tile+1 : 1;

  div.id = 'temp1';
  div.appendChild(s);
  el.parentNode.inserBefore(div, el);
  s.src = baseUrl + dcopt + ';tile=' + tile + ';sz=728x90;ord=' + cachebuster + '?';

})();
</script>

Ответ 3

Похоже, что теги script не вставляют объявление внутри вашего DIV, как вы ожидали. Согласно инструментам IE Developer, объявление находится за пределами вашего DIV и поэтому не получает позиционирования.

Используя ваш пример кода, изменяющего # temp1, только A позиционирует ваше объявление там, где вы хотите.

Проблема заключается только в том, что ваше объявление не получает стиль. Если у вас есть возможность вернуть свое объявление с идентификатором, тогда вы, вероятно, можете основывать свой стиль на этом или, альтернативно, использовать DOM-манипуляцию, чтобы получить свое объявление в нужном месте.

Более глубокая проблема, получив объявление script, чтобы отобразить его содержимое внутри вашего DIV. Я просто не уверен.

Update:

Я считаю, что разница в IE - это метод использования тега script. Использование атрибута src для загрузки script из другого места, похоже, разбивает дерево node.

Вот некоторые доказательства:

http://jsfiddle.net/wuqVw/1/

http://jsfiddle.net/wuqVw/2/

В первом примере вы можете видеть, что объявление находится внутри DIV, а во втором - ниже. Вероятно, в IE есть правило, в котором говорится, что теги script с атрибутами src принадлежат HEAD, поэтому они помещают их вне вашего DIV.

Ответ 4

проверьте, имеет ли ваш HTML формат DTD

Ответ 6

При записи script с атрибутом "src" некоторые браузеры анализируют следующий встроенный код перед фактическим запуском внешнего script. Результат внешнего script будет записан за пределами div, потому что встроенный код создает его, это было верно для многих браузеров некоторое время назад.

Нет простого способа преодолеть это, либо поместить div в html, либо во внешний script.

Ответ 7

Что произойдет, если вы добавите следующее поверх страницы

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">