Mil*_*ell 9 javascript jquery snapshot save d3.js
我用它D3.js以交互式和动态的方式可视化几个数据集.用户可以通过加载组合其他数据和视图来浏览所有图形并检索数据的各个视图.我希望用户能够通过等方式共享他们在数据中找到的宝藏mail,facebook但在某种程度上,访问共享"快照"的新用户可以继续探索数据.所以我需要
作为一个尽可能简单的例子(将会有各种图形和许多事件),想象一下有一个简单的d3线图和
graph.selectAll("path").on('mouseover', function(d){
$.get("ajaxFunction",{"d" : d} ,function(jsonData) {
//INIT NEW SVG
});
});
Run Code Online (Sandbox Code Playgroud)
这个新的动态加载页面包含几个svgs.但是如果我只是保存每个svg的形状和位置,就很难跟踪所有当前的事件绑定.如果我保存前用户执行的每个操作,我怎样才能有效地重新加载快照?
我能想象到的最简单的事情是循环遍历所有节点,将其身份和状态存储为哈希值,然后使用ajax将该哈希值作为json发送回服务器,并将哈希值与返回到服务器的密钥一起放入数据库中。用户作为 url。当访问 url 时,您将加载 d3js 对象并运行哈希,将每个节点的状态设置为原来的状态。
获取节点的状态需要更多 d3js 知识。
您显示什么类型的数据?您也许应该能够向您的 js 添加一个事件寄存器并记录所有执行的事件。通过事件调用者。
例如说我有以下数据
{"Things":{
"Balls":{
"Footballs":"",
"Basketballs":""
},
"Persons":{
"Painter":{
"Pablo":"","Robert":""
},
"Programmers":{
"Robert":""}}}
Run Code Online (Sandbox Code Playgroud)
您应该并且想要在单击鼠标时显示/隐藏该树的节点。
你应该能够做这样的事情
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})
}
})
Run Code Online (Sandbox Code Playgroud)
这样你最终应该得到这样的东西
[{"action" : "close", "id" : "id"},{"action" : "close", "id" : "someotherid"},{"action" : "close", "id" : "someid"}]
Run Code Online (Sandbox Code Playgroud)
这样你就有了一个可存储的状态!可以执行。