因为习惯了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支持)的更多相关文章

  1. D3.js v5 Tutorials

    D3.js v5 Tutorials D3.js v5 教程 https://github.com/d3/d3/blob/master/API.md CHANGES https://github.co ...

  2. D3.js V5 教程

    D3.js V5 教程 1.在项目中使用D3.js 2. 选择元素和设置(获取)属性 3. 绑定数据 4. 理解Update.Enter.Exit 与 添加.删除元素 未完待续..........

  3. d3.js V5版本在vue里使用 自定义节点图片

    var width = this.$refs.topInfo.offsetWidth; var height = this.$refs.topInfo.offsetHeight; var img_w ...

  4. D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

    D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...

  5. D3.js学习笔记(四)—— 使用SVG坐标空间

    目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...

  6. 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛

    前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...

  7. D3.js学习笔记(二)——使用绑定在DOM上的数据

    简单例子 在这个例子中,你将会使用D3.js来将数据绑定到DOM元素上.然后再使用D3.js利用绑定到DOM元素上的数据来更新网页. 在上一章中,我们以下面这个页面作为开始的: <!DOCTYP ...

  8. D3.js 力导向图的显示优化

    D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...

  9. D3.js的v5版本入门教程(第十一章)——交互式操作

    D3.js的v5版本入门教程(第十一章) 与图形进行交互操作是很重要的!所谓的交互操作也就是为图形元素添加监听事件,比如说当你鼠标放在某个图形元素上面的时候,就会显示相应的文字,而当鼠标移开后,文字就 ...

随机推荐

  1. Spring编码过滤器:解决中文乱码

    Spring编码过滤器:解决中文乱码 针对问题: 前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题: 解决方案: web.x ...

  2. Git与TortoiseGit使用方法

               下载这两个工具 Git地址:https://git-for-windows.github.io/ TortoiseGit地址:http://tortoisegit.org/ 点击 ...

  3. 安装配置mariadb-10.1.19

    本文参考:http://chenzehe.iteye.com/blog/1266260  感谢原作者的分享! 首先安装/更新一些编译时会用到的基础包 [root@localhost local]# y ...

  4. UBUNTU的默认root密码是多少,修改root密码

    UBUNTU的默认root密码是多少,修改root密码 | 一.Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo passwd,然后输入当前 ...

  5. 8.scala:特质

    版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=317 总体来说,scala中的特质类似于Java中的接口,但是有别于接口的是特质中既可以有实现方法也可以有抽象方法 ...

  6. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

  7. shell中的常用通配符,字符类

    因为 shell 频繁 地使用文件名,shell 提供了特殊字符来帮助你快速指定一组文件名.这些特殊字符叫做通配符. 通配符         意义 * 匹配任意多个字符(包括零个或一个) ? 匹配任意 ...

  8. Outlook 配置qq邮箱账号

    最近想用Outlook 2013管理QQ邮件,配置好久都没有成功,结果最后发现第三方登陆QQ邮箱不使用QQ密码,而是使用一个叫”授权码”的东西.(用户名自动生成的,授权码就填这,报错后填会测试不通过) ...

  9. ColKang v1.0

    /* *2015.3.31 14:00更新 *上午刚写完这篇博客,下午就读到迭代器了.C++ primer中讲迭代器那节说道了->符号的意思,即(*ptr).  及将指针解引用之后再调用成员函数 ...

  10. LeetCode第[73]题(Java):Set Matrix Zeroes(矩阵置0)

    题目:矩阵置0 难度:Easy 题目内容: Given a m x n matrix, if an element is 0, set its entire row and column to 0. ...