Research
Security News
Threat Actor Exposes Playbook for Exploiting npm to Build Blockchain-Powered Botnets
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
d3-selection
Advanced tools
The d3-selection package is a part of the D3.js library, which is used for manipulating documents based on data. It provides powerful tools for selecting elements, binding data to them, and applying transformations to the document.
Selecting Elements
This feature allows you to select DOM elements and apply styles or other transformations to them. In this example, the background color of the body element is changed to light blue.
d3.select('body').style('background-color', 'lightblue');
Binding Data
This feature allows you to bind data to DOM elements and use that data to drive transformations. In this example, the font size of each paragraph element is set based on the bound data.
d3.selectAll('p').data([4, 8, 15, 16, 23, 42]).style('font-size', function(d) { return d + 'px'; });
Entering and Exiting Elements
This feature allows you to handle data-driven creation and removal of elements. In this example, new paragraph elements are created for each data point that does not already have a corresponding paragraph.
var p = d3.select('body').selectAll('p').data([4, 8, 15, 16, 23, 42]);
p.enter().append('p').text(function(d) { return 'New paragraph with data: ' + d; });
jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, and animation much simpler with an easy-to-use API that works across a multitude of browsers. Compared to d3-selection, jQuery is more general-purpose and less focused on data-driven transformations.
React is a JavaScript library for building user interfaces. It allows developers to create large web applications that can update and render efficiently in response to data changes. While React is more focused on building reusable UI components, d3-selection is more specialized in data-driven document manipulation.
Vue.js is a progressive JavaScript framework used for building user interfaces. It is designed to be incrementally adoptable and focuses on the view layer. Vue provides reactive data binding and a component-based architecture, similar to React, but it is not as specialized in data-driven document manipulation as d3-selection.
Selections allow powerful data-driven transformation of the document object model (DOM): set attributes, styles, properties, HTML or text content, and more. Using the data join’s enter and exit selections, you can also add or remove elements to correspond to data.
If you use NPM, npm install d3-selection
. Otherwise, download the latest release. The released bundle supports AMD, CommonJS, and vanilla environments. Create a custom build using Rollup or your preferred bundler. You can also load directly from d3js.org:
<script src="https://d3js.org/d3-selection.v0.6.min.js"></script>
In a vanilla environment, a d3_selection
global is exported. Try d3-selection in your browser.
Selection methods accept W3C selector strings such as .fancy
to select elements with the class fancy, or div
to select DIV elements. Selection methods come in two forms: select and selectAll: the former selects only the first matching element, while the latter selects all matching elements in document order. The top-level selection methods, d3.select and d3.selectAll, query the entire document; the subselection methods, selection.select and selection.selectAll, restrict selection to descendants of the selected elements.
# d3.selection()
Selects the root element, document.documentElement
. This function can also be used to check if an object is a selection (instanceof selection
) or to extend the selection prototype. For example, to add a method to check checkboxes:
d3.selection.prototype.checked = function(value) {
return arguments.length < 1
? this.property("checked")
: this.property("checked", !!value);
};
And then to use:
d3.selectAll("input[type=checkbox]").checked(true);
# d3.select(selector)
Selects the first element that matches the specified selector string. If no elements match the selector, returns an empty selection. If multiple elements match the selector, only the first matching element(in document order will be selected. For example, to select the first anchor element:
var anchor = d3.select("a");
If the selector is not a string, instead selects the specified node; this is useful if you already have a reference to a node, such as this
within an event listener or a global such as document.body
. For example, to make a clicked paragraph red:
d3.selectAll("p").on("click", function() {
d3.select(this).style("color", "red");
});
# d3.selectAll(selector)
Selects all elements that match the specified selector string. The elements will be selected in document order (top-to-bottom). If no elements in the document match the selector, returns an empty selection. For example, to select all paragraphs:
var paragraph = d3.selectAll("p");
If the selector is not a string, instead selects the specified array of nodes; this is useful if you already have a reference to nodes, such as this.childNodes
within an event listener or a global such as document.links
. The nodes may instead be a pseudo-array such as a NodeList
or arguments
. For example, to color all links red:
d3.selectAll(document.links).style("color", "red");
# selection.select(selector)
For each selected element, selects the first descendant element that matches the specified selector string. If no element matches the specified selector for the current element, the element at the current index will be null in the returned selection. If the current element has associated data, this data is propagated to the corresponding selected element. If multiple elements match the selector, only the first matching element in document order is selected. For example, to select the first bold element in every paragraph:
var b = d3.selectAll("p").select("b");
If the selector is a function, it is evaluated for each selected element, in order, being passed the current datum d
and index i
, with the this
context as the current DOM element. It must return an element, or null if there is no matching element. For example, to select the previous sibling of each paragraph:
var previous = d3.selectAll("p").select(function() {
return this.previousElementSibling;
});
Unlike selection.selectAll, selection.select does not affect grouping: it preserves the existing group structure and indexes, and propagates data (if any) to selected children. Grouping plays an important role in the data join. See Nested Selections and How Selections Work for more on this topic.
# selection.selectAll(selector)
For each selected element, selects the descendant elements that match the specified selector string. The elements in the returned selection are grouped by their corresponding parent node in this selection. If no element matches the specified selector for the current element, the group at the current index will be empty. The selected elements do not inherit data from the current selection; use selection.data to propagate data to children. For example, to select the bold elements in every paragraph:
var b = d3.selectAll("p").selectAll("b");
If the selector is a function, it is evaluated for each selected element, in order, being passed the current datum d
and index i
, with the this
context as the current DOM element. It must return an array of elements (or a psuedo-array, such as a NodeList), or the empty array if there are no matching elements. For example, to select the previous and next siblings of each paragraph:
var sibling = d3.selectAll("p").selectAll(function() {
return [
this.previousElementSibling,
this.nextElementSibling
];
});
Unlike selection.select, selection.selectAll does affect grouping: each selected descendant is grouped by the parent element in the originating selection. Grouping plays an important role in the data join. See Nested Selections and How Selections Work for more on this topic.
# selection.filter(filter)
Filters the selection, returning a new selection that contains only the elements for which the specified filter is true. The filter may be specified either as a selector string or a function. If a function, it is evaluated for each selected element, in order, being passed the current datum d
and index i
, with the this
context as the current DOM element. For example, to filter a selection of table rows to contain only even rows:
var even = d3.selectAll("tr").filter(":nth-child(even)");
Equivalently, using d3.selectAll directly:
var even = d3.selectAll("tr:nth-child(even)");
Similarly, using a function:
var even = d3.selectAll("tr").filter(function(d, i) { return i & 1; });
Or using selection.select:
var even = d3.selectAll("tr").select(function(d, i) { return i & 1 ? this : null; });
Note that the :nth-child
pseudo-class is a one-based index rather than a zero-based index. Also, the above filter functions do not have precisely the same meaning as :nth-child
; they rely on the selection index rather than the number of preceeding sibling elements in the DOM.
The returned selection may not preserve the index of the original selection, as some elements may be removed; you can use selection.select to preserve the index, if needed.
After selecting elements, use the selection’s transformation methods to affect document content. Selection methods return the current selection, allowing the concise application of multiple methods on a given selection via method chaining. For example, to set the name attribute and color style of an anchor element:
d3.select("a")
.attr("name", "fred")
.style("color", "red");
This is equivalent to:
var anchor = d3.select("a");
anchor.attr("name", "fred");
anchor.style("color", "red");
To experiment with selections, visit d3js.org and open your browser’s developer console! (In Chrome, open the console with ⌥⌘J.) Select elements and then inspect the returned selection to see which elements are selected and how they are grouped. Call selection methods and see how the page content changes.
# selection.attr(name[, value])
If a value is specified, sets the attribute with the specified name to the specified value on the selected elements and returns this selection. If the value is a constant, all elements are given the same attribute value; otherwise, if the value is a function, the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to set each element’s attribute. A null value will remove the specified attribute.
If a value is not specified, returns the current value of the specified attribute for the first (non-null) element in the selection. This is generally useful only if you know that the selection contains exactly one element.
The specified name may have a namespace prefix, such as xlink:href
to specify the href
attribute in the XLink namespace. See namespaces for the map of supported namespaces; additional namespaces can be registered by adding to the map.
# selection.classed(names[, value])
If a value is specified, assigns or unassigns the specified CSS class names on the selected elements by setting the class
attribute or modifying the classList
property and returns this selection. The specified names is a string of space-separated class names. For example, to assign the classes foo
and bar
to the selected elements:
selection.classed("foo bar", true);
If the value is truthy, then all elements are assigned the specified classes; otherwise, the classes are unassigned. If the value is a function, then the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to assign or unassign classes on each element. For example, to randomly associate the class foo with on average half the selected elements:
selection.classed("foo", function() { return Math.random(); });
If a value is not specified, returns true if and only if the first (non-null) selected element has the specified classes. This is generally useful only if you know the selection contains exactly one element.
# selection.style(name[, value[, priority]])
If a value is specified, sets the style property with the specified name to the specified value on the selected elements and returns this selection. If the value is a constant, then all elements are given the same style property value; otherwise, if the value is a function, then the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to set each element’s style property. A null value will remove the style property. An optional priority may also be specified, either as null or the string important
(without the exclamation point).
If a value is not specified, returns the current computed value of the specified style property for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element. The computed value may be different than the previously-set value, particularly if it was set using a shorthand property (such as the font
style, which is shorthand for font-size
, font-face
, etc.).
Caution: unlike many SVG attributes, CSS styles typically have associated units. For example, 3px
is a valid stroke-width property value, while 3
is not. Some browsers implicitly assign the px
(pixel) unit to numeric values, but not all browsers do: IE, for example, throws an “invalid arguments” error!
# selection.property(name[, value])
Some HTML elements have special properties that are not addressable using attributes or styles, such as a form field’s text value
and a checkbox’s checked
boolean. Use this method to get or set these properties.
If a value is specified, sets the property with the specified name to the specified value on selected elements. If the value is a constant, then all elements are given the same property value; otherwise, if the value is a function, then the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to set each element’s property. A null value will delete the specified property.
If a value is not specified, returns the value of the specified property for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element.
# selection.text([value])
If a value is specified, sets the text content to the specified value on all selected elements, replacing any existing child elements. If the value is a constant, then all elements are given the same text content; otherwise, if the value is a function, then the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to set each element’s text content. A null value will clear the content.
If a value is not specified, returns the text content for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element.
# selection.html([value])
If a value is specified, sets the inner HTML to the specified value on all selected elements, replacing any existing child elements. If the value is a constant, then all elements are given the same inner HTML; otherwise, if the value is a function, then the function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The function’s return value is then used to set each element’s inner HTML. A null value will clear the content.
If a value is not specified, returns the inner HTML for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element.
Use selection.append instead to create data-driven content; this method is intended for when you want a little bit of HTML, say for rich formatting. Also, selection.html is only supported on HTML elements. SVG elements and other non-HTML elements do not support the innerHTML property, and thus are incompatible with selection.html. Consider using XMLSerializer to convert a DOM subtree to text. See also the innersvg polyfill, which provides a shim to support the innerHTML property on SVG elements.
# selection.append(type[, before])
If the specified type is a string, appends a new element of this type (tag name) as the last child of each element in the current selection. Otherwise, the type may be a function which is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. This function should return an element to be appended. Typically, the function creates a new element, but it may instead return an existing element. For example, to append a DIV element to each paragraph:
d3.selectAll("p").append("div");
This is equivalent to:
d3.selectAll("p").append(function() {
return document.createElement("DIV");
});
In both cases, this method returns a new selection containing the appended elements. Each new element inherits the data of the current elements, if any, in the same manner as selection.select.
An optional before selector string or function may be specified. For instance, the selector :first-child
will prepend nodes before the first child, rather than after the last child. If no before selector is specified on an enter selection, entering elements are inserted immediately before the next following sibling in the update selection, if any. This allows you to insert elements into the DOM in an order consistent with bound data. Note, however, the slower selection.order may still be required if updating elements change order. To append entering elements after the last child, explicitly specify a null before selector.
The specified name may have a namespace prefix, such as svg:text
to specify a text
attribute in the SVG namespace. See namespaces for the map of supported namespaces; additional namespaces can be registered by adding to the map. If no namespace is specified, the namespace will be inherited from the parent element; or, if the name is one of the known prefixes, the corresponding namespace will be used (for example, svg
implies svg:svg
).
# selection.remove()
Removes the selected elements from the document. Returns this selection (the removed elements) which are now detached from the DOM. There is not currently a dedicated API to add removed elements back to the document; however, you can pass a function to selection.append to re-add elements.
# selection.sort(compare)
Sorts each group of selected elements in-place according to the compare function, and then re-inserts the document elements to match the resulting order. Returns this selection.
The compare function, which defaults to ascending, is passed two elements’ data a and b to compare. It should return either a negative, positive, or zero value. If negative, then a should be before b; if positive, then a should be after b; otherwise, a and b are considered equal and the order is arbitrary.
Note that sorting is not guaranteed to be stable; however, it is guaranteed to have the same behavior as your browser’s built-in sort method on arrays.
# selection.order()
Re-inserts elements into the document such that the document order of each group matches the selection order. This is equivalent to calling selection.sort if the data is already sorted, but much faster.
# selection.raise()
Re-inserts each selected element, in order, as the last child of its parent. Equivalent to:
selection.each(function() {
this.parentNode.appendChild(this);
});
# selection.lower()
Re-inserts each selected element, in order, as the first child of its parent. Equivalent to:
selection.each(function() {
this.parentNode.insertBefore(this, this.parentNode.firstChild);
});
For an introduction to D3’s data joins, see Thinking With Joins. Also see the General Update Pattern examples.
# selection.data([data[, key]])
Joins the specified array of data with the selected elements, modifying this selection so that it represents the update selection: the elements successfully bound to data. Also defines the enter and exit selections, which can be used to add or remove elements to correspond to the new data. The specified data is an array of arbitrary values (e.g., numbers or objects), or a function that returns an array of values for each group. When data is assigned to an element, it is stored in the property __data__
, thus making the data “sticky” and available on re-selection.
The data is specified for each group in the selection. If the selection has multiple groups (such as d3.selectAll followed by selection.selectAll), then data should typically be specified as a function. This function will be invoked for each group in order, being passed the parent datum d (which may be undefined) and group index i, with the parent element as the this
context. For example, to create an HTML table from a matrix of numbers:
var matrix = [
[11975, 5871, 8916, 2868],
[ 1951, 10048, 2060, 6171],
[ 8010, 16145, 8090, 8045],
[ 1013, 990, 940, 6907]
];
var tr = d3.select("body").append("table")
.selectAll("tr")
.data(matrix)
.enter().append("tr");
var td = tr.selectAll("td")
.data(function(d) { return d; })
.enter().append("td")
.text(function(d) { return d; });
In this example the data function is the identity function: for each table row, it returns the corresponding row from the data matrix.
If a key function is not specified, then the first datum in data is assigned to the first selected element, the second datum to the second selected element, and so on. A key function may be specified to control which datum is assigned to which element, replacing the default join-by-index. This key function is evaluated for each selected element, in order, being passed the current datum d and index i, with the this
context as the current DOM element. The key function is then also evaluated for each new datum in data, being passed the datum d
and index i
, with the this
context as the parent DOM element. The datum for a given key is assigned to the element with the matching key. For example, given this document:
<div id="Ford"></div>
<div id="Jarrah"></div>
<div id="Kwon"></div>
<div id="Locke"></div>
<div id="Reyes"></div>
<div id="Shephard"></div>
You could join data by key as follows:
var data = [
{name: "Locke", number: 4},
{name: "Reyes", number: 8},
{name: "Ford", number: 15},
{name: "Jarrah", number: 16},
{name: "Shephard", number: 31},
{name: "Kwon", number: 34}
];
d3.selectAll("div")
.data(data, function(d) { return d ? d.name : this.id; })
.text(function(d) { return d.number; });
This key function uses the datum d if present, and otherwise falls back to the element’s id property. Since these elements were not previously bound to data, the datum d is null when the key function is evaluated on selected elements, and non-null when the key function is evaluated on the new data.
The update and enter selections are returned in data order, while the exit selection preserves the selection order prior to the join. If a key function is specified, the order of elements in the selection may not match their order in the document; use selection.order or selection.sort as needed. For more on how the key function affects the join, see A Bar Chart, Part 2 and Object Constancy.
If data is not specified, this method returns the array of data for the selected elements.
This method cannot be used to clear bound data; use selection.datum instead.
# selection.enter()
Returns the enter selection: placeholder nodes for each datum that had no corresponding DOM element in the selection. The enter selection is determined by the previous selection.data, and is thus empty until the selection is joined to data. If the enter selection is retrieved more than once after a data join, subsequent calls return the empty selection.
The enter selection is typically used to create “missing” elements corresponding to new data. For example, to create DIV elements from an array of numbers:
var div = d3.select("body").selectAll("div");
div.data([4, 8, 15, 16, 23, 42]);
div.enter().append("div").text(function(d) { return d; });
If the body is initially empty, the above code will create six new DIV elements, append them to the body in-order, and assign their text content as the associated (string-coerced) number:
<div>4</div>
<div>8</div>
<div>15</div>
<div>16</div>
<div>23</div>
<div>42</div>
Conceptually, the enter selection’s placeholders are pointers to the parent element (in this example, the document body). The enter selection is typically only used transiently to append elements.
The enter selection merges into the update selection on append or select. This enables you to first modify entering and updating elements separately, as needed, and then modify entering and updating elements together, avoiding duplicate code. For example:
var circle = svg.selectAll("circle");
circle.data(data);
circle.exit().remove(); // remove exiting elements
circle.attr(…); // modify ONLY updating elements
circle.enter().append("circle").attr(…); // modify ONLY entering elements
circle.attr(…); // modify BOTH updating AND entering elements
# selection.exit()
Returns the exit selection: existing DOM elements in the selection for which no new datum was found. The exit selection is determined by the previous selection.data, and is thus empty until the selection is joined to data. If the exit selection is retrieved more than once after a data join, subsequent calls return the empty selection.
The exit selection is typically used to remove “superfluous” elements corresponding to old data. For example, to update the DIV elements created previously with a new array of numbers:
div.data([1, 2, 4, 8, 16, 32], function(d) { return d; });
Since a key function was specified (as the identity function), and the new data contains the numbers [4, 8, 16] which match existing elements in the document, the update selection contains three DIV elements. Leaving those elements as-is, we can append new elements for [1, 2, 32] using the enter selection:
div.enter().append("div").text(function(d) { return d; });
Likewise, to remove the exiting elements [15, 23, 42]:
div.exit().remove();
Now the document body looks like this:
<div>1</div>
<div>2</div>
<div>4</div>
<div>8</div>
<div>16</div>
<div>32</div>
The order of the DOM elements matches the order of the data because the old data’s order and the new data’s order were consistent. If the new data’s order is different, use selection.order to reorder the elements in the DOM. See the General Update Pattern example thread for more on data joins.
# selection.datum([value])
Gets or sets the bound data for each selected element. Unlike selection.data, this method does not compute a join and does not affect indexes or the enter and exit selections.
If a value is specified, sets the element’s bound data to the specified value on all selected elements. If the value is a constant, all elements are given the same datum; otherwise, if the value is a function, then the function is evaluated for each selected element, in order, being passed the previous datum d
and the current index i
, with the this
context as the current DOM element. The function is then used to set each element’s data. A null value will delete the bound data.
If a value is not specified, returns the bound datum for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element.
This method is useful for accessing HTML5 custom data attributes. For example, given the following elements:
<ul id="list">
<li data-username="shawnbot">Shawn Allen</li>
<li data-username="mbostock">Mike Bostock</li>
</ul>
You can expose the custom data attributes by setting each element’s data as the built-in dataset property:
selection.datum(function() { return this.dataset; })
For interaction, selections allow listening for and dispatching of events.
# selection.on(type[, listener[, capture]])
Adds or removes a listener to each selected element for the specified event type. The type is a string event type name, such as click
, mouseover
, or submit
; any DOM event type supported by your browser may be used. The listener is invoked for each selected element, being passed the current datum d and index i, with the this
context as the current DOM element. Listeners always see the latest datum for their element, but the index is a property of the selection and is fixed when the listener is assigned; to update the index, re-assign the listener. To access the current event within a listener, use d3.event.
If an event listener was previously registered for the same type on a selected element, the old listener is removed before the new listener is added. To register multiple listeners for a given type, the type may be followed by an optional name, such as click.foo
and click.bar
. To remove a listener, pass null as the listener. To remove all listeners for a given name, pass null as the listener and .foo
as the type, where foo is the name.
An optional capture flag may be specified which corresponds to the W3C useCapture flag: “After initiating capture, all events of the specified type will be dispatched to the registered EventListener before being dispatched to any EventTargets beneath them in the tree. Events which are bubbling upward through the tree will not trigger an EventListener designated to use capture.”
If a listener is not specified, returns the currently-assigned listener for the specified event type on the first (non-null) selected element, if any.
# selection.dispatch(type[, parameters])
Dispatches a custom event of the specified type to each selected element, in order. An optional parameters map may be specified to set additional properties of the event. It may contain the following fields:
bubbles
- if true, the event is dispatched to ancestors in reverse tree order.cancelable
- if true, event.preventDefault is allowed.detail
- any custom data associated with the event.If parameters is a function, it is evaluated for each selected element, in order, being passed the current datum d
and index i
, with the this
context as the current DOM element. It must return the parameters map for the current element.
# d3.event
The current event, if any. This is set during the invocation of an event listener, and is reset after the listener terminates. Use this to access standard event fields such as event.timeStamp and methods such as event.preventDefault. While you can use the native event.pageX and event.pageY, it is often more convenient to transform the event position to the local coordinate system of the container that received the event using d3.mouse, d3.touch or d3.touches.
# d3.mouse(container)
Returns the x and y coordinates of the current event relative to the specified container. The container may be an HTML or SVG container element, such as a G element or an SVG element. The coordinates are returned as a two-element array of numbers [x, y].
# d3.touch(container[, touches], identifier)
Returns the x and y coordinates of the touch with the specified identifier associated with the current event relative to the specified container. The container may be an HTML or SVG container element, such as a G element or an SVG element. The coordinates are returned as an array of two-element arrays of numbers [[x1, y1], [x2, y2], …]. If there is no touch with the specified identifier in touches, returns null; this can be useful for ignoring touchmove events where the only some touches have moved. If touches is not specified, it defaults to the current event’s changedTouches property.
# d3.touches(container[, touches])
Returns the x and y coordinates of the touches associated with the current event relative to the specified container. The container may be an HTML or SVG container element, such as a G element or an SVG element. The coordinates are returned as an array of two-element arrays of numbers [[x1, y1], [x2, y2], …]. If touches is not specified, it defaults to the current event’s touches property.
For advanced usage, selections provide methods for custom control flow.
# selection.each(function)
Invokes the specified function for each selected element, passing in the current datum d
and index i
, with the this
context of the current DOM element. This method is used internally by many transformation methods and can be used to invoke arbitrary code for each selected element.
# selection.call(selection[, arguments…])
Invokes the specified function (exactly once), passing in the current selection along with any optional arguments. Returns the current selection. This is equivalent to invoking the function by hand but facilitates method chaining. For example, to set several attributes in a reusable function:
function name(selection, first, last) {
selection
.attr("first-name", first)
.attr("last-name", last);
}
Now say:
d3.selectAll("div").call(name, "John", "Snow");
This is equivalent to:
name(d3.selectAll("div"), "John", "Snow");
# selection.empty()
Returns true if this selection is empty. A selection is empty if it contains no elements, or all elements are null.
# selection.nodes()
Returns an array of all (non-null) elements in this selection.
# selection.node()
Returns the first (non-null) element in this selection. If the selection is empty, returns null.
# selection.size()
Returns the total number of elements in this selection.
XML namespaces are fun! Right? Fortunately you can mostly ignore them.
# d3.namespace(name)
Qualifies the specified name, which may or may not have a namespace prefix. If the name contains a colon (:
), the substring before the colon is interpreted as the namespace prefix, which must be registered in d3.namespaces. Returns an object space
and local
attributes describing the full namespace URL and the local name. For example:
d3.namespace("svg:text"); // {space: "http://www.w3.org/2000/svg", local: "text"}
If the name does not contain a colon, this function merely returns the input name.
# d3.namespaces
The map of registered namespace prefixes. The initial value is:
{
svg: "http://www.w3.org/2000/svg",
xhtml: "http://www.w3.org/1999/xhtml",
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
}
Additional prefixes may be assigned as needed to create elements or attributes in other namespaces.
FAQs
Data-driven DOM manipulation: select elements and join them to data.
We found that d3-selection demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
Security News
NVD’s backlog surpasses 20,000 CVEs as analysis slows and NIST announces new system updates to address ongoing delays.
Security News
Research
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.