为什么jQuery自动降低套管属性值?

我正在使用直接放入HTML文件的SVG

 Contents...  

使用javascript / jQuery我想向SVG添加一个属性

 $("svg").attr("viewBox", "0 0 166 361"); 

以下是运行上述脚本后修改的SVG

  Contents...  

注意它把viewbox放入viewBox。 由于viewbox(小写)没有做任何事情我需要它是viewBox(camelcase)

有任何想法吗?

**更新**

我运行了一个小测试,我从服务器端渲染了viewBox属性,然后我运行了上面的脚本。 你可以看到1.从服务器端渲染时,没问题。 2. jQuery没有识别camelCase viewBox属性,并在所有小写字母中插入了另一个。

  ...  

我可能依赖于您的编码文档类型。 对于所有HTML元素和属性名称,XHTML文档必须使用小写 。 我不确定HTML。

更新2

我能找到的唯一解决方案是使用:

 $("svg")[0].setAttribute("viewBox", "0 0 166 361"); 

更新

我无法解释它出于任何原因,我在我自己的主机上测试,因为JsFiddle总是使用XHTML(嘘!)。 在所有情况下它都是小写的,但它仍然是FF,Chrome和IE9中的SVG元素(我不知道它们是否有效,因为我不知道SVG我害怕)。

Firefox示例Chrome示例IE示例

因为html不区分大小写,并且xhtml标记和属性应该是小写的,所以jQuery将属性名称转换为小写。 因为xml区分大小写,所以当嵌入式xml语言使用像SVG这样的驼峰属性名称时,这是一个问题。

您可以使用jQuery挂钩来处理您希望不转换大小写的属性名称。 如果jQuery找到要设置的jQuery.attrHooks[attributename].set ,它将使用它来设置属性。 jQuery.attrHooks[attributename].get在尝试检索属性值时也是如此。 例如:

 ['preserveAspectRatio', 'viewBox'].forEach(function(k) { $.attrHooks[k.toLowerCase()] = { set: function(el, value) { el.setAttribute(k, value); return true; // return true if it could handle it. }, get: function(el) { return el.getAttribute(k); }, }; }); 

现在jQuery将使用你的setter / getters来操作这些属性。

注意el.attr('viewBox', null)会失败; 你的钩子设定器不会被调用。 相反,你应该使用el.removeAttr(’viewBox’)。

http://docs.jquery.com/Won't_Fix#SVG.2FXML.2FVML_Bugs

jQuery认识到他们要删除所有属性名称但不关心exception/删除此行,因为忽略了与SVG相关的错误(在我看来,toLower是多余的)。

可以使用它。 我想你是在ie开发者工具栏中看到的

没关系

它只是显示它的小写

但如果您尝试提醒驼峰案例值 – 您看到结果。

试着做 :

 alert(("svg").attr("viewBox"));