Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么jQuery不能直接操作SVG元素的类?

为什么jQuery不能直接操作SVG元素的类?
EN

Stack Overflow用户
提问于 2015-08-26 17:07:36
回答 3查看 81关注 0票数 0

我责怪自己的愚蠢,但我无法理解为什么jQuery (2.1.4)不能使用它的类函数直接更改SVG元素(或子元素)的类?我在试图为jQuery制作一个SVG操作插件,我正在测试各种东西以使类变(是的,我尝试过普通的SVG库;不,我不关心它们)。最后,我选择了我的当前版本,它智能地覆盖了原始的jQuery.addClass()函数。我检查jQuery元素的数组是否包含SVG类型节点,如果包含,则使用自定义函数,否则,将其传递回原始的jQuery函数。到目前为止这似乎是可行的。尽管如此,我的“自定义”函数与jQuery函数的代码完全相同,因为我从GitHub上的源代码中复制了它。那么,如果它适用于我的“自定义”函数,为什么它不能简单地与默认的jQuery函数一起工作呢?

这是我到目前为止的密码。在语法上,我的代码与我的风格不同,但实际上它与原始的jQuery代码完全相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function ($) {
    var element,
        jQueryFunctions = {
            addClass: $.fn.addClass
        };

    var addClass = function (
        elements,
        value) {
        var proceed = typeof (value) === "string" && value;

        if (!proceed) {
            return this;
        }

        for (var i = 0, j, l = elements.length, element, klasses = (value || "").match(/\S+/g) || [], klass, currentValue, current, finalValue; element = elements[i], i < l; i++) {
            currentValue = element.getAttribute && element.getAttribute("class") || "",
            current = element.nodeType === 1 && (" " + currentValue + " ").replace(/[\t\r\n\f]/g, " ");

            if (!current) {
                return;
            }

            j = 0;

            while (klass = klasses[j++]) {
                if (current.indexOf(" " + klass + " ") < 0) {
                    current += klass + " ";
                }

                finalValue = jQuery.trim(current);

                if (currentValue !== finalValue) {
                    element.setAttribute("class", finalValue);
                }
            }
        }
    };

    var hasSvgNodes = function (
        elements) {
        var returnValue = true;

        for (var i = 0, l = elements.length, element; element = elements[i], i < l; i++) {
            returnValue = returnValue && (element.nodeName === "svg");
        }

        return returnValue;
    };

    $.fn.svg = function () {
        return element = this;
    };

    $.fn.addClass = function (
        value) {
        if (!hasSvgNodes(this)) {
            jQueryFunctions.addClass.apply(this, arguments);
        } else {
            addClass(this, value);
        }

        return this;
    };

    $.fn.svg.test = function () {
        element.addClass("Red");
    };
}(jQuery));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-27 13:30:18

@Paul的回答让我有点好奇,因为我所取的代码来自GitHub上的当前源代码。我检查了两遍,以防万一是从旧版本中提取出来的,当然这是最新版本。因此,我决定再次检查3.0.0 a1的发行说明,并找到了我的答案。很明显,jQuery团队决定稍微改变他们对Won修复策略的立场,并允许直接操作SVG元素的类属性。这就是目前在上面的代码以及我正在复制的内容。

这里是讨论线提交供参考。因此,jQuery在默认情况下确实做类操作,只是在下一个版本中。对于我正在做的事情,我不介意去阿尔法,所以它对我来说是可行的。

我仍然会为特定于我的需要的SVG特定的任务做我自己的插件,但是随着类问题的解决,现在应该更容易了。

票数 0
EN

Stack Overflow用户

发布于 2015-08-26 18:01:24

@Alex是对的。它不起作用(演示)。过去很久以前的事。(在1.1分支中),但是它不再这样做了。

这主要是因为className属性的类型对于SVG元素和HTML来说是不同的。在HTML元素中,它是一个字符串。在SVG元素中,它是一个SVGAnimatedString

