Sto provando ad aggiungere un po 'di pizazz a un Google ColumnChart aggiungendo una sfumatura alle rec di SVG disegnate per le colonne. Il codice seguente aggiungerà sfumature all'iframe svg> defs e sostituirà correttamente l'attributo fill delle rects in tutti i browser a cui tengo in questo momento (versioni successive di Firefox, IE e Chrome).Aggiunta di una sfumatura a Google-Visualization ColumnChart
Il mio problema è che ogni volta che si passa il mouse sopra o si seleziona una barra (o la legenda), il colore viene ripristinato sul colore originale. Sono un noob SVG e non sono stato in grado di capire come, dove o cosa è il ripristino del colore.
Quindi la mia domanda è qualcuno sa come (utilizzando javascript/jquery) per interrompere, sovrascrivere o in qualche modo manipolare il codice che ripristina i colori? Preferirei mantenere intatte le parti 'interattive' (tooltip, ecc.), Se possibile.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Visualization API Sample</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1', {packages: ['corechart']});
google.load("jquery", "1.7.1");
</script>
<script type="text/javascript">
function drawVisualization() {
// Create and populate the data table.
var data = new google.visualization.DataTable();
var rowData = [['Year', 'North', 'West', 'South'],
['2010', 197, 333, 298 ],
['2011', 167, 261, 381 ]];
var data = google.visualization.arrayToDataTable(rowData);
visualization = new google.visualization.ColumnChart(document.getElementById('visualization'));
google.visualization.events.addListener(visualization, 'ready', function(){
var svgns = "http://www.w3.org/2000/svg";
var gradients = [["red","#C0504D","#E6B8B7"],
["green","#9BBB59","#D8E4BC"],
["blue","#4F81BD","DCE6F1"]];
var svg_defs = $("#visualization iframe").contents().find('defs');
// add gradients to svg defs
for(var i = 0; i < gradients.length; i++){
var grad = $(document.createElementNS(svgns, "linearGradient")).
attr({id:gradients[i][0],x1:"0%",x2:"0%",y1:"0%",y2:"100%"});
var stopTop = $(document.createElementNS(svgns, "stop")).
attr({offset:"0%","stop-color":gradients[i][1]});
var stopBottom = $(document.createElementNS(svgns, "stop")).
attr({offset:"100%","stop-color":gradients[i][2]});
$(grad).append(stopTop).append(stopBottom);
svg_defs.append(grad);
}
// #3366cc, #dc3912, #ff9900 - replace default colors with gradients
$("#visualization iframe").contents().find('rect[fill="#3366cc"]').attr({'fill':'url(#blue)','stroke-width':0.4,'stroke':'#000000'});
$("#visualization iframe").contents().find('rect[fill="#dc3912"]').attr({'fill':'url(#blue)','stroke-width':0.4,'stroke':'#000000'});
$("#visualization iframe").contents().find('rect[fill="#ff9900"]').attr({'fill':'url(#blue)','stroke-width':0.4,'stroke':'#000000'});
});
// Create and draw the visualization.
visualization.draw(data,{width:600, height:400});
}
google.setOnLoadCallback(drawVisualization);
</script>
</head>
<body style="font-family: Arial;border: 0 none;">
<div id="visualization" style="width: 600px; height: 400px;"></div>
</body>
</html>
UPDATE
Così, mentre guardando attraverso il DOM per vedere se riuscivo a trovare dove questi codici di colore potrebbero essere memorizzati (e non c'è da trovare le funzioni che li utilizzano), ho trovato questi (che una volta impostato farà quello che voglio):
//fill
visualization.qa.l.e[0].Hm.O = "url(#blue)";
visualization.qa.l.e[1].Hm.O = "url(#red)";
visualization.qa.l.e[2].Hm.O = "url(#green)";
// stroke
visualization.qa.l.e[0].Hm.Jb = "#000000";
visualization.qa.l.e[1].Hm.Jb = "#000000";
visualization.qa.l.e[2].Hm.Jb = "#000000";
// fill-opacity
//visualization.qa.l.e[0].Hm.$b = 0.5;
//visualization.qa.l.e[1].Hm.$b = 0.5;
//visualization.qa.l.e[2].Hm.$b = 0.5;
// stroke-width
visualization.qa.l.e[0].Hm.H = 0.4;
visualization.qa.l.e[1].Hm.H = 0.4;
visualization.qa.l.e[2].Hm.H = 0.4;
// stroke-opacity
//visualization.qa.l.e[0].Hm.nc = 0.5;
//visualization.qa.l.e[1].Hm.nc = 0.5;
//visualization.qa.l.e[2].Hm.nc = 0.5;
ma questo sarebbe solo una soluzione temporanea, come sono sicuro che la prossima volta che Google aggiorna il codice di visualizzazione, questi i nomi delle variabili cambierà (non lo faccio pensa che qualcuno scelga questi di proposito e il compressore/offuscatore usato probabilmente sceglieranno nomi di variabili diversi la prossima volta - ma poi chissà - forse non lo farà).
Quindi, se qualcuno sa di un modo più permanente che non dipende dalla ricerca manuale e dall'impostazione dei nomi delle variabili, mi piacerebbe. Altrimenti, questa potrebbe essere la mia migliore scommessa per ora.
UPDATE2 (1 marzo 2012)
Caso in questione. Le variabili sono ora spostati:
//fill
visualization.da.C.d[0].en.S = "url(#blue)";
[questo è un esempio funzionante per cambiare il colore della barra su un diagramma di Gantt usando 'MutationObserver'] (http://stackoverflow.com/a/40655754/5090771) – WhiteHat