修复了在IE中定位广告的问题

时间:2011-09-26 17:56:34

标签: javascript internet-explorer css

可以跳到修改以获取更新的说明。

我似乎无法将通过document.write()写出的广告设置为固定位置。除了IE之外,它在所有其他浏览器中都能正常工作,包括IE9。

以下是一个示例:http://htinteractive.com/bottom_bar/demo.html

任何建议都将受到高度赞赏。我的想法已经不多了。

谢谢。

修改

我已将问题缩小到以下我遇到的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>

无论如何,我真的需要第二种方法来工作,而我正试图弄清楚如何。

感谢。

7 个答案:

答案 0 :(得分:2)

也许IE在编写脚本元素之前需要结束temp1 DIV:

<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>

编辑(回复您的评论):

由于您希望广告脚本进入div,因此您必须将document.write放在一边并以编程方式创建脚本,这样您只需调用appendChild将其放入div:< / p>

<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%确定在重新格式化脚本时没有输入错误,所有这些转义序列...

答案 1 :(得分:1)

未经测试,但似乎应该有效:

<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>

答案 2 :(得分:1)

看起来脚本标记没有像您期望的那样在广告中嵌入广告。 根据IE Developer工具,广告不在您的DIV中,因此无法获得定位。

使用您的示例代码将#temp1更改为A,即可将广告定位到您想要的位置。

问题在于您的广告没有收到广告。如果您可以选择让广告带回ID,那么您可以将自己的风格基于此,或者使用DOM操作将广告放在正确的位置。

更深层次的问题是,让广告脚本在DIV中呈现其内容我只是不确定。

更新

我认为IE的不同之处在于使用SCRIPT标签的方法。使用src属性从另一个位置加载脚本似乎会破坏节点树。

以下是一些证据:

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

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

在第一个示例中,您可以看到广告位于DIV内部,而第二个示例则位于DIV内部。在IE中可能有一些规则,即带有src属性的SCRIPT标签属于HEAD,所以它将它们放在你的DIV之外。

答案 3 :(得分:1)

检查您的HTML是否具有DTD格式

答案 4 :(得分:1)

此资源可能会有所帮助

http://ryanfait.com/resources/fixed-positioning-in-internet-explorer/

您还可以使用特定于浏览器的hacks,也可以指定其他文档:

<!--[if lte IE 9]>

答案 5 :(得分:1)

使用“src”属性编写脚本时,某些浏览器会在实际运行外部脚本之前解析以下内联代码。外部脚本的结果将写在div之外,因为内联代码会创建它,这对很多浏览器来说都是如此。

没有简单的方法可以解决这个问题,无论是将div放在html中还是放在外部脚本中。

答案 6 :(得分:1)

如果您将以下内容放在页面顶部会发生什么

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