我使用D3.js
以交互式和动态的方式可视化几个数据集。用户可以浏览所有图形,并通过加载组合的附加数据和视图来检索数据的各个视图。我希望用户能够通过mail
、facebook
等共享他们在数据中发现的宝藏,但在某种程度上,新用户访问共享的"快照"可以继续探索数据。所以我需要
- 保持我的动态网页的当前状态
- 能够快速加载并显示此状态
- 绑定用户快照瞬间已绑定的所有事件
作为一个尽可能简单的示例(将有各种图表和许多事件),想象一下有一个简单的d3线形图和
graph.selectAll("path").on('mouseover', function(d){
$.get("ajaxFunction",{"d" : d} ,function(jsonData) {
//INIT NEW SVG
});
});
这个新的动态加载页面包含几个svg
s。但如果我只是保存每个svg的形状和位置,可能很难跟踪所有当前事件绑定。如果我保存前用户所做的每一个操作,我如何才能有效地重新加载快照?
我能想象的最简单的事情是在所有节点上循环,将其身份和状态存储为哈希,然后使用ajax将该哈希作为json发送回服务器,并将该哈希与作为url返回给用户的密钥一起放入数据库。访问url时,加载d3js对象并运行hash,将每个节点的状态设置为原来的状态。
获取节点的状态需要d3js中更多的知识。
您正在显示什么类型的数据?您也许应该在js中添加一个事件寄存器,并记录所有执行的事件。通过事件调用程序。
例如说我有以下数据
{"Things":{
"Balls":{
"Footballs":"",
"Basketballs":""
},
"Persons":{
"Painter":{
"Pablo":"","Robert":""
},
"Programmers":{
"Robert":""}}}
您应该并且希望在单击鼠标时显示/隐藏此树的节点。
你应该能够做一些类似的事情
var eventlog = [];
$(".nodes").onClick(function(this){
if (isClosed(this)){
function_to_open_node();
eventlog.append({"action" : "open", "id" : this.id})
}else{
function_to_close_node();
eventlog.append({"action" : "close", "id" : this.id})
}
})
这样你就应该得到这样的
[{"action" : "close", "id" : "id"},{"action" : "close", "id" : "someotherid"},{"action" : "close", "id" : "someid"}]
这样你就有了可储存的状态!可以执行。