Handsontable 更改单元格颜色相对于下一列的下一个单元格
Handsontable change cell color with respect to the next cell of next column
我有一个handsontable
如下:
$(document).ready(function () {
$("#example1grid").handsontable({
colHeaders: [],
});
var data = [
["2008", 10, 11, 12, 13],
["2009", 20, 0, 14, 13],
["2010", 30,35, 12, 13]
];
$("#example1grid").handsontable("loadData", data);
});
我需要的是:
我的 B 列的值为:10,20,30 和 C 列 -> 11,0,35
如果 单元格 C 中的值 > 单元格 B 中的值,则单元格 B 的背景颜色应为红色 否则 单元格 B 的背景颜色应为绿色.
因此在结果单元格 B 中,值为 10,30 -> 红色和 20 -> 绿色
检查fiddle:FIDDLE
尝试:
$(document).ready(function () {
$("#example1grid").handsontable({
colHeaders: ["", "Kia", "Nissan", "Toyota", "Honda"],
});
var data = [
["2008", 10, 11, 12, 13],
["2009", 20, 11, 14, 13],
["2010", 30, 15, 12, 13]
];
$("#example1grid").handsontable("loadData", data);
//$('td').css('background-color', 'red');
});
Handsontable.hooks.add('afterRender', function(){
var f = $('.htCore').find('tbody tr td:nth-child(2)');
var s = $('.htCore').find('tbody tr td:nth-child(3)');
f.each(function(i,v){
if (s.eq(i).text() > $(v).text()) {
$(v).css({'background':'red'});
} else {
$(v).css({'background':'green'});
}
});
});
http://jsfiddle.net/2ra8gwa7/1/
或:
$("#example1grid").handsontable("loadData", data);
//$('td').css('background-color', 'red');
});
Handsontable.hooks.add('afterRender', function() {
var d = this;
var col1 = d.getDataAtCol(1);
var col2 = d.getDataAtCol(2);
$.each(col1,function(i,v){
if (col2[i] > v ) {
$(d.getCell(i,1)).css({'background':'red'});
} else {
$(d.getCell(i,1)).css({'background':'green'});
}
});
根据我对非 DOM 操作解决方案的评论,这里是一个使用本地 Handsontable 方法的解决方案:
http://jsfiddle.net/zekedroid/2ra8gwa7/2/
重要的一点是渲染器。当尝试应用不同的渲染行为时,而不是在渲染后操纵 DOM,您应该使用这些自定义渲染器:
function colorRenderer(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
// get reference to data
var data = instance.getData();
// grab the value of the current row at the column we want to compare to
var valueAtC = data[row][2];
if (valueAtC > value) {
td.style.backgroundColor = 'red';
} else {
td.style.backgroundColor = 'green';
}
return td;
};
如您所见,我们所要做的就是仅将此渲染器应用于 B
列,因此无论何时渲染该列上的任何单元格,它都会检查同一行的值,但在列 C
上。然后我们将更改直接应用到 td
,这确保所有 Handsontable 方法都可以访问这个 DOM 元素,而不是手动操作的元素!
我有一个handsontable
如下:
$(document).ready(function () {
$("#example1grid").handsontable({
colHeaders: [],
});
var data = [
["2008", 10, 11, 12, 13],
["2009", 20, 0, 14, 13],
["2010", 30,35, 12, 13]
];
$("#example1grid").handsontable("loadData", data);
});
我需要的是:
我的 B 列的值为:10,20,30 和 C 列 -> 11,0,35
如果 单元格 C 中的值 > 单元格 B 中的值,则单元格 B 的背景颜色应为红色 否则 单元格 B 的背景颜色应为绿色.
因此在结果单元格 B 中,值为 10,30 -> 红色和 20 -> 绿色
检查fiddle:FIDDLE
尝试:
$(document).ready(function () {
$("#example1grid").handsontable({
colHeaders: ["", "Kia", "Nissan", "Toyota", "Honda"],
});
var data = [
["2008", 10, 11, 12, 13],
["2009", 20, 11, 14, 13],
["2010", 30, 15, 12, 13]
];
$("#example1grid").handsontable("loadData", data);
//$('td').css('background-color', 'red');
});
Handsontable.hooks.add('afterRender', function(){
var f = $('.htCore').find('tbody tr td:nth-child(2)');
var s = $('.htCore').find('tbody tr td:nth-child(3)');
f.each(function(i,v){
if (s.eq(i).text() > $(v).text()) {
$(v).css({'background':'red'});
} else {
$(v).css({'background':'green'});
}
});
});
http://jsfiddle.net/2ra8gwa7/1/
或:
$("#example1grid").handsontable("loadData", data);
//$('td').css('background-color', 'red');
});
Handsontable.hooks.add('afterRender', function() {
var d = this;
var col1 = d.getDataAtCol(1);
var col2 = d.getDataAtCol(2);
$.each(col1,function(i,v){
if (col2[i] > v ) {
$(d.getCell(i,1)).css({'background':'red'});
} else {
$(d.getCell(i,1)).css({'background':'green'});
}
});
根据我对非 DOM 操作解决方案的评论,这里是一个使用本地 Handsontable 方法的解决方案:
http://jsfiddle.net/zekedroid/2ra8gwa7/2/
重要的一点是渲染器。当尝试应用不同的渲染行为时,而不是在渲染后操纵 DOM,您应该使用这些自定义渲染器:
function colorRenderer(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
// get reference to data
var data = instance.getData();
// grab the value of the current row at the column we want to compare to
var valueAtC = data[row][2];
if (valueAtC > value) {
td.style.backgroundColor = 'red';
} else {
td.style.backgroundColor = 'green';
}
return td;
};
如您所见,我们所要做的就是仅将此渲染器应用于 B
列,因此无论何时渲染该列上的任何单元格,它都会检查同一行的值,但在列 C
上。然后我们将更改直接应用到 td
,这确保所有 Handsontable 方法都可以访问这个 DOM 元素,而不是手动操作的元素!