7

我正在绘制ASP.NET Web应用程序中的图形。在IE9和其他浏览器中,我使用SVG来完成它,并且它工作得很好。在IE8及以下版本中,我使用VML。我发现当IE8标准模式下(不使用兼容性视图)IE8不显示VML。IE9,IE8,SVG,VML和doctypes

我的文档类型设置为<!DOCTYPE html>。如果我将文档类型完全删除,IE8进入怪癖模式并且工作正常,但是IE9然后去其怪癖模式(而不是IE9标准)并且不显示SVG。

这是发生在测试页面上,所以除了包含包含<svg>元素及其子元素或VML元素的div的表单之外,没有任何内容。

这是怎么回事?似乎我不应该为不同的浏览器更改文档类型,并且Stack Exchange用户页面上的信誉图似乎以相同的方式工作(针对IE8及更低版本的VML,针对其他人的SVG,HTML5文档类型)...

+0

你有没有想过在doctype上使用条件语句? '<! - [if IE 8]><!doctype ...>'我知道这不是你的问题,但它可能是一个替代解决方案。 – Eruant

回答

3

要声明在IE8标准模式的VML命名空间,则需要包括第三'#default#VML' argument

document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); 

other changes到VML在IE8中,你可能需要知道的。

+0

我实际上在底部使用他的建议强制IE7标准模式,使一切工作。如果是IE8,那么'Response.AppendHeader(“X-UA-Compatible”,“IE = EmulateIE7”);' –

5

有一对夫妇更多的事情,你需要检查:需要修改

选择的行为规则。

  • 当设置元素的尺寸或位置时,单位不会默认为px。它必须明确规定工作。
  • 不能在DOM之外创建一个VML元素:

var vmlFrag = document.createDocumentFragment(); 
vmlFrag.insertAdjacentHTML('beforeEnd', 
'<v:rect id="aRect" fillcolor="red"   
style="top:15px;left:20px;width:50px;height:30px;position:absolute;"></v:rect>' 
); 
document.body.appendChild(vmlFrag); 
  • 的rect元素将不会被显示出来!你不能修改它的CSS,因为你可能只会崩溃浏览器。但是,它有一个修复。将元素的外部HTML复制到自身中:

var aRect = document.getElementById('aRect'); 
aRect.outerHTML = aRect.outerHTML; 
1

HighCharts源代码给出了一个解决方案。除了在运行时添加的命名空间,你也有添加特定CSS行为:

<!--[if lte IE 8 ]> 
<script type="text/javascript"> 
    document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml'); 
    document.createStyleSheet().cssText = 
     'vml\\:fill, vml\\:path, vml\\:shape, vml\\:stroke' + 
     '{ behavior:url(#default#VML); display: inline-block; } '; 
</script> 
<![endif]--> 

之后,创建的元素JS会在页面上可见。 Watch the demo

+0

谢谢你的解决方案对我有用。 – SivaRajini