HighCharts, multiple same chart on one page only uses 1 set of data - highcharts

If you can please look at: https://jsfiddle.net/eL0fnt1a/
I have 2 windrose charts on one page, each with a unique name and their own set of data. However, the first set of data is used incorrectly for both charts.
I have others pages with multiple line charts and they work fine.
Can someone point me in the right direction?
<div>
<div id="ChartName0"></div>
<div style="display:none">
<table id="freq" border="0" cellspacing="0" cellpadding="0">
<tr nowrap>
<th colspan="8" class="hdr"> Table of Frequencies(percent)</th>
</tr>
<tr nowrap>
<th class="freq"> Direction</th>
<th class="freq"> 0-5 km/hr</th>
<th class="freq"> 5-15 km/hr</th>
<th class="freq"> 15-30 km/hr</th>
<th class="freq"> 30-60 km/hr</th>
<th class="freq"> 60-100 km/hr</th>
<th class="freq"> > 100 km/hr</th>
<th class="freq"> Total</th>
</tr>
<tr nowrap>
<td class='dir'>North</td>
<td class='data'>8.16326530612245</td>
<td class='data'>12.244897959183675</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NNE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>ENE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>East</td>
<td class='data'>20.408163265306122</td>
<td class='data'>20.408163265306122</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>ESE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SE</td>
<td class='data'>2.0408163265306123</td>
<td class='data'>4.081632653061225</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SSE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>South</td>
<td class='data'>2.0408163265306123</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SSW</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SW</td>
<td class='data'>0</td>
<td class='data'>4.081632653061225</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>WSW</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>West</td>
<td class='data'>4.081632653061225</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>WNW</td>
<td class='data'>4.081632653061225</td>
<td class='data'>8.16326530612245</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NW</td>
<td class='data'>8.16326530612245</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NNW</td>
<td class='data'>0</td>
<td class='data'>2.0408163265306123</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='totals'>Total</td>
<td class='totals'>48.9795918367347</td>
<td class='totals'>51.02040816326531</td>
<td class='totals'>0</td>
<td class='totals'>0</td>
<td class='totals'>0</td>
<td class='totals'>0</td>
</table>
</div>
</div>
<div>
<div id="ChartName1"></div>
<div style="display:none">
<table id="freq" border="0" cellspacing="0" cellpadding="0">
<tr nowrap>
<th colspan="8" class="hdr"> Table of Frequencies(percent)</th>
</tr>
<tr nowrap>
<th class="freq"> Direction</th>
<th class="freq"> 0-5 km/hr</th>
<th class="freq"> 5-15 km/hr</th>
<th class="freq"> 15-30 km/hr</th>
<th class="freq"> 30-60 km/hr</th>
<th class="freq"> 60-100 km/hr</th>
<th class="freq"> > 100 km/hr</th>
<th class="freq"> Total</th>
</tr>
<tr nowrap>
<td class='dir'>North</td>
<td class='data'>9.036658141517476</td>
<td class='data'>20.545609548167093</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NNE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NE</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>ENE</td>
<td class='data'>0</td>
<td class='data'>0.08525149190110827</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>East</td>
<td class='data'>5.797101449275362</td>
<td class='data'>22.932651321398126</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>ESE</td>
<td class='data'>0.3410059676044331</td>
<td class='data'>0.42625745950554134</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SE</td>
<td class='data'>1.619778346121057</td>
<td class='data'>1.8755328218243819</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SSE</td>
<td class='data'>0.08525149190110827</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>South</td>
<td class='data'>1.1935208866155158</td>
<td class='data'>0.2557544757033248</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SSW</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>SW</td>
<td class='data'>1.8755328218243819</td>
<td class='data'>1.1082693947144076</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>WSW</td>
<td class='data'>0</td>
<td class='data'>0.17050298380221654</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>West</td>
<td class='data'>2.7280477408354646</td>
<td class='data'>0.5967604433077579</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>WNW</td>
<td class='data'>3.7510656436487637</td>
<td class='data'>11.082693947144076</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NW</td>
<td class='data'>5.797101449275362</td>
<td class='data'>4.0068201193520885</td>
<td class='data'>0.08525149190110827</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='dir'>NNW</td>
<td class='data'>1.3640238704177323</td>
<td class='data'>3.239556692242114</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0</td>
<td class='data'>0.0</td>
</tr>
<tr nowrap>
<td class='totals'>Total</td>
<td class='totals'>33.589087809036656</td>
<td class='totals'>66.32566069906224</td>
<td class='totals'>0.08525149190110827</td>
<td class='totals'>0</td>
<td class='totals'>0</td>
<td class='totals'>0</td>
</table>
</div>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
Highcharts.chart('ChartName0', {
data: {
table: 'freq',
startRow: 1,
endRow: 17,
endColumn: 6
},
chart: {
polar: true,
type: 'column',
backgroundColor: '#FEF5E7'
},
title: {
floating: true,
margin: 0,
text: ' ',
align: 'left'
},
credits: true,
subtitle: {
floating: true,
margin: 0,
text: ' ',
align: 'left'
},
pane: {
size: '80%'
},
legend: {
enabled: true,
align: 'left',
floating: true,
verticalAlign: 'bottom',
y: 0,
x: 0,
layout: 'vertical'
},
xAxis: {
tickmarkPlacement: 'on',
gridLineColor: '#8b4513',
lineColor: '#321414',
labels: {
style: {
color: 'black',
fontSize: 14
},
},
},
yAxis: {
min: 0,
endOnTick: false,
showLastLabel: true,
gridLineColor: '#c19a6b',
title: {
text: 'Frequency (%)',
style: {
fontSize: '1.2em'
}
},
labels: {
style: {
color: 'black',
fontSize: 12
},
formatter: function() {
return this.value + '%';
}
},
tickAmount: 6,
reversedStacks: false
},
tooltip: {
valueSuffix: '%'
},
plotOptions: {
series: {
stacking: 'normal',
shadow: false,
groupPadding: 0,
pointPlacement: 'on'
}
}
});
Highcharts.chart('ChartName1', {
data: {
table: 'freq',
startRow: 1,
endRow: 17,
endColumn: 6
},
chart: {
polar: true,
type: 'column',
backgroundColor: '#FEF5E7'
},
title: {
floating: true,
margin: 0,
text: ' ',
align: 'left'
},
credits: true,
subtitle: {
floating: true,
margin: 0,
text: ' ',
align: 'left'
},
pane: {
size: '80%'
},
legend: {
enabled: true,
align: 'left',
floating: true,
verticalAlign: 'bottom',
y: 0,
x: 0,
layout: 'vertical'
},
xAxis: {
tickmarkPlacement: 'on',
gridLineColor: '#8b4513',
lineColor: '#321414',
labels: {
style: {
color: 'black',
fontSize: 14
},
},
},
yAxis: {
min: 0,
endOnTick: false,
showLastLabel: true,
gridLineColor: '#c19a6b',
title: {
text: 'Frequency (%)',
style: {
fontSize: '1.2em'
}
},
labels: {
style: {
color: 'black',
fontSize: 12
},
formatter: function() {
return this.value + '%';
}
},
tickAmount: 6,
reversedStacks: false
},
tooltip: {
valueSuffix: '%'
},
plotOptions: {
series: {
stacking: 'normal',
shadow: false,
groupPadding: 0,
pointPlacement: 'on'
}
}
});
});
</script>

