Переопределение встроенного JavaScript в сторонний контроль (Infragistics UltraWebGrid)
Я использую старую версию UltraWebGrid
по Infragistics и необходимо заменить некоторые из встроенных JavaScript. Скомпилированный js выглядит как добавление набора функций к объектному типу как своего рода API. отформатирован как:
var igtbl_ptsBand = ["functionname1",function(){...},"functionname2",function(){...},...
и так далее. Как бы я переопределил это?
В основном, элемент управления добавляет html на страницу способом, который не совместим с более новыми браузерами, а код javascript, который делает это, просто нуждается в небольшой настройке. Я нашел код... Мне просто нужно изменить его.
Код можно найти здесь
Я добавил ответ, чтобы добавить примеры кода в и прочее. Я не буду выбирать этот ответ
3 ответа
Упомянутый вами массив выглядит как таблица функций:
var igtbl_ptsBand = ["func1", function() { }, "func2", function() { } ]
Я бы рекомендовал использовать цепочку вместо просто переопределения. С помощью цепочки вы можете ввести свой собственный код, но при этом вызывать оригинальную функцию. Допустим, вы хотите заменить "func2" и цепочку. Вы могли бы сделать что-то вроде этого:
var origFunc, findex, ix;
if (igtbl_ptsBand.indexOf) {
// indexOf is supported, use it
findex = igtbl_ptsBand.indexOf("func2") + 1;
} else {
// Crippled browser such as IE, no indexOf, use loop
findex = -1;
for (ix = 0; ix < igtbl_ptsBand.length; ix += 2) {
if (igtbl_ptsBand[ix] === "func2") {
findex = ix + 1;
break;
}
}
}
if (findex >= 0) {
// Found it, chain
origFunc = igtbl_ptsBand[findex];
igtbl_ptsBand[findex] = function() {
// Your new pre-code here
// Call original func (chain)
origFunc();
// Your new post-code here
};
}
Конечно, у origFunc могут быть аргументы, и вы можете использовать функцию JavaScript call(), чтобы установить "this указатель" на что-то конкретное, например:
origFunc.call(customThis, arg1, arg2...);
Если аргументы находятся в массиве, вы можете использовать apply() вместо call().
Я не рекомендовал бы делать это. Вы всегда должны пытаться работать со сторонней библиотекой, а не против нее. Это сказанное, это должно работать:
igtbl_ptsBand[igtbl_ptsBand.indexOf("functionYouWantToOverwrite") + 1] = function () {
// your new stuff...
};
Хорошо, вот что я делаю. Я буду обновлять это с моим прогрессом.
Это решает мою проблему. Оказывается, мне пришлось применить functionarray ко всем дочерним объектам родительских "строк". Для этого я добавил код в свою функцию "Fix Rows". Я разделил это, потому что я бегу через другую ошибку JS браузера, которую я исправляю в этом файле js.
Вот файл js, который я добавил на свою страницу.net примерно так...
</form>
<script type="text/javascript" src="../../scripts/BrowserCompat.js"></script>
</body>
</html>
,
Brows_FixUltraWebGrid();
function Brows_FixUltraWebGrid() {
FixRows();
}
function FixRows() {
FixGridRows_render();
for (var i = 0; i < igtbl_ptsRows.length; i += 2)
igtbl_Rows.prototype[igtbl_ptsRows[i]] = igtbl_ptsRows[i + 1];
}
function FixGridRows_render() {
var origFunc, findex, ix;
if (igtbl_ptsRows.indexOf) {
// indexOf is supported, use it
findex = igtbl_ptsRows.indexOf("render") + 1;
} else {
// Crippled browser such as IE, no indexOf, use loop
findex = -1;
for (ix = 0; ix < igtbl_ptsRows.length; ix += 2) {
if (igtbl_ptsRows[ix] === "render") {
findex = ix + 1;
break;
}
}
}
if (findex >= 0) {
// Found it, chain
origFunc = igtbl_ptsRows[findex];
igtbl_ptsRows[findex] = function() {
// Your new pre-code here
// Call original func (chain)
//origFunc();
// Your new post-code here
var strTransform = this.applyXslToNode(this.Node);
if (strTransform) {
var anId = (this.AddNewRow ? this.AddNewRow.Id : null);
//new logic to include tbody if it is not there
var tadd1 = '';
var tadd2 = '';
if (!(/\<tbody\>/.test(strTransform))) {
tadd1 = '<tbody>';
tadd2 = '</tbody>';
}
this.Grid._innerObj.innerHTML =
"<table style=\"table-layout:fixed;\">" + tadd1 + strTransform + tadd2 + "</table>";
//old line
//this.Grid._innerObj.innerHTML = "<table style=\"table-layout:fixed;\">" + strTransform + "</table>";
var tbl = this.Element.parentNode;
igtbl_replaceChild(tbl, this.Grid._innerObj.firstChild.firstChild, this.Element);
igtbl_fixDOEXml();
var _b = this.Band;
var headerDiv = igtbl_getElementById(this.Grid.Id + "_hdiv");
var footerDiv = igtbl_getElementById(this.Grid.Id + "_fdiv");
if (this.AddNewRow) {
if (_b.Index > 0 || _b.AddNewRowView == 1 && !headerDiv || _b.AddNewRowView == 2 && !footerDiv) {
var anr = this.AddNewRow.Element;
anr.parentNode.removeChild(anr);
if (_b.AddNewRowView == 1 && tbl.tBodies[0].rows.length > 0)
tbl.tBodies[0].insertBefore(anr, tbl.tBodies[0].rows[0]);
else
tbl.tBodies[0].appendChild(anr);
}
this.AddNewRow.Element = igtbl_getElementById(anId);
this.AddNewRow.Element.Object = this.AddNewRow;
}
this.Element = tbl.tBodies[0];
this.Element.Object = this;
this._setupFilterRow();
for (var i = 0; i < this.Band.Columns.length; i++) {
var column = this.Band.Columns[i];
if (column.Selected && column.hasCells()) {
var col = this.getColumn(i);
if (col)
igtbl_selColRI(this.Grid.Id, col, this.Band.Index, i);
}
}
if (this.ParentRow) {
this.ParentRow.ChildRowsCount = this.length;
this.ParentRow.VisChildRowsCount = this.length;
}
}
console.log('overridden row render function executed');
};
}
}