Data for alternate implementation.

This commit is contained in:
Michael Bostock 2010-10-22 22:32:14 -07:00
Родитель 0c3e453601
Коммит a4f5945eea
2 изменённых файлов: 130 добавлений и 62 удалений

Просмотреть файл

@ -6,13 +6,18 @@
<script type="text/javascript" src="d3.alt.js"></script>
</head>
<body>
<div>1</div>
<div>2</div>
<table>
<tr><td>0,0</td><td>0,1</td></tr>
<tr><td>1,0</td><td>1,1</td></tr>
</table>
<script type="text/javascript">
d3.select("body")
.selectAll("div")
.attr("style", "color:red;");
d3.select("table")
.selectAll("tr")
.data(function() { return [0, 2]; })
.selectAll("td")
.data(function(d) { return [0 + d, 1 + d]; })
.text(function(d) { return d; });
</script>
</body>

177
d3.alt.js
Просмотреть файл

@ -1,6 +1,9 @@
(function(_) {
var d3 = _.d3 = d3_selection([document]);
var d3_root = [[document]],
d3 = _.d3 = d3_selection(d3_root);
d3_root[0].data = [];
d3.ns = {
prefix: {
@ -10,11 +13,6 @@
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
},
resolve: function(prefix) {
return d3.ns.prefix[prefix] || null;
},
qualify: function(name) {
var i = name.indexOf(":");
return i < 0 ? name : {
@ -24,57 +22,76 @@
}
};
function d3_selection(nodes, denodes) {
var i,
n = nodes.length;
function d3_array(psuedoarray) {
return Array.prototype.slice.call(psuedoarray);
}
// TODO attr(name, function)
// TODO style(name, function, priority)
// TODO text(function)
// TODO html(function)
function d3_blend(arrays) {
return Array.prototype.concat.apply([], arrays);
}
// TODO select(node)
// TODO select(function)
// TODO selectAll(node[])
// TODO selectAll(function)
// TODO append(node)
// TODO append(function)?
// TODO remove(node)?
// TODO remove(function)?
// TODO event
// TODO on?
// TODO data
// TODO enter
// TODO exit
// TODO transition
// TODO delay
// TODO duration
// TODO easing
function d3_selection(groups, deselect) {
var nodes = d3_blend(groups);
// TODO select(node)?
// TODO select(function)?
nodes.select = function(query) {
var select = [];
i = -1; while (++i < n) select.push(nodes[i].querySelector(query));
return d3_selection(select, nodes);
return d3_selection(groups.map(function(group) {
var subgroup = group.map(function(node) {
return node.querySelector(query);
});
subgroup.data = group.data;
return subgroup;
}), nodes);
};
// TODO selectAll(node[])?
// TODO selectAll(function)?
nodes.selectAll = function(query) {
var all = [],
select;
i = -1; while (++i < n) {
select = nodes[i].querySelectorAll(query);
j = -1; m = select.length; while (++j < m) all.push(select[j]);
}
return d3_selection(all, nodes);
return d3_selection(d3_blend(groups.map(function(group) {
return group.map(function(node) {
var subgroup = d3_array(node.querySelectorAll(query));
subgroup.data = [node.__data__].concat(group.data);
return subgroup;
});
})), nodes);
};
nodes.deselect = function() {
return denodes;
return deselect;
};
// TODO data(function)
// TODO data(null)
// TODO key
// TODO enter
// TODO exit
nodes.data = function(data) {
if (arguments.length < 1) {
return nodes.map(function(node) {
return node.__data__;
});
}
if (typeof data == "function") {
for (var i = 0, n = groups.length; i < n; i++) {
var group = groups[i],
groupData = data.apply(nodes, group.data);
for (var j = 0, m = group.length; j < m; j++) {
group[j].__data__ = groupData[j];
}
}
} else {
for (var i = 0, n = groups.length; i < n; i++) {
var group = groups[i];
for (var j = 0, m = group.length; j < m; j++) {
group[j].__data__ = data[j];
}
}
}
return nodes;
};
// TODO attr(name, function)
nodes.attr = function(name, value) {
name = d3.ns.qualify(name);
if (arguments.length < 2) {
@ -82,55 +99,89 @@
? function(e) { return e.getAttributeNS(name.space, name.local); }
: function(e) { return e.getAttribute(name); });
}
i = -1;
if (name.local) {
if (value == null) {
while (++i < n) nodes[i].removeAttributeNS(name.space, name.local);
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].removeAttributeNS(name.space, name.local);
}
} else {
while (++i < n) nodes[i].setAttributeNS(name.space, name.local, value);
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].setAttributeNS(name.space, name.local, value);
}
}
} else {
if (value == null) {
while (++i < n) nodes[i].removeAttribute(name);
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].removeAttribute(name);
}
} else {
while (++i < n) nodes[i].setAttribute(name, value);
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].setAttribute(name, value);
}
}
}
return nodes;
};
// TODO style(name, function, priority)
nodes.style = function(name, value, priority) {
if (arguments.length < 2) {
return nodes.map(function(e) {
return window.getComputedStyle(e, null).getPropertyValue(name);
});
}
i = -1; while (++i < n) nodes[i].style.setProperty(name, value, priority);
if (arguments.length < 3) priority = null;
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].style.setProperty(name, value, priority);
}
return nodes;
};
// TODO text(function)
nodes.text = function(value) {
if (arguments.length < 1) {
return nodes.map(function(e) {
return e.textContent;
});
}
i = -1; while (++i < n) {
var node = nodes[i];
while (node.lastChild) node.removeChild(node.lastChild);
node.appendChild(document.createTextNode(value));
if (typeof value == "function") {
for (var i = 0, n = groups.length; i < n; i++) {
var group = groups[i],
data = group.data;
data.unshift(null);
for (var j = 0, m = group.length; j < m; j++) {
var node = group[j];
data[0] = node.__data__;
while (node.lastChild) node.removeChild(node.lastChild);
node.appendChild(document.createTextNode(value.apply(nodes, data)));
}
data.shift();
}
} else {
for (var i = 0, n = nodes.length; i < n; i++) {
var node = nodes[i];
while (node.lastChild) node.removeChild(node.lastChild);
node.appendChild(document.createTextNode(value));
}
}
return nodes;
};
// TODO html(function)
nodes.html = function(value) {
if (arguments.length < 1) {
return nodes.map(function(e) {
return e.innerHTML;
});
}
i = -1; while (++i < n) nodes[i].innerHTML = value;
for (var i = 0, n = nodes.length; i < n; i++) {
nodes[i].innerHTML = value;
}
return nodes;
};
// TODO append(node)
// TODO append(function)?
nodes.append = function(name) {
var children;
name = d3.ns.qualify(name);
@ -146,14 +197,26 @@
return d3_selection(children, nodes);
};
// TODO remove(node)?
// TODO remove(function)?
nodes.remove = function() {
i = -1; while (++i < n) {
for (var i = 0, n = nodes.length; i < n; i++) {
var node = nodes[i];
node.parentNode.removeChild(node);
}
return nodes.deselect();
};
// TODO event
// TODO on?
// TODO filter, slice? or d3.selectAll(node[])?
// TODO transition
// TODO delay
// TODO duration
// TODO easing
return nodes;
}