Ich habe ein Kreisdiagramm mit Chart.js erstellt und möchte feststellen, ob ein Segment über dem Diagramm liegt. Ich habe eine Menge Dokumentation über die Manipulation der Tooltips gefunden, die angezeigt werden, wenn ich über Segmente segle, aber nichts darüber, etwas anderes zu tun, wenn ein Tooltip erscheint. Ist das möglich? KeinErkennen von Hover-Ereignissen über Teile eines Diagramms mithilfe von Chart.js
Antwort
...
Es gibt nichts in der ChartJS API außer Kraft zu setzen oder den Tooltip zu erweitern,
Aber eine Abhilfe ...
können Sie ändern die draw
Methode der Chart.Tooltip
Klasse. Dies würde es Ihnen ermöglichen, "etwas anderes zu tun", wenn der Tooltip normalerweise von ChartJS gerendert würde.
Die Auslosung Methode, die Sie in beginnt in Zeile 1351 der Quelle hier binden wollen:
https://github.com/nnnick/Chart.js/blob/master/src/Chart.Core.js
ich dies bereits eine akzeptierte Antwort gegeben wurde, wissen, und ich bin nicht sicher, ob dies Ihr nicht erfüllt Anwendungsfall, aber Chart js veröffentlichte ein Update (vielleicht vor einem Monat oder so), das benutzerdefinierte Tooltips erlaubt. Dadurch kann eine benutzerdefinierte Funktion ausgeführt werden, wenn eine QuickInfo normalerweise gezeichnet wurde. Sie haben ein Beispiel, in dem Beispielabschnitt git Nabe
kurzum Sie eine benutzerdefinierte Funktion
Chart.defaults.global.customTooltips = function(tooltip){//do what you want}
hier definieren, ist das Beispiel, das sie in den Proben gibt mit einem zusätzlichen kleinen Text zu einem HTML-Tooltip hinzugefügt. Die einzige nervige Sache, die ich sehe, ist, dass das Segment/Punkt/Balken, die diesen Tooltip ausgelöst hat, nicht verfügbar wäre, was wirklich praktisch wäre, da Sie mit der Kenntnis dieser Informationen etwas tun könnten, aber Sie erhalten die Tooltip-Daten kann stattdessen etwas damit machen.
Chart.defaults.global.customTooltips = function (tooltip) {
// Tooltip Element
var tooltipEl = $('#chartjs-tooltip');
// Hide if no tooltip
if (!tooltip) {
tooltipEl.css({
opacity: 0
});
return;
}
// Set caret Position
tooltipEl.removeClass('above below');
tooltipEl.addClass(tooltip.yAlign);
// Set Text
tooltipEl.html(tooltip.text+ " anythign custom you want");
// Find Y Location on page
var top;
if (tooltip.yAlign == 'above') {
top = tooltip.y - tooltip.caretHeight - tooltip.caretPadding;
} else {
top = tooltip.y + tooltip.caretHeight + tooltip.caretPadding;
}
// Display, position, and set styles for font
tooltipEl.css({
opacity: 1,
left: tooltip.chart.canvas.offsetLeft + tooltip.x + 'px',
top: tooltip.chart.canvas.offsetTop + top + 'px',
fontFamily: tooltip.fontFamily,
fontSize: tooltip.fontSize,
fontStyle: tooltip.fontStyle,
});
};
var pieData = [{
value: 300,
color: "#F7464A",
highlight: "#FF5A5E",
label: "Red"
}, {
value: 50,
color: "#46BFBD",
highlight: "#5AD3D1",
label: "Green"
}, {
value: 100,
color: "#FDB45C",
highlight: "#FFC870",
label: "Yellow"
}, {
value: 40,
color: "#949FB1",
highlight: "#A8B3C5",
label: "Grey"
}, {
value: 120,
color: "#4D5360",
highlight: "#616774",
label: "Dark Grey"
}];
var ctx1 = document.getElementById("chart-area1").getContext("2d");
window.myPie = new Chart(ctx1).Pie(pieData);
var ctx2 = document.getElementById("chart-area2").getContext("2d");
window.myPie = new Chart(ctx2).Pie(pieData);
#canvas-holder {
width: 100%;
margin-top: 50px;
text-align: center;
}
#chartjs-tooltip {
opacity: 1;
position: absolute;
background: rgba(0, 0, 0, .7);
color: white;
padding: 3px;
border-radius: 3px;
-webkit-transition: all .1s ease;
transition: all .1s ease;
pointer-events: none;
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
#chartjs-tooltip.below {
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
#chartjs-tooltip.below:before {
border: solid;
border-color: #111 transparent;
border-color: rgba(0, 0, 0, .8) transparent;
border-width: 0 8px 8px 8px;
bottom: 1em;
content:"";
display: block;
left: 50%;
position: absolute;
z-index: 99;
-webkit-transform: translate(-50%, -100%);
transform: translate(-50%, -100%);
}
#chartjs-tooltip.above {
-webkit-transform: translate(-50%, -100%);
transform: translate(-50%, -100%);
}
#chartjs-tooltip.above:before {
border: solid;
border-color: #111 transparent;
border-color: rgba(0, 0, 0, .8) transparent;
border-width: 8px 8px 0 8px;
bottom: 1em;
content:"";
display: block;
left: 50%;
top: 100%;
position: absolute;
z-index: 99;
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
<script src="https://raw.githack.com/chartjs/Chart.js/v1.1.1/Chart.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="canvas-holder">
<canvas id="chart-area1" width="50" height="50" />
</div>
<div id="canvas-holder">
<canvas id="chart-area2" width="300" height="300" />
</div>
<div id="chartjs-tooltip"></div>
Die Art, wie ich es zu tun habe, ist etwas einfacher: vorausgesetzt, Sie bereits einen Code haben die Definition der Leinwand wie canvas = document.getElementById("chart");
und Ihr Kreisdiagramm ist window.myPie
. Sie können die onmousemove verwenden JavaScript-Event oder jQuery
canvas.onmousemove = function(evt) {
var el = window.myPie.getElementsAtEvent(evt);
//do something with the el object to display other information
//elsewhere on the page
}
schweben In meinem Fall eine Tabellenzeile markieren basierend auf dem Wert von el[0]._index
Wenn ein kleiner Trick customTooltip auch gefunden. Ich suchte nach einer Lösung, um ein Ereignis zu erhalten, wenn der Benutzer mit der Maus über einen Wert bewegt und ein Tooltip angezeigt wird. Hauptsächlich möchte ich neben den rohen Plot-Werten auch Detailinformationen in einem anderen Rahmen präsentieren.
Der benutzerdefinierte Tooltipp wird mit tooltip.draw() gezeichnet, aber dies ruft die benutzerdefinierte Methode auf. Ich setze es auf false, um eine rekursive Schleife zu vermeiden, rufe das Standardverhalten auf und nimm die Daten, die ich für meinen Callback benötige (OnEntrySelected), was in diesem Fall die Zeichenfolge der x-Achsenbeschriftung ist. Dieses Ereignis wird immer dann ausgelöst, wenn der Tooltip angezeigt wird.
Für v2.0 Version:
Chart.defaults.global.hover.onHover = function(x) {
if(x[0]) {
var index = x[0]._index;
// Place here your code
}
};
Leider brach dieser Ansatz in v2.5 und neuer (derzeit v2.7). Gegeben Optionen: {Hover: {Modus: True}} wird es rufen Sie 'onHover' erneut auf, aber geben Sie' x' nicht mit dem Zugriff auf das aktuelle Hover-Element, wie in Version 2.4, am besten mit einem benutzerdefinierten Label-Ansatz (auch wenn Sie keine Labels zeichnen) – Ecker00
Ab 'v2.5' Parameter von 'onHover' callb Ack hat sich geändert. Siehe [chart.js onHover funktioniert nicht] (https://stackoverflow.com/a/47547499/4816207) –
- 1. Plotten von JSON-Daten in ein Diagramm mithilfe von Chart.js
- 2. mithilfe eines Httpcontext über Threads
- 3. Zeichnen eines interaktiven Diagramms
- 4. Erstellen eines Diagramms in HTML5 mit Charts.js
- 5. Diagramm von chart.js to pdf
- 6. Weiterleiten eines bestimmten Schlüssels über die Befehlszeile mithilfe von ssh
- 7. Xamarin.Forms: Erstellen eines Diagramms
- 8. Schneiden eines Diagramms
- 9. Aktualisieren eines DBML-Diagramms?
- 10. C# Echtzeitaktualisierung eines Diagramms
- 11. Erkennen von Browser in ASP.NET mithilfe von RegEx
- 12. Verwenden von Datenbankeinträgen zum dynamischen Erstellen eines Visio-Diagramms
- 13. Erkennen eines Hyperlinks von jquery
- 14. Wie zeigt man $ \ {X_t \} $ im Titel eines Diagramms von R
- 15. Aktualisieren eines Diagramms von einer ArrayList im Laufe der Zeit?
- 16. Chart.js Farbe von Bar ändern
- 17. Senden von Audiodaten über ein Netzwerk mithilfe von PortAudio
- 18. Probleme beim Erkennen von Gesten über ListView
- 19. Umbenennen eines Tabellenpräfixes mithilfe von Platzhaltern
- 20. Durchsuchen eines Dateiinhalts mithilfe von Java?
- 21. Festlegen eines Elementwerts mithilfe von HTML-Entitäten
- 22. Ausblenden/Deaktivieren von Tooltips chart.js
- 23. SAPUI5 unter Verwendung von chart.js
- 24. Ändern der Farbe eines bestimmten Diagramms Punkt
- 25. Generieren eines E-R-Diagramms durch Reverse-Engineering einer Datenbank
- 26. eckig-chart.js tickmark issue
- 27. Erstellen eines Diagramms mit Tabelle in SSRS
- 28. Verwenden von Farbverlauf in eckigen-chart.js
- 29. Erkennen eines Chroot-Gefängnisses innerhalb von
- 30. HTML in Chart.js Etiketten
Haben Sie versucht mit [JQuery Hover] (https://api.jquery.com/hover/)? Sie könnten eine Funktion an das Element Hover-Ereignis binden, wie zum Beispiel: '$ (" # chart) .hover (function() {// code here}) ' – jmartins
@jmartins Ich suche nach Hover-Ereignissen in den einzelnen Segmenten. Unglücklicherweise verwendet Chart.js Canvas, also ist das ganze Diagramm nur ein Element. – Hydrothermal