Здравствуйте!
Вобщем такая проблема:
пытаюсь создать свой собственный грид (функция возвращающая объект, с данными для отрисовки и сортировки их в таблице)
var realGrid = function(GridSettings){
var grid = new Object();
var tmp;
grid.id = GridSettings.id;
grid.data = GridSettings.data;
grid.idOfDrawPlace = document.getElementById(GridSettings.idOfDrawPlace);
grid.FLP = new Array(); //FLP = first lvl propertys
if(GridSettings.indToString){
tmp = 0;
for(var p in GridSettings.data[0]){
grid.FLP[tmp] = new Object();
grid.FLP[tmp].ind = p;
grid.FLP[tmp].sortUp = true;
for(var i=0; i < GridSettings.indToString.length; i++){
for(var q in GridSettings.indToString[i]){
if(p==q){
grid.FLP[tmp].name = GridSettings.indToString[i].name;
grid.FLP[tmp].dt = GridSettings.indToString[i].dt;
break;
}
else{
grid.FLP[tmp].name = grid.FLP[tmp].ind;
grid.FLP[tmp].dt = "str";
}
}
}
tmp++;
}
}
else{
tmp = 0;
for(var p in GridSettings.data[0]){
grid.FLP[tmp] = new Object();
grid.FLP[tmp].ind = p;
grid.FLP[tmp].sortUp = true;
grid.FLP[tmp].name = p;
grid.FLP[tmp].dt = "str";
tmp++;
}
}
grid.draw = function(){
var htmlStr = '<table id="tab'+grid.id+'">';
for(var i = 0; i < this.FLP.length; i++){
htmlStr += '<th onclick="this.sortBy('+i+')\;">'+
this.FLP[i].name+'</th>';
}
for(var i =0; i < this.data.length; i++){
htmlStr += '<tr>';
for(var p = 0; p < this.FLP.length; p++){
htmlStr += '<td>'+this.data[i][this.FLP[p].ind]+'</td>';
}
htmlStr += '</tr>';
}
htmlStr += '</table>';
this.idOfDrawPlace.innerHTML = htmlStr;
}
grid.clean = function(){
this.idOfDrawPlace.innerHTML = "";
}
grid.sortBy = function (ind){
this.nowSortBy = this.FLP[ind].ind;
this.nowSortType = this.FLP[ind].dt;
if(this.FLP[ind].sortUp){
this.data.sort(this.sortRuleUp);
}
else{
this.data.sort(this.sortRuleDown);
}
}
grid.sortRuleUp = function(a,b){
switch (this.nowSortType){
case "str":
if(a[this.nowSortBy] < b[this.nowSortBy]){
return -1;
} else if (a[this.nowSortBy] > b[this.nowSortBy]){
return 1;
} else return 0;
break;
case "num":
if(a[this.nowSortBy]-0 < b[this.nowSortBy]-0){
return -1;
} else if (a[this.nowSortBy]-0 > b[this.nowSortBy]-0){
return 1;
} else return 0;
break;
default: return 0; break;
}
}
grid.sortRuleDown = function(a,b){
switch (this.nowSortType){
case "str":
if(a[this.nowSortBy] > b[this.nowSortBy]){
return -1;
} else if (a[this.nowSortBy] < b[this.nowSortBy]){
return 1;
} else return 0;
break;
case "num":
if(a[this.nowSortBy]-0 > b[this.nowSortBy]-0){
return -1;
} else if (a[this.nowSortBy]-0 < b[this.nowSortBy]-0){
return 1;
} else return 0;
break;
default: return 0; break;
}
}
return grid;
}
проблема обнаружилась в создании события onclick в тэгах th для сортировки таблицы (и в т.ч. массива) по заданному полю.
т.к. переменная которая получит результат грида заранее неизвестна,
поэтому и слудеющая часть кода ошибочна (в функции .draw):
htmlStr += '<th onclick="this.sortBy('+i+')\;">'+.......
как можно повесить на onclick вызов функции sortBy, если при этом она принадлежит неизвестному объекту?
P.S. функция грид принимает объект со следующими настройками:
var Obj = new Object(); // создаем объект
Obj.data // сюда кладем массив с объектами
Obj.idOfDrawPlace // id тэга куда врисовать таблицу
Obj.colInfo = new Array(); // массив с данным о колонках
Obj.colInfo[0].ind; // свойство объекта
Obj.colInfo[0].name; // расшифровка свойства полным словом
Obj.colInfo[0].dt; // data type (тип данных) либо "str либо "num"
................................. // и так далее для каждой колонки
//будущей таблицы
Obj.id; //уникальный id грида