1. import selection_select from "./select";
  2. import selection_selectAll from "./selectAll";
  3. import selection_filter from "./filter";
  4. import selection_data from "./data";
  5. import selection_enter from "./enter";
  6. import selection_exit from "./exit";
  7. import selection_join from "./join";
  8. import selection_merge from "./merge";
  9. import selection_order from "./order";
  10. import selection_sort from "./sort";
  11. import selection_call from "./call";
  12. import selection_nodes from "./nodes";
  13. import selection_node from "./node";
  14. import selection_size from "./size";
  15. import selection_empty from "./empty";
  16. import selection_each from "./each";
  17. import selection_attr from "./attr";
  18. import selection_style from "./style";
  19. import selection_property from "./property";
  20. import selection_classed from "./classed";
  21. import selection_text from "./text";
  22. import selection_html from "./html";
  23. import selection_raise from "./raise";
  24. import selection_lower from "./lower";
  25. import selection_append from "./append";
  26. import selection_insert from "./insert";
  27. import selection_remove from "./remove";
  28. import selection_clone from "./clone";
  29. import selection_datum from "./datum";
  30. import selection_on from "./on";
  31. import selection_dispatch from "./dispatch";
  32. export var root = [null];
  33. export function Selection(groups, parents) {
  34. this._groups = groups;
  35. this._parents = parents;
  36. }
  37. function selection() {
  38. return new Selection([[document.documentElement]], root);
  39. }
  40. Selection.prototype = selection.prototype = {
  41. constructor: Selection,
  42. select: selection_select,
  43. selectAll: selection_selectAll,
  44. filter: selection_filter,
  45. data: selection_data,
  46. enter: selection_enter,
  47. exit: selection_exit,
  48. join: selection_join,
  49. merge: selection_merge,
  50. order: selection_order,
  51. sort: selection_sort,
  52. call: selection_call,
  53. nodes: selection_nodes,
  54. node: selection_node,
  55. size: selection_size,
  56. empty: selection_empty,
  57. each: selection_each,
  58. attr: selection_attr,
  59. style: selection_style,
  60. property: selection_property,
  61. classed: selection_classed,
  62. text: selection_text,
  63. html: selection_html,
  64. raise: selection_raise,
  65. lower: selection_lower,
  66. append: selection_append,
  67. insert: selection_insert,
  68. remove: selection_remove,
  69. clone: selection_clone,
  70. datum: selection_datum,
  71. on: selection_on,
  72. dispatch: selection_dispatch
  73. };
  74. export default selection;

Selecting Elements 查找元素

  • d3.selection - 选取文档元素的根节点. 返回html元素(document.documentElement)
  • d3.select - 从文档中选取一个元素.(相当于querySelector)
  • d3.selectAll - 从文档中选择多个元素. (相当于querySelectorAll)
  • selection.select - 从每个被选中的元素中选择一个后代元素.
  • selection.selectAll -从每个被选中的元素中选择多个后代元素. ```javascript const html = d3.selection(); // 返回项目根元素 html元素 d3的selection类型 html.style(‘background-color’, ‘red’, ‘important’);

const body = d3.select(‘body’); html.style(‘background-color’, ‘red’, ‘important’);

const testList = d3.selectAll(‘.test-c’); // 获取到多个元素,可以一次性处理 testList.style(‘background-color’, ‘red’, ‘important’); // 对多个元素处理,效果一样

  1. ```javascript
  2. `
  3. <div id="test-c" className="test-c">
  4. <div className="test-c">
  5. <div className="test-c">
  6. content
  7. </div>
  8. </div>
  9. </div>
  10. `
  11. const testList = d3.selectAll('#test-c');
  12. // testList: {_groups: [NodeList(1)], _parents:[html]}
  13. const item = testList.select('.test-c');
  14. // item: {_groups: [NodeList(1)], _parents:[html]}
  15. const items = testList.selectAll('.test-c');
  16. // testList: {_groups: [NodeList(2)], _parents:[div#test-c.test-c]}
  • selection.filter - 基于数据对元素进行过滤.

    1. // selection.filter(selection | fn(d, i)) - 基于数据对元素进行过滤.
    2. var even = d3.selectAll("tr").filter(":nth-child(even)");
    3. var even = d3.selectAll("tr").filter(function(d, i) { return i & 1; });
    4. var even = d3.selectAll("tr").select(function(d, i) { return i & 1 ? this : null; });
  • selection.merge(other) - 返回一个将当前选择集和指定的 other 选择集合并之后的新的选择集。返回的选择集与当前选择集有相同数量的分组以及相同的父元素。当前选择集中的任何空缺 (null) 都会被指定的 other 中的对应的元素填充(如果存在的话),如果 other 选择集有附加的组或者父元素,则将其忽略 ```javascript // selection.merge(selection) 例子 var circle = svg.selectAll(“circle”).data(data) // UPDATE .style(“fill”, “blue”);

circle.exit().remove(); // EXIT

circle = circle.enter().append(“circle”) // ENTER .style(“fill”, “green”) .merge(circle) // ENTER + UPDATE .style(“stroke”, “black”);

  1. - d3.matcher(selection) - 给定指定的_选择器_,返回一个函数,如果`this`element [与](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches)指定的选择器[匹配](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches),则该函数返回true 。通过.filter内部使用此方法。例如,这:
  2. ```javascript
  3. const div = selection.filter("div");
  4. const div = selection.filter(d3.matcher("div"));
  • d3.selector - 选择一个元素. 返回的是一个function,满足条件返回ture,否则返回false

    1. const div = selection.select("div");
    2. const div = selection.select(d3.selector("div"));
  • d3.selectorAll - 选择多个元素. 返回的是一个function,满足条件返回ture,否则返回false

    1. const div = selection.selectAll("div");
    2. const div = selection.selectAll(d3.selectorAll("div"));
  • d3.window(node) - 获取节点所属的window对象

    1. d3.window(document).alert('666')
    2. d3.window(document.getElementById('test01')).alert('888');
  • d3.style(node, name) - 获取节点当前的指定样式名称的样式值.

    1. d3.style(document.getElementById('test01'), 'color');