addClass()代码希望它是一个字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var  htmlelem = document.getElementById("htmlelem"),
     svgelem = document.getElementById("svgelem");
    
alert("HTML = "+(typeof htmlelem.className) + ". SVG = "+(typeof svgelem.className));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<svg>
    <rect id="svgelem" width="300" height="150"/>
</svg>
<div id="htmlelem"></div>

您自己的版本之所以起作用,是因为看起来您已经从jQuery的一个旧分支中获取了代码。它绝对不是addClass的2.1.4版本。

票数 2
EN

Stack Overflow用户

发布于 2015-08-26 19:04:57

注意,解决办法;svg,jsfiddle从@PaulLeBeau的答案中分叉而来。

尝试利用HTMLElement.dataset应用css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$().ready(function() {
  $("#test")[0].dataset.class = "red";
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[data-class="red"] {
  fill: red;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
<svg>
  <rect id="test" width="300" height="150" />
</svg>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32239095

复制
相关文章
ubuntu下使用pip卸载包时出现Cannot uninstall scipy
ubuntu系统下使用pip uninstall scipy命令卸载包时,遇到报错信息为:
全栈程序员站长
2022/11/03
9550
【python】如何使用pip安装、卸载包
1、在安装python的时候要把pip勾选上(默认安装方式已经为你勾选好了)。这样你就已经安装了pip。
全栈程序员站长
2022/11/03
4.8K0
【python】如何使用pip安装、卸载包
怎样安装pip_pip 安装本地python包
网上有各种方法安装pip,针对不同的系统方法还不一样,最后发现还是下面这种方法最简单,直接了当干脆方便,适用于Windows和Linux。
全栈程序员站长
2022/11/17
2.9K0
怎样安装pip_pip 安装本地python包
python相关包无法pip时 原
通常可以直接google “XXX for python3.5”,或者在github中找到对应的python3.5的项目,将对应的.py文件添加到python的lib目录中。
晓歌
2018/08/15
7610
使用pip安装python包的时候会多次安装依赖包
问题描述:我使用的是ubuntu18系统自动的py2.7还有pip9,还算是方便,在安装以前的基于pytho的软件的时候发现使用pip安装python包的时候会多次安装依赖包,虽然我设置了豆瓣镜像,安装速度非常快,但是这样重复安装基础包是不是有点浪费呢? 比如使用代码: pip install --index-url https://pypi.douban.com/simple cnvkit pip install --index-url https://pypi.douban.com/simple HTS
生信技能树
2018/07/27
2.7K0
多python环境下使用pip安装包
笔记本上安装了2.7和3.5两个版本的python,在使用3.5版本的pip安装keras时出现了failed to create process错误。解决方法如下: 1.由于我在环境变量中同时配置了2.7和3.5的路径,所以我可以直接在命令行下执行python3来启动3.5版本的python; 2.通过python3来启动pip,在命令行中输入python3 -m pip install keras,成功安装上keras。
py3study
2020/01/08
2K0
Python使用pip安装/卸载包「建议收藏」
进入某一个版本的下载页面,根据自己的需要下载。比如红框内:Windows32位版本安装包。(executable installer 即可执行文件”.exe”)
全栈程序员站长
2022/11/03
1.2K0
Python使用pip安装/卸载包「建议收藏」
pycharm安装包出现的错误
1,先装python,在装pycharm,将python的路径添加到电脑路径的path中 2,re是python自带的库,不需要再装了 3,不放在虚拟环境中,创建项目,导入包的时候都要记得放在实际的python…exe中 4,当出现不是正确版本的pip时 (1)可能是pip版本过低,去cmd下载 (2)网络太慢,在这里我是通过 pip install ddt -i http://pypi.douban.com/simple/ –trusted-host pypi.douban.com 豆瓣源下载的,很快 将ddt改为我需要的包即可
全栈程序员站长
2022/08/29
1.7K0
pip怎么卸载安装包_python pip升级
pip uninstall -r requirements.txt -y 如果不加最后的-y就需要一个一个包输入y确认卸载
全栈程序员站长
2022/11/02
2.1K0
pycharm使用pip安装模块时提示: No module named pip
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/174545.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.2K0
使用pip安装模块时,提示MemoryError
在使用pip安装依赖模块时,报错如下: 图片 解决方法: 添加 --no-cache-dir参数 pip3 --no-cache-dir install -r *** 安装时遇到的其他问题: 设置python源命令:pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 提示没有config参数; 解决办法:升级pippip3 install -U pip pip install --upgrade pip 提示:E
JQ实验室
2022/11/18
1.6K0
python3.X 使用pip 离线安装whl包
机器上python2,3混用的问题,参考: http://blog.csdn.net/wangyaninglm/article/details/53312606 第二小节:不同版本python混用(官方用法)其实主要就是前面加上py -3(或)2
流川疯
2019/01/17
3.6K0
Python 通过命令行安装包的时候 pip 提示错误
出现上面的问题的原因大部分情况是因为在 Python 安装的时候没有将 Python 的 Path 添加到环境变量中去。
HoneyMoose
2021/03/11
1.3K0
Python 通过命令行安装包的时候 pip 提示错误
使用pip来管理python包
使用pip来管理python包 2015/12/8 一、安装pip 【Linux】 yum install python-pip 【Win】 安装python时,默认已经安装pip 二、使用pip安装包 【Linux】 [root@tvm-test ~]# pip install Django==1.6.0                Collecting Django==1.6.0 /usr/lib/python2.6/site-packages/pip/_vendor/requests/packa
py3study
2020/01/08
6610
pip下使用代理安装包
一句话代码 pip install --proxy x.x.x.x:8080 requsets pip install --proxy x.x.x.x:8080 --upgrade pip 帮助文件 pip -h --proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port.
老高的技术博客
2022/12/28
1.1K0
Python 镜像安装pip的包 原
解决方法:到 http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 页面下载所需的wordcloud模块的whl文件
晓歌
2018/08/15
2.4K0
Python 镜像安装pip的包
                                                                            原
[883]python安装包出现Retrying
问题:安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError
周小董
2020/08/03
5.9K0
Python安装管理 Pycharm安装使用 pip使用[通俗易懂]
一、Python环境管理(mac系统) 1、安装:   下载python安装包:https://www.python.org/   Python安装文档(windwos系统): https://testing-studio.com/t/topic/57/4 2、查看安装结果 终端中输入 python (对于Mac和Linux系统会本身自带一个较低的Python版本)   mac系统的安装Python的默认路径是:/usr/local/bin/python3.8   设置软链接 ln -f /usr/local/bin/python3.8 /usr/local/bin/python (这时就指定了对应Python的版本,配置环境变量) 3、配置环境变量   查看环境变量文件(PATH)   查看环境变量的文件 vim ~/.bash_profile。输入export PATH=PATH:/usr/local/bin并保存 二、Pycharm 安装:http://www.jetbrains.com/pycharm/download/#section=windows 安装说明:https://www.runoob.com/w3cnote/pycharm-windows-install.html
全栈程序员站长
2022/09/27
2.6K0
Python安装管理 Pycharm安装使用 pip使用[通俗易懂]
pip怎么卸载安装包_pip离线安装whl
如在完成Python的安装后,我们需要安装pandas这个包,则只需要在终端中输入 pip install pandas ,在网络畅通的条件下,就会开始包的安装。
全栈程序员站长
2022/11/02
2.5K0
点击加载更多

相似问题

python 3.6包pip安装时出现导入错误

12

使用pip安装包时出现ssl错误

11

使用PIP安装scrapy for python时出现错误

015

使用pip或pip3安装pyseer包时出现错误

344

安装pip包(pycrypto)时出现错误%1

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文