从示例here开始,我知道如何创建一个显示悬停时工具提示的Flot图。但这些示例仅显示如何显示包含x值,y值,标签等的工具提示,我无法弄清楚如何创建更多自定义工具提示。
是否有可以附加自定义数据的地方,我可以在创建工具提示时访问?
例如,为了简化,让我们假设我的代码如下:
var d = [ { label: "Fake!", data: [ [1290802154, 0.3], [1292502155, 0.1] ] } ];
var options = {
xaxis: { mode: "time" },
series: {
lines: { show: true },
points: { show: true }
},
grid: { hoverable: true, clickable: true }
};
$.plot($("#placeholder"), d, options);
现在,当点击第一个数据点时,我希望工具提示显示“Hello”,当点击第二个数据点时,我想显示“Bye”。我该怎么做呢?绑定plothover事件时
$(".placeholder").bind("plothover", function (event, pos, item) { /* etc. */ };
我不确定“item”是指什么,以及如何将数据附加到它。
答案 0 :(得分:14)
只需将数据添加到数据数组中即可将数据添加到系列中。
而不是
$.plot(element, [[1, 2], [2, 4]] ...)
你可以
$.plot(element, [[1, 2, "label"], [2, 4, "another label"]] ...)
然后使用该信息显示自定义标签。
查看完整示例的小提琴: http://jsfiddle.net/UtcBK/328/
答案 1 :(得分:8)
这是我掀起的粗略JSFiddle example。不确定它是否正常运行,但可能会引发一个想法...
<强> [更新] 强>
你想要绑定到
$("#placeholder").bind("plotclick", function (event, pos, item) {/* code */});
点击活动的活动
[update2] Updated Example
我已经调整了示例以使用您的测试数据,并使用上述内容进行更多操作。至于item
对象,它似乎是动态生成的,所以从我所知道的,你不能向它添加额外的数据。但是,您可以创建一个数组,以便在单击时缓存item
个对象,并向其添加其他数据并将其用于hover
事件。
这个新示例就是这样,它显示了没有点击任何内容时的正常工具提示。但是一旦点击它,它确定点击的点是第一个还是第二个,并向名为item
的{{1}}对象添加一个附加属性,并将其存储在名为alternateText
的数组中。
现在当一个点悬停在它上面时,它会根据当前itemsClicked
对象的相同索引检查数组中是否存在缓存的item
对象,该对象是通过{{1 }}。如果缓存数组item
中存在匹配的索引,它将从中获取item.dataIndex
对象,并使用之前itemsClicked
事件期间添加的item
属性。 / p>
第一个点的alternateText
对象看起来像这样:
click
点击后,它将如下所示并存储在item
数组中:
item : {
dataIndex: 0,
datapoint: [
1290802154,
0.3
],
pageX: 38,
pageY: 82,
series: {/* properties of the series that this point is in */},
seriesIndex: 0
}
请告诉我这些是否有帮助,如果不是,我会闭嘴并停止更新我的答案:P
答案 2 :(得分:3)
您也可以尝试以下代码:
HTML正文:
<div id="content">
<div class="demo-container">
<div id="placeholder" class="demo-placeholder"></div>
</div>
</div>
<强>脚本:强>
<script type="text/javascript">
function showTooltip(x, y, contents, z) {
$('<div id="tooltip">' + contents + '</div>').css({
position: 'absolute',
display: 'none',
top: y - 30,
left: x - 110,
'font-weight':'bold',
border: '1px solid rgb(255, 221, 221)',
padding: '2px',
'background-color': z,
opacity: '0.8'
}).appendTo("body").show();
};
$(document).ready(
$(function () {
var data = [{
"label": "scott",
"data": [[1317427200000 - 5000000 * 3, "17017"], [1317513600000 - 5000000 * 5, "77260"]]
},
{
"label": "martin",
"data": [[1317427200000 - 5000000 * 2, "96113"], [1317513600000 - 5000000 * 4, "33407"]]
},
{
"label": "solonio",
"data": [[1317427200000 - 5000000, "13041"], [1317513600000 - 5000000 * 3, "82943"]]
},
{
"label": "swarowsky",
"data": [[1317427200000, "83479"], [1317513600000 - 5000000 * 2, "96357"], [1317600000000 - 5000000, "55431"]]
},
{
"label": "elvis",
"data": [[1317427200000 + 5000000, "40114"], [1317513600000 - 5000000 * 1, "47065"]]
},
{
"label": "alan",
"data": [[1317427200000 + 5000000 * 2, "82504"], [1317513600000, "46577"]]
},
{
"label": "tony",
"data": [[1317513600000 + 5000000, "88967"]]
},
{
"label": "bill",
"data": [[1317513600000 + 5000000 * 2, "60187"], [1317600000000, "39090"]]
},
{
"label": "tim",
"data": [[1317513600000 + 5000000 * 3, "95382"], [1317600000000 + 5000000, "89699"]]
},
{
"label": "britney",
"data": [[1317513600000 + 5000000 * 4, "76772"]]
},
{
"label": "logan",
"data": [[1317513600000 + 5000000 * 5, "88674"]]
}];
var options = {
series: {
bars: {
show: true,
barWidth: 60 * 60 * 1000,
align: 'center'
}
},
points: {
show: true
},
lines: {
show: true
},
grid: { hoverable: true, clickable: true },
yaxes: {
min: 0
},
xaxis: {
mode: 'time',
timeformat: "%b %d",
minTickSize: [1, "month"],
tickSize: [1, "day"],
autoscaleMargin: .10
}
};
$(function () {
$.plot($('#placeholder'), data, options);
});
$(function () {
var previousPoint = null;
$("#placeholder").bind("plothover", function (event, pos, item) {
if (item) {
if (previousPoint != item.datapoint) {
previousPoint = item.datapoint;
$("#tooltip").remove();
var x = item.datapoint[0],
y = item.datapoint[1] - item.datapoint[2];
debugger;
showTooltip(item.pageX, item.pageY, y + " " + item.series.label, item.series.color);
}
}
else {
$("#tooltip").remove();
previousPoint = null;
}
})
});
})
);
</script>