#kikon's comment solved the problem:
The problem is that you use the same id (freq) for the two tables. Ids in HTML are global and should be unique throughout the whole document. Change the second id to a different value and also its reference in the second chart's data section jsfiddle.net/z6ewm1uc

Related

can I change the color of some legend items in a wind rose chart?

I have modified the polar windrose sample that you can find in https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/polar-wind-rose/ by using some personal data about carbon footprint of food categories by region in Spain.
The result is this chart: https://jsfiddle.net/PLomas/6a45q1r3/2/
But, as you can see, the last and the first three categories of the legend have the same colors. I want to change the last three colors to avoid confusion of categories. The code was:
// Parse the data from an inline table using the Highcharts Data plugin
Highcharts.chart('container', {
data: {
table: 'freq',
startRow: 1,
endRow: 18,
endColumn: 13
},
chart: {
polar: true,
type: 'column'
},
title: {
text: 'Huella de carbono Comunidades Autónomas por categorías alimentos 2006'
},
subtitle: {
text: 'Fuente: Elaboración propia'
},
pane: {
size: '85%'
},
legend: {
align: 'right',
verticalAlign: 'top',
y: 100,
layout: 'vertical'
},
xAxis: {
tickmarkPlacement: 'on'
},
yAxis: {
min: 0,
endOnTick: false,
showLastLabel: true,
title: {
text: ''
},
labels: {
formatter: function () {
return this.value;
}
},
reversedStacks: false
},
tooltip: {
valueSuffix: ' kg CO2-eq/habitante'
},
plotOptions: {
series: {
stacking: 'normal',
shadow: false,
groupPadding: 0,
pointPlacement: 'on'
}
}
});
.highcharts-figure, .highcharts-data-table table {
min-width: 360px;
max-width: 860px;
margin: 1em auto;
}
.highcharts-data-table table {
font-family: Verdana, sans-serif;
border-collapse: collapse;
border: 1px solid #EBEBEB;
margin: 10px auto;
text-align: center;
width: 100%;
max-width: 500px;
}
.highcharts-data-table caption {
padding: 1em 0;
font-size: 1.2em;
color: #555;
}
.highcharts-data-table th {
font-weight: 600;
padding: 0.5em;
}
.highcharts-data-table td, .highcharts-data-table th, .highcharts-data-table caption {
padding: 0.5em;
}
.highcharts-data-table thead tr, .highcharts-data-table tr:nth-child(even) {
background: #f8f8f8;
}
.highcharts-data-table tr:hover {
background: #f1f7ff;
}
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/highcharts-more.js"></script>
<script src="https://code.highcharts.com/modules/data.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<script src="https://code.highcharts.com/modules/accessibility.js"></script>
<figure class="highcharts-figure">
<div id="container"></div>
<p class="highcharts-description">
</p>
</figure>
<div style="display:none">
<table id="freq" border="0" cellspacing="0" cellpadding="0">
<tr nowrap bgcolor="#CCCCFF">
<th colspan="18" class="hdr">Huella carbono por categorías</th>
</tr>
<tr nowrap bgcolor=>
<th class="freq">Categoría alimentos</th>
<th class="freq">Pan y cereales</th>
<th class="freq">Carne</th>
<th class="freq">Pescado</th>
<th class="freq">Leche, derivados y huevos</th>
<th class="freq">Aceites y grasas</th>
<th class="freq">Frutas</th>
<th class="freq">Hortalizas, legumbres y tubérculos</th>
<th class="freq">Azúcar y dulces</th>
<th class="freq">Café, té y cacao</th>
<th class="freq">Agua mineral, refrescos y zumos</th>
<th class="freq">Espirituosos y licores</th>
<th class="freq">Vinos</th>
<th class="freq">Cerveza</th>
</tr>
<tr nowrap>
<td class="dir">Andalucía</td>
<td class="data">92.1</td>
<td class="data">523.3</td>
<td class="data">181.3</td>
<td class="data">288.9</td>
<td class="data">19.9</td>
<td class="data">73.7</td>
<td class="data">56.5</td>
<td class="data">15.9</td>
<td class="data">8.8</td>
<td class="data">50.8</td>
<td class="data">4.2</td>
<td class="data">17.6</td>
<td class="data">21.2</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">Aragón</td>
<td class="data">80.9</td>
<td class="data">723.4</td>
<td class="data">191.8</td>
<td class="data">247.3</td>
<td class="data">20.9</td>
<td class="data">74.1</td>
<td class="data">64.2</td>
<td class="data">17.2</td>
<td class="data">8.1</td>
<td class="data">45.4</td>
<td class="data">6.1</td>
<td class="data">19.1</td>
<td class="data">15.1</td>
</tr>
<tr nowrap>
<td class="dir">Asturias</td>
<td class="data">87.9</td>
<td class="data">670.9</td>
<td class="data">205.2</td>
<td class="data">305.4</td>
<td class="data">21.8</td>
<td class="data">72.1</td>
<td class="data">52.1</td>
<td class="data">18.7</td>
<td class="data">9.9</td>
<td class="data">33.8</td>
<td class="data">3.1</td>
<td class="data">25.9</td>
<td class="data">7.8</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">I.Baleares</td>
<td class="data">91.3</td>
<td class="data">530.3</td>
<td class="data">113.0</td>
<td class="data">242.7</td>
<td class="data">17.1</td>
<td class="data">65.3</td>
<td class="data">60.3</td>
<td class="data">16.5</td>
<td class="data">7.1</td>
<td class="data">70.5</td>
<td class="data">4.9</td>
<td class="data">21.7</td>
<td class="data">14.5</td>
</tr>
<tr nowrap>
<td class="dir">I.Canarias</td>
<td class="data">81.0</td>
<td class="data">472.8</td>
<td class="data">127.5</td>
<td class="data">312.8</td>
<td class="data">18.7</td>
<td class="data">56.7</td>
<td class="data">54.4</td>
<td class="data">17.6</td>
<td class="data">9.8</td>
<td class="data">87.3</td>
<td class="data">4.8</td>
<td class="data">13.12</td>
<td class="data">16.12</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">Cantabria</td>
<td class="data">81.0</td>
<td class="data">528.0</td>
<td class="data">162.2</td>
<td class="data">234.9</td>
<td class="data">23.3</td>
<td class="data">59.8</td>
<td class="data">43.5</td>
<td class="data">15.3</td>
<td class="data">9.5</td>
<td class="data">32.9</td>
<td class="data">2.2</td>
<td class="data">26.2</td>
<td class="data">10.3</td>
</tr>
<tr nowrap>
<td class="dir">CyL</td>
<td class="data">85.8</td>
<td class="data">845.6</td>
<td class="data">215.7</td>
<td class="data">279.0</td>
<td class="data">20.6</td>
<td class="data">88.4</td>
<td class="data">61.1</td>
<td class="data">14.2</td>
<td class="data">10.3</td>
<td class="data">35.6</td>
<td class="data">5.0</td>
<td class="data">19.9</td>
<td class="data">10.7</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">CLM</td>
<td class="data">91.7</td>
<td class="data">629.1</td>
<td class="data">178.0</td>
<td class="data">269.7</td>
<td class="data">15.2</td>
<td class="data">77.7</td>
<td class="data">63.6</td>
<td class="data">12.6</td>
<td class="data">8.4</td>
<td class="data">41.5</td>
<td class="data">2.9</td>
<td class="data">15.6</td>
<td class="data">17.3</td>
</tr>
<tr nowrap>
<td class="dir">Cataluña</td>
<td class="data">89.2</td>
<td class="data">579.4</td>
<td class="data">166.7</td>
<td class="data">264.5</td>
<td class="data">18.1</td>
<td class="data">75.1</td>
<td class="data">68.7</td>
<td class="data">14.8</td>
<td class="data">9.5</td>
<td class="data">55.4</td>
<td class="data">4.4</td>
<td class="data">25.4</td>
<td class="data">15.5</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">C.Valenciana</td>
<td class="data">85.6</td>
<td class="data">536.5</td>
<td class="data">126.2</td>
<td class="data">247.2</td>
<td class="data">15.2</td>
<td class="data">63.4</td>
<td class="data">57.5</td>
<td class="data">12.9</td>
<td class="data">8.1</td>
<td class="data">62.4</td>
<td class="data">5.2</td>
<td class="data">19.2</td>
<td class="data">21.6</td>
</tr>
<tr nowrap>
<td class="dir">Extremadura</td>
<td class="data">85.9</td>
<td class="data">714.3</td>
<td class="data">162.5</td>
<td class="data">284.8</td>
<td class="data">20.8</td>
<td class="data">68.7</td>
<td class="data">47.3</td>
<td class="data">9.5</td>
<td class="data">9.3</td>
<td class="data">37.1</td>
<td class="data">5.8</td>
<td class="data">13.3</td>
<td class="data">20.3</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">Galicia</td>
<td class="data">92.3</td>
<td class="data">789.2</td>
<td class="data">261.3</td>
<td class="data">294.7</td>
<td class="data">24.2</td>
<td class="data">67.7</td>
<td class="data">57.2</td>
<td class="data">17.0</td>
<td class="data">15.1</td>
<td class="data">36.9</td>
<td class="data">5.2</td>
<td class="data">43.0</td>
<td class="data">10.0</td>
</tr>
<tr nowrap>
<td class="dir">C.Madrid</td>
<td class="data">88.4</td>
<td class="data">639.1</td>
<td class="data">171.5</td>
<td class="data">262.0</td>
<td class="data">15.9</td>
<td class="data">76.3</td>
<td class="data">60.5</td>
<td class="data">15.0</td>
<td class="data">8.8</td>
<td class="data">29.71</td>
<td class="data">4.6</td>
<td class="data">19.0</td>
<td class="data">18.0</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">R.Murcia</td>
<td class="data">92.6</td>
<td class="data">449.9</td>
<td class="data">136.4</td>
<td class="data">274.8</td>
<td class="data">13.6</td>
<td class="data">52.8</td>
<td class="data">51.9</td>
<td class="data">11.3</td>
<td class="data">6.9</td>
<td class="data">51.4</td>
<td class="data">6.0</td>
<td class="data">18.4</td>
<td class="data">22.7</td>
</tr>
<tr nowrap>
<td class="dir">Navarra</td>
<td class="data">82.7</td>
<td class="data">651.6</td>
<td class="data">153.5</td>
<td class="data">242.8</td>
<td class="data">17.7</td>
<td class="data">71.4</td>
<td class="data">60.9</td>
<td class="data">16.2</td>
<td class="data">10.2</td>
<td class="data">27.4</td>
<td class="data">3.7</td>
<td class="data">28.6</td>
<td class="data">12.6</td>
</tr>
<tr nowrap bgcolor="#DDDDDD">
<td class="dir">País Vasco</td>
<td class="data">84.9</td>
<td class="data">678.5</td>
<td class="data">199.0</td>
<td class="data">276.9</td>
<td class="data">23.8</td>
<td class="data">80.6</td>
<td class="data">57.1</td>
<td class="data">17.9</td>
<td class="data">11.5</td>
<td class="data">27.2</td>
<td class="data">5.5</td>
<td class="data">33.2</td>
<td class="data">9.8</td>
</tr>
<tr nowrap>
<td class="dir">La Rioja</td>
<td class="data">81.2</td>
<td class="data">548.4</td>
<td class="data">163.2</td>
<td class="data">242.8</td>
<td class="data">18.7</td>
<td class="data">63.4</td>
<td class="data">48.6</td>
<td class="data">12.5</td>
<td class="data">6.3</td>
<td class="data">31.6</td>
<td class="data">4.3</td>
<td class="data">15.7</td>
<td class="data">8.4</td>
</tr>
</table>
</div>
Thank you in advance for any idea.
Highcharts loops the default colors. You just need to add more items to the colors array:
colors: [...]
The default colors are:
"#7cb5ec", "#434348", "#90ed7d", "#f7a35c", "#8085e9", "#f15c80", "#e4d354", "#2b908f", "#f45b5b", "#91e8e1"
Live demo: https://jsfiddle.net/BlackLabel/7q2dr3am/
API Reference: https://api.highcharts.com/highcharts/colors

