在 JavaScript 中使用 XMLSerializer 和 IE 时,SVG 标记上不需要的命名空间
Unwanted namespaces on SVG markup when using XMLSerializer in JavaScript with IE
我正在尝试使用JavaScript DOM API的XMLSerializer将SVG元素转换为其代表性标记。
这是用于创建元素并对其进行序列化的基本代码:
var el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
el.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
el.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
var markup = (new XMLSerializer()).serializeToString(el);
console.log(markup);
在Chrome,Firefox,Safari和Opera中,它可以产生我想要的东西:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
但是在Internet Explorer 9到IE11中,我得到这个:
<svg xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xml:NS1="" NS1:xmlns:xlink="http://www.w3.org/1999/xlink" />
IE的输出有两个问题:
- 存在重复的
xmlns
属性。如果我省略JavaScript的第二行,那么在IE中,标记中只有一个xmlns
属性,但在Firefox,Chrome,Safari和Opera中,该属性丢失了。 - 它增加了
xml:NS1=""
.这是为什么呢? 然后,NS1:
前缀为xmlns:xlink
属性。
我认为我正在以正确的方式创建属性。例如,在这里使用 setAttribute
而不是 setAttributeNS
是正确的(更多信息),更改此设置似乎并不能解决问题。
任何见解都值得赞赏。
编辑:一个相关问题讨论了Chrome序列化中的一个错误,该错误导致省略命名空间。与第一个问题部分相关(尽管所有其他浏览器的行为相同),但与第二个问题无关。
好的,我想我已经解决了。跟随从这篇文章到这个 WebKit 错误报告和这个测试用例的线索。
如果我将脚本更改为此脚本,那么它可以工作:
var el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
el.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.w3.org/2000/svg');
el.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink');
var markup = (new XMLSerializer()).serializeToString(el);
console.log(markup);
啊命名空间。
但是,它在Safari 6.05和PhantomJS中仍然存在的旧版本的WebKit中失败(错误报告 - 现已修复)。据推测,该修复程序已合并到最新的Safari更新中(我尚未检查)。
相关文章:
- 如何在不需要单击按钮的情况下获取选项的值
- Javascript不需要的关闭行为
- 删除客户端浏览器上不需要的内容
- 不允许在字段中输入不需要的字符
- 不需要的JSON响应
- 如何使图像适合TD,而不需要包装在不同的屏幕分辨率上
- 使用一个Javascript函数提交多个表单可以在FF中工作,而不需要其他浏览器
- jQuery自动完成显示不需要的动态html标记
- 在Knockout js中创建一个包含多行的表,而不需要推送
- AngularJs正在解码HTML字符(不需要)
- jQuery regex从文本链接-添加不需要的域到链接
- 防止从浏览器到应用商店的不需要的重定向
- 外部解析RSS提要,不需要像谷歌和服务器端那样的任何库
- 不需要的异步事件调度
- 是否有任何不需要后端的验证码角度指令
- Ajax 请求给出不需要的响应
- Jquery/javascript:加载页面时不需要的重复函数
- 为什么Java代码需要编译,而JavaScript代码不需要
- 在 JavaScript 中使用 XMLSerializer 和 IE 时,SVG 标记上不需要的命名空间
- 不需要的SVGAnimatedString与SVG元素一起创建