Собрал быстрый и грязный пример, чтобы начать. По сути, таблица с функцией 'draw' сработает при поиске или фильтровании события. Оттуда вы перебираете все видимые отфильтрованные строки, используя это: { filter : 'applied'}
Запустите этот фрагмент и найдите «Нью-Йорк». Затем проверьте консоль, чтобы увидеть, как ведут себя данные и числа.
Или эту скрипку, если вы предпочитаете ...
var mytable = new Object();
var tableData = [
{name: 'Clark Kent', city: 'Metropolis', numCol: '10', numCol2: '6'},
{name: 'Bruce Wayne', city: 'New York', numCol: '', numCol2: '12'},
{name: 'Steve Rogers', city: 'New York', numCol: '30', numCol2: '10'},
{name: 'Peter Parker', city: 'New York', numCol: '44', numCol2: ''},
{name: 'Thor Odinson', city: 'Asgard', numCol: '55', numCol2: '15'}
];
mytable = $('#mytable').DataTable({
"search": {
"regex": true
},
sDom: 'lrftip',
data: tableData,
columns: [
{data: 'name', title: 'Name'},
{data: 'city', title: 'City'},
{data: 'numCol', title: 'Number'},
{data: 'numCol2', title: 'Hidden Num', visible: false}
],
columnDefs: [
{ className: "sum", "targets": [2] },
]
});
mytable.on( 'draw', function () {
console.log( 'Redraw occurred at: '+new Date().getTime() );
var myCount = 0;
var totalSum = 0;
mytable.rows( { filter : 'applied'} ).every(function (rowIdx, tableLoop, rowLoop) {
var data = this.data();
console.log('num1: ' + data.numCol + ' num2: ' + data.numCol2);
if (data.numCol !== '') {
//Add to counter
myCount += 1;
}
if (data.numCol2 !== '') {
//Sum it up
totalSum += parseInt(data.numCol2);
}
});
console.log('myCount: ' + myCount + ' totalSum: ' + totalSum);
} );
Name
City
Number1
Number2
Name
City
Number1
Number2
Надеюсь, это поможет.
Так как нажатие позволяет больше чем одному элементу быть продвинутым, я использую переменную аргументов ниже, чтобы позволить реальному методу нажатия иметь все аргументы.
Это решение только влияет на переменную прибытия:
arr.push = function (){
//Do what you want here...
return Array.prototype.push.apply(this,arguments);
}
Это решение влияет на все массивы. Я не рекомендую сделать это.
Array.prototype.push=(function(){
var original = Array.prototype.push;
return function() {
//Do what you want here.
return original.apply(this,arguments);
};
})();
Вы могли сделать это этот путь:
arr = []
arr.push = function(data) {
alert(data); //callback
return Array.prototype.push.call(this, data);
}
, Если Вы находитесь в ситуации без вызова, Вы могли бы также пойти для этого решения:
arr.push = function(data) {
alert(data); //callback
//While unlikely, someone may be using psh to store something important
//So we save it.
var saved = this.psh;
this.psh = Array.prototype.push;
var ret = this.psh(data);
this.psh = saved;
return ret;
}
Редактирование:
, В то время как я говорю Вам, как сделать это, Вы могли бы быть лучше обслужены с использованием другого метода, который работает, обратный вызов затем просто звонит, спешат массив вместо того, чтобы переопределить нажатие. Можно закончить с некоторыми неожиданными побочными эффектами. Например, нажатие, кажется, varadic (берет переменное количество аргументов, как printf), и вышеупомянутое использования повредило бы это.
необходимо было бы сделать путаницу с _Arguments () и _ArgumentsLength () для надлежащего переопределения этой функции. Я высоко предлагаю против этого маршрута.
Редактирование еще раз: Или Вы могли использовать "аргументы", это будет работать также. Все еще отговорите от следования этим маршрутом все же.
Я сделал бы это:
var callback = function() { alert("called"); };
var original = Array.prototype.push;
Array.prototype.push = function()
{
callback();
return original.apply(this, arguments);
};
, Если Вы хотели, чтобы аргументом был обратный вызов, Вы могли бы сделать это:
var original = Array.prototype.push;
Array.prototype.push = function(callback)
{
callback();
return original.apply(this, Array.prototype.slice.call(arguments, 1));
}
они оба были протестированы.
Array.prototype.push был представлен в JavaScript 1.2. Это действительно настолько просто:
Array.prototype.push = function() {
for( var i = 0, l = arguments.length; i < l; i++ ) this[this.length] = arguments[i];
return this.length;
};
Вы могли всегда добавлять что-то перед этим.