d3.js(v5.7)的attr()函数完善(添加obj支持)
因为习惯了jquery的attr(obj)批量添加属性,所以刚开始看到d3为dom添加属性要一个一个添加的时候真的是十分想吐槽,既然想实现attr(obj),根据传入对象的键值对批量添加dom属性,那就得改它的源码了。
因为看d3的dom是这样选择的:
d3.selectAll("h1");
那么直接打印这个,控制台显示的是一个Selection对象,如图:

并且获得这个节点之后,是可以直接通过attr()来为dom添加属性的,那么我们就来看d3下的selection,控制台console.log(d3):

果不其然,d3下有个selection对象,selection对象下有attr()这个原型方法;
此时,我就想了干脆直接重写d3.selection.prototype.attr()这个方法,于是一顿操作猛如虎,写下了如下代码:

然后:

一看页面,没反应(其实这里由于d3的dom处理规则问题导致我这句代码是有问题的,稍后会讲解)
那怎么办呢,直接看他attr的源码吧:

打开之后:

我们看他这个对外暴露的方法:
首先他通过this.node()获取dom对象,所以之前我重写的方法里面的this拿到的是d3获取的selection对象,需要将其转为DOM对象;
然后d3的这个方法里面,判断参数个数小于2的时候(那就是1咯),执行getter方法获取属性值,这个没有异议;
针对setter,为了支持对象型参数,并实现批量添加属性
于是,添加了如下代码:

然后,验证一下(为h1添加两个属性):


结果只有第一个获得了两个属性,一方面验证我之前添加的代码是没有问题的,一方面验证selectAll()并不能不会循环执行后续操作,但想到之前绑定数据之后的text()是可以实现循环赋值的,那么:


至此,便可以愉快地批量添加属性了。不用像网上教程那样,千篇一律的多重attr()操作:

但是!重点来了,以上简单的修改,不难发现只支持字符串型属性值,d3可是支持函数型属性值得啊,不用怕,后续我也针对函数型属性值作了补充:

页面使用:

页面展示:

至此,这个函数应该算是比较完善了,反正我用得挺顺手
注:
我们现在的HTML都是通过DOCTYPE来声明,XHTML中有xmlns声明,svg标签也是有的,d3中有删除通过命名空间和名称指定的属性的方法,但是我们现在写的时候,都不需要添加命名空间,所以我修改的方法就没有添加removeAttributeNS()支持了,最终版:

d3.js(v5.7)的attr()函数完善(添加obj支持)的更多相关文章
- D3.js v5 Tutorials
D3.js v5 Tutorials D3.js v5 教程 https://github.com/d3/d3/blob/master/API.md CHANGES https://github.co ...
- D3.js V5 教程
D3.js V5 教程 1.在项目中使用D3.js 2. 选择元素和设置(获取)属性 3. 绑定数据 4. 理解Update.Enter.Exit 与 添加.删除元素 未完待续..........
- d3.js V5版本在vue里使用 自定义节点图片
var width = this.$refs.topInfo.offsetWidth; var height = this.$refs.topInfo.offsetHeight; var img_w ...
- D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素
D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...
- D3.js学习笔记(四)—— 使用SVG坐标空间
目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...
- 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛
前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...
- D3.js学习笔记(二)——使用绑定在DOM上的数据
简单例子 在这个例子中,你将会使用D3.js来将数据绑定到DOM元素上.然后再使用D3.js利用绑定到DOM元素上的数据来更新网页. 在上一章中,我们以下面这个页面作为开始的: <!DOCTYP ...
- D3.js 力导向图的显示优化
D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...
- D3.js的v5版本入门教程(第十一章)——交互式操作
D3.js的v5版本入门教程(第十一章) 与图形进行交互操作是很重要的!所谓的交互操作也就是为图形元素添加监听事件,比如说当你鼠标放在某个图形元素上面的时候,就会显示相应的文字,而当鼠标移开后,文字就 ...
随机推荐
- terminal配置
阅读目录 前言 使用 tmux 复用控制台窗口 在命令行中快速移动光标 在命令行中快速删除文本 快速查看和搜索历史命令 快速引用和修饰历史命令 录制屏幕并转换为 gif 动画图片 总结 回到顶部 前言 ...
- log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
多个classloader加载log4j时需要设置当前Thread的classloader为你自己的classloader Thread.currentThread().setContextClass ...
- springBoot的文件上传功能
知识点: 后台:将上传的图片写入指定服务器路径,保存起来,返回上传后的图片路径(在springBoot中,参考博客:http://blog.csdn.net/change_on/article/det ...
- PAT1075. PAT Judge (25)
其中在排名输出上参照了 http://blog.csdn.net/xyzchenzd/article/details/27074665,原先自己写的很繁琐,而且还有一个测试点不通过. #include ...
- 01_Storm体系概要
1. Storm发展历史 Storm历史 1. 2010年12月,backtype公司Nathan,提出Storm的核心概念2. backtype, 提供数据分析,数据处理服务的一个公司3. 2011 ...
- Gym - 100712B Rock-Paper-Scissors
https://vjudge.net/problem/Gym-100712B 题意: 石头剪刀布游戏. 给出一个玩家n局的出的顺序,现在另一个是这样出的,X+Y+Z=n,在前X轮出石头,中间Y轮出布, ...
- HttpServlet实现serializable
Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending a ...
- Sorl初始
Sorl是什么 ? Solr是Apache下的一个开源项目,使用Java基于Lucene开发的全文检索服务:是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可 ...
- 我的Ansible学习笔记
Ansible常见错误 http://afewbug.com/article/26官方文档 http://docs.ansible.com/ansible/安装配置 http://sofar.blog ...
- 新男人八题---AStringGame
终于完成进度男人1/8,为了这题学了sam= = 题意先有一个串,n个子串,两个人轮流每次在子串上加字符,要求加完后还是原串的子串,最后不能加的就是输者,求赢的人 解法:sam之后在构造的状态图上跑s ...