Modifying Elements 修改元素

  • selection.attr(name[, value]) - 设置或获取属性.
  • selection.classed(names[, bool: boolean]) - 获取,添加或者移除 CSS 类. bool为true添加class,为false则删除对应的class,names可以用空格分割,例如”foo bar”
  • selection.style(name: string[, value: string [, priority: null | ‘important’]);

设置或获取style的值

  • selection.property(name[, value]) - 获取或设置一个特殊属性.

    1. // 声明一个新的局部变量。例如:
    2. var foo = d3.local();
    3. selection.property(foo, function(d) { return d.value; });

    有些 HTML 元素的属性比较特殊,不能直接使用 attrstyle 操作,比如文本域的 value 属性以及 checkbox 的 checked 属性。使用本方法可以操作这些属性。
    如果指定了 value 则将选中的元素对应 name 属性值设置为指定的 value。如果 value 为常量,则将选择集中所有的元素对应的属性都设置为指定的 value 常量。如果 value 为函数,则会为选择集中的所有元素依次调用,并传递当前元素绑定的数据 d,当前的索引 i 以及当前分组 nodes,在函数内部 this 指向当前 DOM 元素(nodes[i])。函数的返回值将会被设置为当前元素的属性值。使用 null 作为值表示移除当前属性。
    如果没有指定 value 则返回当前选择集中第一个非空元素对应的属性值。当已知选择集中只包含一个元素时很有用。

  • selection.text([value]) - 设置或获取文本内容.

  • selection.html([value]) - 设置或获取 HTML 内容.
  • selection.append(type) - 创建、添加并返回一个新的元素. ```javascript // 查到的每个元素里都追加一个div元素

d3.selectAll(“p”).append(“div”); d3.selectAll(“p”).append(function() { return document.createElement(“div”); });

  1. - _selection_.**insert**(_type_[, _before_]) - 创建、插入并返回一个新的元素.
  2. ```javascript
  3. // 插到最后面
  4. d3.selectAll('.test-a').insert(function(d, i){
  5. console.log(d, i); // undefined, 0
  6. var div = document.createElement("div");
  7. div.innerHTML = 'insert1';
  8. return div;
  9. });
  10. // 等价
  11. d3.selectAll(".test-a").select(function() {
  12. var div = document.createElement("div");
  13. div.innerHTML = 'insert2';
  14. return this.insertBefore(div, null);
  15. });
  16. // 插到最后面
  17. d3.selectAll(".test-a").insert("div").html('insert3');
  18. // 插到第一个元素后面
  19. d3.selectAll(".test-a").insert("div", ':first-child').html('insert4');
  1. // selection.insert 源码
  2. import creator from "../creator";
  3. import selector from "../selector";
  4. function constantNull() {
  5. return null;
  6. }
  7. export default function(name, before) {
  8. var create = typeof name === "function" ? name : creator(name),
  9. select = before == null ? constantNull :
  10. typeof before === "function" ? before : selector(before);
  11. return this.select(function() {
  12. return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
  13. });
  14. }
  • selection.remove - 从文档中移除元素.

    1. d3.selectAll('.test-a').remove();
  • selection.clone([deep: boolean]) - 插入选中元素的克隆. ```javascript // selection.clone 源码 function selection_cloneShallow() { var clone = this.cloneNode(false), parent = this.parentNode; return parent ? parent.insertBefore(clone, this.nextSibling) : clone; }

function selection_cloneDeep() { var clone = this.cloneNode(true), parent = this.parentNode; return parent ? parent.insertBefore(clone, this.nextSibling) : clone; }

export default function(deep) { return this.select(deep ? selection_cloneDeep : selection_cloneShallow); }

  1. - _selection_.sort([_compare: function]_) - 基于数据对文档中的元素进行排序.
  2. ```javascript
  3. // 如果不传入参数compare,默认使用ascending方法
  4. function compare(a, b) {
  5. return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
  6. }
  7. function ascending(a, b) {
  8. return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
  9. }
  • selection.order() - 在文档中重新排列元素. 无参数,自动排序,如果数据已经有序的话,这个方法与 selection.sort 等效,但是要更快。
  • selection.raise() - 按序重新插入每个选中的元素,每次插入的元素都作为其父元素的第一个子元素。

    1. 相当于
    2. selection.each(function() {
    3. this.parentNode.appendChild(this);
    4. });
  • selection.lower() - 将每个选中的元素重新排列为其对应父节点的第一个子元素.

    1. selection.each(function() {
    2. this.parentNode.insertBefore(this, this.parentNode.firstChild);
    3. });
  • d3.create - 创建一个指定名称的与文档分离的元素.

  • d3.creator - 根据名称返回一个创建指定元素的函数.
    1. var div2 = d3.creator('div')
    2. d3.selectAll('#test01').append(div2).text('999')