【问题标题】:why does setAttribute work when jQuery's attr doesn't为什么当 jQuery 的 attr 不起作用时 setAttribute 起作用
【发布时间】:2014-03-28 04:01:49
【问题描述】:

我正在尝试根据鼠标位置动态旋转 SVG 中的渐变,除了这一行之外,一切正常。问题是我似乎无法让 jQuery attr 方法工作。 setAttribute 可以很好地替换属性 rotate(#,#,#) 内的 gradientTransformattr 不能。我真正遇到问题的部分是我可以使用attr 更改其他属性(如小提琴中的第三个示例)。

http://jsfiddle.net/samt/8yUNL/

这个有效

mainLogoFill[0].setAttribute('gradientTransform', 'rotate(45,100,100)');

这个没有

mainLogoFill.attr('gradientTransform', 'rotate(90,100,100)');

这个把我扔了..为什么它有效?

mainLogoFill.attr('x1', '100');

【问题讨论】:

标签: javascript jquery svg attr setattribute


【解决方案1】:

jQuery 使用带有属性名称的 toLowerCase,因此它以 gradienttransform 而不是 gradientTransform 结尾,这是一个新属性,与您已有的属性不同,因此会出现问题。

attr() 方法是这样开始的

function (elem, name, value) {
    var hooks, ret, nType = elem.nodeType;

    // don't get/set attributes on text, comment and attribute nodes
    if (!elem || nType === 3 || nType === 8 || nType === 2) {
        return;
    }

    // Fallback to prop when attributes are not supported
    if (typeof elem.getAttribute === core_strundefined) {
        return jQuery.prop(elem, name, value);
    }

    // All attributes are lowercase
    // Grab necessary hook if one is defined
    if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
        name = name.toLowerCase(); // this is the line where the name is lowercased
        hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook);
    }

    if (value !== undefined) {

解决方法是改用 setAttribute。

【讨论】:

    【解决方案2】:

    虽然 SVG 基于 XML(因此使用区分大小写的属性名称),但此时 jQuery 的检测失败并将属性名称转换为小写。

    如果您不喜欢到处使用.setAttribute(),另一种方法是通过覆盖它确定 XML 模式的方式来修补 jQuery:

    jQuery.isXMLDoc = function(elem)
    {
        return (elem.ownerDocument || elem).documentElement.nodeName !== "HTML" || 
            (elem.namespaceURI).indexOf('html') == -1;
    }
    

    上面的代码额外检查当前元素的命名空间中是否有术语"html"; SVG 的命名空间是 "http://www.w3.org/2000/svg",所以 jQuery 不会改变你的属性名称的大小写。

    Demo

    【讨论】:

    • 虽然这确实是一种“isHTMLDoc”方法。 ;-) 不过不要太自大,IE 认为纯 HTML 文档是 XHTML (w3.org/1999/xhtml),它区分大小写,需要 HTML 属性标签和小写名称,但返回大写 HTML 标签名称的值.这就是生活。 :-/
    • @RobG 是不是更像一个“不是 html doc”的方法? :)
    • ——错,是的。我在想它需要一个 isHTMLDoc 方法,但结果不是这样。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2016-11-02
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多