TypeError: cell is undefined[Learn More] jspdf.plugin.autotable.js:690:17

I am converting a table to pdf, if I put the pdf into portrait then the PDF gets generated with no issues.
However the table is quite wide so I need to switch it to landscape, as soon as I do I receive the following error:
TypeError: cell is undefined[Learn More] jspdf.plugin.autotable.js:690:17
Sadly I can't share the table as it is confidential work (hence the local pdf creation) but here is the script I am using.
$('#btnExportPDF').on('click', function(e){
e.preventDefault();
let source = document.getElementById('iframeReport').contentWindow.document.getElementById('tblReport');
$('#divHiddenTable').html(source.outerHTML);
console.log(source);
let doc = new jsPDF({format: 'a4', unit: 'pt', orientation: 'l'});//change l to p and it works
console.log('PDF Obj');
doc.autoTable({html: '#tblReport'});
console.log('PDF autoTable');
doc.save("RegionalDirectorsWriteOffReviewExport.pdf");
console.log('PDF save');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.0.9/jspdf.plugin.autotable.js"></script>
After some more investigation, it appears that if I remove the OFFICE 3 section from the table below it works, but with it in it doesn't.
<table class="table table-striped" id="tblReport">
<thead>
<tr>
<th>Client
Code</th>
<th>Client
Partner</th>
<th>Client
Name</th>
<th> </th>
<th align="center">Billed</th>
<th align="center">WIP
W/O</th>
<th align="center">Profit/
Loss</th>
<th>Recovery</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
<tr class="OfficeHeader">
<th colspan="9">City 1</th>
</tr>
<tr>
<td>123456</td>
<td>NAME</td>
<td>COMPANY </td>
<td>WHOAMI</td>
<td class="text-right">2,069.58</td>
<td class="text-right">4,609.66</td>
<td class="text-right">-2,540.08</td>
<td class="text-right">44.89</td>
<td></td>
</tr>
<tr>
<td>45384</td>
<td>NAME</td>
<td>COMPANY 2</td>
<td>WHOAMI</td>
<td class="text-right">195.00</td>
<td class="text-right">4,559.74</td>
<td class="text-right">-4,364.74</td>
<td class="text-right">4.27</td>
<td></td>
</tr>
<tr>
<td>852136</td>
<td>NAME</td>
<td>COMPANY 3</td>
<td> </td>
<td class="text-right">600.00</td>
<td class="text-right">3,109.00</td>
<td class="text-right">-2,509.00</td>
<td class="text-right">19.29</td>
<td></td>
</tr>
<tr>
<td>111</td>
<td>NAME</td>
<td>COMPANY 4</td>
<td>WHOAMI</td>
<td class="text-right">0.00</td>
<td class="text-right">1,677.50</td>
<td class="text-right">-1,677.50</td>
<td class="text-right">0.00</td>
<td></td>
</tr>
<tr>
<td>123654</td>
<td>NAME</td>
<td>COMPANY</td>
<td>WHOAMI</td>
<td class="text-right">0.00</td>
<td class="text-right">1,169.75</td>
<td class="text-right">-1,169.75</td>
<td class="text-right">0.00</td>
<td></td>
</tr>
<tr class="OfficeFooter">
<td colspan="4" class="text-right">Office Totals</td>
<td class="text-right"><div class="double-border">2,864.58</div></td>
<td class="text-right"><div class="double-border">15,125.65</div></td>
<td class="text-right"><div class="double-border">-12,261.07</div></td>
<td colspan="2"><div class="pagebreak"> </div></td>
</tr>
<tr class="OfficeHeader">
<th colspan="9">City 2</th>
</tr>
<tr>
<td>A-569</td>
<td>NAME</td>
<td>COMPANY </td>
<td>WHOIZYOU</td>
<td class="text-right">2,175.00</td>
<td class="text-right">4,361.72</td>
<td class="text-right">-2,186.72</td>
<td class="text-right">49.86</td>
<td>Overrun against a thing that we don't know so can't put here</td>
</tr>
<tr>
<td>D/6666</td>
<td>NAME</td>
<td>COMPANY</td>
<td>WHOIZTHIS</td>
<td class="text-right">1,300.00</td>
<td class="text-right">2,371.01</td>
<td class="text-right">-1,071.01</td>
<td class="text-right">54.82</td>
<td>Taken on from previous prtner and manager</td>
</tr>
<tr class="OfficeFooter">
<td colspan="4" class="text-right">Office Totals</td>
<td class="text-right"><div class="double-border">3,475.00</div></td>
<td class="text-right"><div class="double-border">6,732.73</div></td>
<td class="text-right"><div class="double-border">-3,257.73</div></td>
<td colspan="2"><div class="pagebreak"> </div></td>
</tr>
<tr class="OfficeHeader">
<th colspan="9">OFFICE 3</th>
</tr>
<tr>
<td>GFDGDFGF</td>
<td>NAME</td>
<td>COMPANY </td>
<td>WHO</td>
<td class="text-right">2,910.00</td>
<td class="text-right">8,385.21</td>
<td class="text-right">-5,475.21</td>
<td class="text-right">34.70</td>
<td></td>
</tr>
<tr>
<td>KJHKJHKJ</td>
<td>NAME</td>
<td>COMPANY Limited </td>
<td>WHO</td>
<td class="text-right">2,310.00</td>
<td class="text-right">4,733.76</td>
<td class="text-right">-2,423.76</td>
<td class="text-right">48.79</td>
<td></td>
</tr>
<tr>
<td>OIOUIO</td>
<td>NAM,E</td>
<td>COMPANY</td>
<td>WHOZ</td>
<td class="text-right">0.00</td>
<td class="text-right">2,110.25</td>
<td class="text-right">-2,110.25</td>
<td class="text-right">0.00</td>
<td></td>
</tr>
<tr class="OfficeFooter">
<td colspan="4" class="text-right">Office Totals</td>
<td class="text-right"><div class="double-border">5,220.00</div></td>
<td class="text-right"><div class="double-border">15,229.22</div></td>
<td class="text-right"><div class="double-border">-10,009.22</div></td>
<td colspan="2"><div class="pagebreak"> </div></td>
</tr>
</tbody>
<tfoot>
<tr style="height: 2px !important; overflow: hidden !important;">
<td colspan="4"><div style="line-height: 2px !important; height: 2px !important; font-size: 2px !important; overflow: hidden; !important;"> </div></td>
<td colspan="3"><div style="line-height: 2px !important; height: 2px !important; font-size: 2px !important; background-color: #e7ebee; overflow: hidden !important;"> </div></td>
<td colspan="2"><div style="line-height: 2px !important; height: 2px !important; font-size: 2px !important; overflow: hidden; !important;"> </div></td>
</tr>
<tr>
<td colspan="4" class="text-right">AVG</td>
<td class="text-right">1,319.98</td>
<td class="text-right">3,526.59</td>
<td class="text-right">-2,206.61</td>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="4" class="text-right">Totals</td>
<td class="text-right"><div class="double-border">27,719.58</div></td>
<td class="text-right"><div class="double-border">74,058.42</div></td>
<td class="text-right"><div class="double-border">-46,338.84</div></td>
<td colspan="2"> </td>
</tr>
</tfoot>
</table>
example JSFiddle https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.css

Selenium Loop Through Table Until Td Contains "x"

I wanted to loop through the table until Td text is "Dispatched Export To Shipper". I don't want it to check for below nodes.Only first 8 rows. But the condition should be td text. Any ideas?
Table Sample:
<table role="grid" data-role="selectable" class="k-selectable">
<colgroup>
<col style="width:115px">
<col>
<col>
<col>
<col>
<col style="width:70px">
<col style="width:50px">
<col>
</colgroup>
<thead class="k-grid-header" role="rowgroup">
<tr role="row">
<th class="k-header" data-field="XNS_DTTM" data-index="0" data-title="Date" scope="col">
<span class="k-link">Date</span>
</th>
<th class="k-header" data-field="ATLOC_NAME" data-index="1" data-title="Location" scope="col">
<span class="k-link">Location</span>
</th>
<th class="k-header" data-field="TOLOC_NAME" data-index="2" data-title="To Location" scope="col">
<span class="k-link">To Location</span>
</th>
<th class="k-header" data-field="BL_OR_BKG_NO" data-index="3" data-title="BL/BKG" scope="col">
<span class="k-link">BL/BKG</span>
</th>
<th class="k-header" data-field="VSL_NAME" data-index="4" data-title="Vessel" scope="col">
<span class="k-link">Vessel</span>
</th>
<th class="k-header" data-field="VOY_CODE" data-index="5" data-title="Voy" scope="col">
<span class="k-link">Voy</span>
</th>
<th class="k-header" data-field="LINE_CODE" data-index="6" data-title="Line" scope="col">
<span class="k-link">Line</span>
</th>
<th class="k-header" data-field="XNS_DSCR" data-index="7" data-title="Description" scope="col">
<span class="k-link">Description</span>
</th>
</tr>
</thead>
<tbody role="rowgroup">
<tr data-uid="affa9830-8556-4dcd-bcbc-4f54f0a56cc6" role="row">
<td style="vertical-align:top;" role="gridcell">28-JUN-2017 09:30</td>
<td style="vertical-align:top;" role="gridcell">COLOMBO - SOUTH ASIA GATEWAY TERMINAL</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Landed Transshipment</td>
</tr>
<tr class="k-alt" data-uid="634db05f-8f85-49e4-b143-13971126591f" role="row">
<td style="vertical-align:top;" role="gridcell">28-JUN-2017 08:42</td>
<td style="vertical-align:top;" role="gridcell">COLOMBO - SOUTH ASIA GATEWAY TERMINAL</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Vessel arrived at port</td>
</tr>
<tr data-uid="bdac4da1-ef1e-49f8-bb85-ff8bda21ff65" role="row">
<td style="vertical-align:top;" role="gridcell">25-JUN-2017 18:18</td>
<td style="vertical-align:top;" role="gridcell">PIPAVAV-APM TERMINALS</td>
<td style="vertical-align:top;" role="gridcell">COLOMBO - SOUTH ASIA GATEWAY TERMINAL</td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Vessel depart from the port</td>
</tr>
<tr class="k-alt" data-uid="403e9c6a-aec8-4124-b74b-749a98b52675" role="row">
<td style="vertical-align:top;" role="gridcell">25-JUN-2017 13:57</td>
<td style="vertical-align:top;" role="gridcell">PIPAVAV-APM TERMINALS</td>
<td style="vertical-align:top;" role="gridcell">COLOMBO - SOUTH ASIA GATEWAY TERMINAL</td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Loaded on Vessel</td>
</tr>
<tr data-uid="8e7c6913-a4a4-4ef9-a6a1-d16b9a3b7d30" role="row">
<td style="vertical-align:top;" role="gridcell">20-JUN-2017 20:27</td>
<td style="vertical-align:top;" role="gridcell">PIPAVAV-APM TERMINALS</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">In-Gate Export At Final Facility at LP</td>
</tr>
<tr class="k-alt" data-uid="e5b3a2a2-4ead-4480-a088-5d0bc5c2bfa6" role="row">
<td style="vertical-align:top;" role="gridcell">20-JUN-2017 07:15</td>
<td style="vertical-align:top;" role="gridcell">AHMEDABAD - ICD AHMEDABAD/ ICD KHODIYAR</td>
<td style="vertical-align:top;" role="gridcell">PIPAVAV-APM TERMINALS</td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Transit Export</td>
</tr>
<tr data-uid="c4d7f433-3cb2-4a2f-b0e8-19eae9545cd3" role="row">
<td style="vertical-align:top;" role="gridcell">16-JUN-2017 21:16</td>
<td style="vertical-align:top;" role="gridcell">AHMEDABAD - ICD AHMEDABAD/ ICD KHODIYAR</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Received Export</td>
</tr>
<tr class="k-alt" data-uid="a8593a5d-4bd6-4714-80c8-04e55a3140a9" role="row">
<td style="vertical-align:top;" role="gridcell">15-JUN-2017 17:00</td>
<td style="vertical-align:top;" role="gridcell">AHMADABAD - QUEST CONTAINER DEPO</td>
<td style="vertical-align:top;" role="gridcell">AHMADABAD - QUEST CONTAINER DEPO</td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">BELLAVIA/BLV</td>
<td style="vertical-align:top;" role="gridcell">0034E</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Dispatched Export To Shipper</td>
</tr>
<tr data-uid="cbdc7f97-5e8d-48c9-900b-8031ee6a6fe5" role="row">
<td style="vertical-align:top;" role="gridcell">03-JUN-2017 11:00</td>
<td style="vertical-align:top;" role="gridcell">AHMADABAD - QUEST CONTAINER DEPO</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell"></td>
<td style="vertical-align:top;" role="gridcell">In Empty And Available</td>
</tr>
<tr class="k-alt" data-uid="6c033a15-a900-47aa-8f26-642e012a97b0" role="row">
<td style="vertical-align:top;" role="gridcell">03-JUN-2017 01:38</td>
<td style="vertical-align:top;" role="gridcell">AHMEDABAD - ICD AHMEDABAD/ ICD KHODIYAR</td>
<td style="vertical-align:top;" role="gridcell">AHMEDABAD - ICD AHMEDABAD/ ICD KHODIYAR</td>
<td style="vertical-align:top;" role="gridcell">
<span title="Login into MOLPOWER to see the Container details.">--</span>
</td>
<td style="vertical-align:top;" role="gridcell">WAN HAI 501/W501</td>
<td style="vertical-align:top;" role="gridcell">0117W</td>
<td style="vertical-align:top;" role="gridcell">HSX</td>
<td style="vertical-align:top;" role="gridcell">Out-Gate Import To Consignee</td>
</tr>
</tbody>
Controller Sample:
foreach (var eachNode in driver.FindElements(By.XPath("//*[#id=\"gridEqpHistory\"]/table/tbody/tr")))
{
var cells = eachNode.FindElements(By.TagName("td"));
cd = new ContainerDetail();
for (int i = 0; i < cells.Count(); i++)
{
cd.ContainerNo = containerNo;
cd.Location = cells[1].Text.Trim();
cd.ActionType = cells[7].Text.Trim();
string s = cells[0].Text;
DateTime dt = Convert.ToDateTime(s);
if (_minDate > dt) _minDate = dt;
cd.ActionDate = dt;
cd.Vessel = cells[4].Text.Split('/').First().Trim();
cd.Voyage = cells[5].Text.Trim();
}
If you want to get only first 8 tr elements with required data you can try to use below XPath expression
//tr[not(preceding-sibling::tr[td="Dispatched Export To Shipper"]) and not(th)]

JQuery UI sortable does not scroll when bottom of list in Firefox

I have a JQuery UI Sortable against a table. In Firefox, when you click and drag a row all the way to bottom Chrome will scroll the list for you, but in Firefox, it just drags off the screen into the nothingness below the last visible row.
This particular table with is within a div with a fixed height.
I am using JQuery 2.1.0 and JQuery UI 1.12.
Here is a code pen:- https://codepen.io/anon/pen/BWVpdE
Here is the HTML:-
<div class="scrollableContainer">
<table>
<thead>
<tr class="ui-state-default">
<th colspan="4">Original</th>
<th colspan="4">table heading</th>
<th colspan="4">table heading</th>
<th colspan="4">table heading</th>
<th colspan="4">table heading</th>
<th colspan="4">Current Pos</th>
</tr>
</thead>
<tfoot>
<tr class="ui-state-default">
<th colspan="4">Original</th>
<th colspan="4">table footer</th>
<th colspan="4">table footer</th>
<th colspan="4">table footer</th>
<th colspan="4">table footer</th>
<th colspan="4">Current Pos</th>
</tr>
</tfoot>
<tbody>
<tr class="ui-state-default">
<th colspan="4">First Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">1</td>
</tr>
<tr class="ui-state-default even">
<th colspan="4">Second Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">2</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Third Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">3</td>
</tr>
<tr class="ui-state-default even">
<th colspan="4">Fourth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">4</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
<tr class="ui-state-default">
<th colspan="4">Fifth Row</th>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">data</td>
<td colspan="4">5</td>
</tr>
</tbody>
</table>
</div>
Here is the SCSS:-
.scrollableContainer {
padding-top:60px;
height: 200px;
position:relative;
}
.scrollArea {
height:100%;
overflow-x:hidden;
overflow-y:auto;
}
table {
border-collapse: collapse;
overflow-x: hidden;
overflow-y: auto;
}
td, th {
background: #fff;
border-width: 0;
border-bottom: 1px solid #B8B8B8;
font-weight: normal !important;
padding: 15px;
text-align: left;
vertical-align: middle;
}
tr.even {
td, th {
background: #f1f1f1;
}
}
thead, tfoot {
text-transform: uppercase;
th {
background: #ccc;
}
}
body {
color: #111;
font-size: 16px;
font-family: sans-serif;
}
Here is the JS:-
$( "table tbody" ).sortable( {
update: function( event, ui ) {
$(this).children().each(function(index) {
$(this).find('td').last().html(index + 1)
});
}
});
OK, so I have found a solution using MutationObserver and getBoundingClientRect.
It is actually, not a great solution, but it works.
Here is the updated JS:-
var observer = null;
// Code taken from: http://stackoverflow.com/a/27263050/1545858
$.expr.filters.offscreen = function(el) {
var rect = el.getBoundingClientRect();
return (rect.x + rect.width) < 0
|| (rect.y + rect.height) < 0
|| (rect.x > window.innerWidth || rect.y > window.innerHeight)
;
};
$( "table tbody" ).sortable( {
start: function(event, ui) {
observer = new MutationObserver(function(mutations) {
window.requestAnimationFrame(function() {
if (mutations[0].attributeName === 'style') {
if (ui.item.is(':offscreen')) {
window.requestAnimationFrame(function () {
ui.item[0].scrollIntoView();
});
}
}
});
});
observer.observe(ui.item[0], { attributes: true });
},
stop: function(event, ui) {
observer.disconnect();
},
update: function( event, ui ) {
$(this).children().each(function(index) {
$(this).find('td').last().html(index + 1)
});
}
});
If anyone can let me know why I have to do this, it would be good. I have a feeling it is a bug in JQuery/JQuery UI/Firefox, but I don't know why.
Thanks.

Nokogiri parse HTML table in Ruby

I need to parse a HTML table from a URL using Nokogiri. My HTML looks like this:
<table class="tbl" cellspacing="1" cellpadding="4" id="gvResult" style="width:100%;">
<tbody>
<tr class="trh">
<th scope="col">Фирма</th>
<th scope="col">Артикул</th>
<th scope="col">Инф.</th>
<th scope="col">Описание</th>
<th scope="col">Нал.</th>
<th scope="col" style="width:55px;">Мин. заказ, шт</th>
<th scope="col">Ожидаемый срок, дн. <img src="http://s.exist.ru/img/q2.gif" alt="Помощь" /></th>
<th scope="col">Цена</th>
<th scope="col"> </th>
</tr>
<tr>
<td class="tabletitle" colspan="12">Запрошенный артикул</td>
</tr>
<tr onclick="colorize(this);" id="item_0" tcolor="">
<td class="artMerge" id="item_0" rowspan="2"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=47721138-000d-40c7-99f1-02d2f0005c83">Knecht (Mahle Filter)</a></td>
<td class="artMerge" rowspan="2" style="white-space:nowrap;">O * * * D</td>
<td class="artMerge" align="center" rowspan="2" style="white-space:nowrap;"></td>
<td class="artMerge" rowspan="2" style="padding:10px 10px 0 10px;">Фильтр масляный</td>
<td align="center">99</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-38be-0297-2f1100002de2" target="_blank">0</a></td>
<td class="price" align="right">56 400 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-38be-0297-2f1100002de2&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_1" tcolor="">
<td align="center">1782</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=1&s=0100f98e-5c00-b5be-0297-0f1200002de2" target="_blank">1</a></td>
<td class="price" align="right">55 000 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-b5be-0297-0f1200002de2&sr=-4"></a></td>
</tr>
<tr>
<td class="tabletitle" colspan="12">Аналоги (заменители) для запрошенного артикула <img src="http://s.exist.ru/img/q2.gif" alt="Помощь" /></td>
</tr>
<tr onclick="colorize(this);" id="item_2" tcolor="">
<td class="firmname" id="item_2"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=e0c712d8-215d-4000-9a64-f02c7200005c">Alco</a></td>
<td style="white-space:nowrap;">M * * * 5</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">1</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-71fb-0241-720c00002c7d" target="_blank">0</a></td>
<td class="price" align="right">37 700 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-71fb-0241-720c00002c7d&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_3" tcolor="">
<td class="firmname" id="item_3"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=b113459e-001c-4000-a33e-5021bd20005c">Bosch</a></td>
<td style="white-space:nowrap;">1 * * * 9</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">8</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-3495-0002-bd11000021c2" target="_blank">0</a></td>
<td class="price" align="right">30 200 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-3495-0002-bd11000021c2&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_4" tcolor="">
<td class="firmname" id="item_4"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=40f20c71-000a-400f-bd7d-02c720005c78">Champion</a></td>
<td style="white-space:nowrap;">X * * * 6</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">1</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-713d-0142-720c00002cb0" target="_blank">0</a></td>
<td class="price" align="right">59 500 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-713d-0142-720c00002cb0&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_5" tcolor="">
<td class="firmname" id="item_5"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=50d11138-0008-4436-b40f-02d2f0005cc4">Clean filters</a></td>
<td style="white-space:nowrap;">M * * * 0</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">100</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-385f-012b-2f1100002df5" target="_blank">0</a></td>
<td class="price" align="right">32 500 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-385f-012b-2f1100002df5&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_6" tcolor="">
<td class="firmname" id="item_6"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=e0cb777d-0ecd-4000-8f30-802be890005c">Filtron</a></td>
<td style="white-space:nowrap;">O * * * 1</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">10</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-b781-0297-e80c00002be2" target="_blank">0</a></td>
<td class="price" align="right">29 000 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-b781-0297-e80c00002be2&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_7" tcolor="">
<td class="firmname" id="item_7"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=64e20c71-000c-40c6-8e51-02c720005c0f">Fram</a></td>
<td style="white-space:nowrap;">C * * * O</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">31</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-7151-00e8-720c00002c21" target="_blank">0</a></td>
<td class="price" align="right">45 500 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-7151-00e8-720c00002c21&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_8" tcolor="">
<td class="firmname" id="item_8"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;" href="hint/?s=a1135e09-11ba-4000-a216-d02b3670005c">Hengst</a></td>
<td style="white-space:nowrap;">E * * * 8</td>
<td align="center" style="white-space:nowrap;"></td>
<td>Фильтр масляный</td>
<td align="center">10</td>
<td align="center">1</td>
<td class="statis"><a class="stat" onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false" href="/stat/hint/deliv.aspx?d=0&s=0100f98e-5c00-35e4-0024-361100002b92" target="_blank">0</a></td>
<td class="price" align="right">48 900 р.</td>
<td class="basket"><a title="Купить" href="/profile/orders/basket.aspx?pid=83A07C7A&in=0100f98e-5c00-35e4-0024-361100002b92&sr=-4"></a></td>
</tr>
<tr onclick="colorize(this);" id="item_9" tcolor="">
<td class="firmname" id="item_9"><a onclick="javascript:ShowTipLayer(this,event,this.href, 30,130); return false;"
...
</tr>
</tbody>
</table>
Also note that it has Russian symbols.
My Ruby code looks like this:
html = open('http://exist.by/price.aspx?pcode=ox143d')
require 'nokogiri'
require 'pp'
doc = Nokogiri::HTML(html)
doc.encoding = 'utf-8'
rows = doc.xpath('//table[#id="gvResultTable"]/tbody/tr[#id="item_1"]')
#details = rows.collect do |row|
detail = {}
[
[:firmname, 'td[1]/text()'],
[:price, 'td[8]/text()'],
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
pp #details
logger.warn("!!!!!!!!!!")
logger.warn(#details)
I don't know how to correctly fetch data in tr with itemid.
The HTML is flawed; There are more than one element with the same id attribute: <tr onclick="colorize(this);" id="item_2" tcolor=""> <td class="firmname" id="item_2">.
The id of the table element in the HTML is "gvResult" while in the Ruby code you are asking Nokogiri to look for a table where "id=gvResultTable".
Nokogiri uses UTF-8 encoding to store strings internally, so you shouldn't have any problem with Russian characters.
Provided the HTML can be fixed, this works fine:
HTML:
<table id="gvResult">
<tbody>
<tr id="item_1">
<td class="firmname">Example1</td>
<td class="price">42.00</td>
</tr>
<tr id="item_2">
<td class="firmname">Example2</td>
<td class="price">24.00</td>
</tr>
</tbody>
</table>
Ruby:
require 'rubygems'
require 'nokogiri'
require 'pp'
html = open('http://www.example.com/page')
doc = Nokogiri::HTML(html)
doc.encoding = 'utf-8'
rows = doc.search('//tr[starts-with(#id, "item_")]')
#details = rows.collect do |row|
detail = {}
[
[:firmname, 'td[1]/text()'],
[:price, 'td[2]/text()'],
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
pp #details
I presumed that you want to get the data from all the tr elements with an id like "item_\d+" hence I used doc.search('//tr[starts-with(#id, "item_")]'). Change it to suit your needs.

Resources