企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# d3对dom的操作 ## 查找selection selection使用类似与jquery的$()选择 在使用上有.: - `.select()` 选择一个 - `.sleectAll()` 选择一组 例如以下文档结构 ``` html <!DOCTYPE html> <html lang="en"> <head> </head> <body> <div id="a1" class="s1"> <div id="b1"> <div id="c1" class="s1"></div> </div> <div id="b2"> <div id="c2" class="s1"></div> </div> <div id="b3"> <span id="c3"></span> </div> </div> <div id="A1" class="s1"></div> </body> </html> ``` 操作实例如下: ``` js d3.select('#a1').select('div') //将会选中id为b1的div d3.select('#a1').selectAll('div') //将会选中id为b1,b2,b3的三个div d3.select('#a1').selectAll('.s1') //将会选中id为c1,c2的两个div ``` 思考:d3.selectAll('.s1')选中了哪些div? ## 创建create create有两种方式: - `.append()` 追加 - `.insert()` 插入 例如以下文档结构 ``` html <!DOCTYPE html> <html lang="en"> <head> </head> <body> <div id="a1" class="s1"> <div id="b1"> <div id="c1" class="s1"></div> </div> <div id="b2"> <div id="c2" class="s1"></div> </div> <div id="b3"> <span id="c3"></span> </div> </div> <div id="A1" class="s1"></div> </body> </html> ``` ``` js d3.select('a1').append('div') //将会在id为b3后面创建一个div d3.select('a1').insert('div') //将会在id为b1前面创建一个div ``` 思考:d3.selectAll('.s1').insert('div')将会如何创建div? ## remove 删除节点和selection几乎一样,.remove()和.removeAll().所以不再赘述。 ## 绑定数据 绑定数据的实质是将数据赋值到对应dom的property的`__data__`属性上。 两种方式: - `.data()` //将数组的子元素依次绑定到选择的dom中 - `.datum()` //将数据全部分别绑定到选择dom中 ``` html <!DOCTYPE html> <html lang="en"> <head> </head> <body> <div id="a1" class="s1"> <div id="b1"> <div id="c1" class="s1"></div> </div> <div id="b2"> <div id="c2" class="s1"></div> </div> <div id="b3"> <span id="c3"></span> </div> </div> <div id="A1" class="s1"></div> </body> </html> ``` ``` js d3.select('#a1').selectAll('div').data([1,2,3,4,5,6]) // 会为#b1绑定1,会为#b2绑定2,会为#b3绑定3 d3.select('#a1').selectAll('div').datum([1,2,3,4,5,6]) // 会为#b1,b2,b3均绑定[1,2,3,4,5,6] ``` 问题来了?data绑定数据时数据数组过长,我想选中有数据没有dom的呢?如果数据数组过短,只有dom没有数据如何选中? 那就是接下的操作: - `.enter()` //选中只有数据没有dom的部分。其后面常跟随.append('div'),这里创建后数据是绑定了的。 - `.exit()` //选中的是只有dom没有数据的部分,其后面跟什么?.removeAll(); - `.merge(selectionA)` //将选中集与selectionA合并成新的选择集 ``` javascript /** *data为数组 */ update(dataSet){ var root=d3.select('div'); var divs = root.selectAll('div') .data(dataSet) //删除没有数据的dom divs.exit().remove() //为有数据没有dom的添加dom,并将有数据有dom的合并在一起,修改class divs.enter().append("div") .merge(divs) .attr("class",function(d){return 's'+d}) } ``` 思考:假如传递一个[1,2,3,4,5,6]会得到什么样的结构? ## 其他常见操作 - `.html()` 插入html代码 - `.text()` 插入文本 - `.on()` 添加事件监听 - `.filter()` 过滤 - `.stytle()` 修改/获取样式 - `.each()` 遍历 - `.node()` 返回dom对象 - `.nodes()`返回dom对象集 等等,在以后源码中遇到再补充,其余的请参考官方文档。