2011-09-26 55 views
11

可跳至编辑以获取更新的说明。在IE中固定定位广告

我似乎无法设置通过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> 

不管怎么说,我真的需要第二个方法上班,我拉我的头发试图找出如何。

谢谢。

+1

IE9之前的IE不支持'位置:fixed'可言。你必须用JavaScript解决方案来伪装它。 – Pointy

+2

这很奇怪......它一直工作良好,一直到IE 7对我来说......?我的真正问题似乎是通过document.write将对象写入具有固定位置的元素。 – Serhiy

+0

真的吗?当然,我可能会错,尽管我几乎可以肯定它没有(没有)在IE6中工作。我会在一秒内尝试7,因为如果它确实工作肯定会很整洁:-) – Pointy

回答

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

嗯......试试这个,但是,不断得到el.parentNode是未定义的......将其包装在几个divs以防万一,但同样的问题 – Serhiy

+0

修复了这个问题... el = document.getElementById('random'),但是没有定位固定元素的主要问题仍然存在...... – Serhiy

1

它看起来像脚本标签不嵌入你的DIV中的广告,你会期望。 根据IE开发人员工具,广告不在您的DIV中,因此无法获得定位。

使用您的示例代码将#temp1更改为A将您的广告放置在您想要的位置。

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

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

更新:

相信的差异IE是使用脚本标签的方法。使用src属性从另一个位置加载脚本看起来会破坏节点树。

这里的一些证据:

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

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

在第一个例子中,你可以看到,广告是DIV的内部,而在第二个它是下面。在IE中可能有一些规则说明带有src属性的SCRIPT标签属于HEAD,因此它将它们放在DIV之外。

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

<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%肯定我没有做一些打字错误而重新格式化剧本,与所有那些逃脱序列...

+0

这是它默认显示的行为。尽管我希望它不会。我想要把那个脚本写在temp1 div里面。 – Serhiy

+1

如果你使用appendChild,你就不能再使用document.write了,而广告通常会使用它 – Madd0g

1

检查,看看你的HTML有DTD格式

1

在编写具有“src”属性的脚本时,一些浏览器在实际运行外部脚本之前解析以下内联代码。外部脚本的结果将被写入div之外,因为内联代码会创建它,这在许多浏览器中都是如此。

没有简单的方法来解决这个问题,要么把div放在html中,要么放在外部脚本中。

1

,如果你把你的页面的顶部下面会发生什么

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