覆盖内置到第三方控件的javascript(infragistics UltraWebGrid)

覆盖内置到第三方控件的javascript(infragistics UltraWebGrid),javascript,overriding,infragistics,Javascript,Overriding,Infragistics,我使用的是Infragistics的旧版本UltraWebGrid,需要替换一些内置javascript。编译后的js看起来像是在向对象类型添加一堆函数,作为某种api。格式如下: var igtbl_ptsBand = ["functionname1",function(){...},"functionname2",function(){...},... 等等。我该如何覆盖它 基本上,该控件以一种与较新浏览器不兼容的方式向页面添加html,而实现这一点的javascript代码只需稍加调整

我使用的是Infragistics的旧版本
UltraWebGrid
,需要替换一些内置javascript。编译后的js看起来像是在向对象类型添加一堆函数,作为某种api。格式如下:

var igtbl_ptsBand = ["functionname1",function(){...},"functionname2",function(){...},... 
等等。我该如何覆盖它

基本上,该控件以一种与较新浏览器不兼容的方式向页面添加html,而实现这一点的javascript代码只需稍加调整。我找到了密码。。。我只需要换一下

代码可以找到

我添加了一个答案,将代码示例转储到和诸如此类的内容中。我不会选择这个答案


我不建议这样做。您应该始终尝试使用第三方库,而不是反对它。也就是说,这应该是可行的:

igtbl_ptsBand[igtbl_ptsBand.indexOf("functionYouWantToOverwrite") + 1] = function () {
    // your new stuff...
};

您提到的数组似乎是一个函数表:

var igtbl_ptsBand = ["func1", function() { }, "func2", function() { } ]
我建议使用链接,而不仅仅是覆盖。通过链接,您可以插入自己的代码,但仍然可以调用原始函数。假设您要替换“func2”和chain。你可以这样做:

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
    };
}

如果参数在一个数组中,可以使用apply()而不是call()。

好的,下面是我要做的。我会用我的进度更新这个

这解决了我的问题。事实证明,我必须将functionarray应用于父“行”的所有子对象。为此,我在“FixRows”函数中添加了代码。我将其拆分,因为我正在运行accross其他浏览器JS错误,我正在修复此JS文件中的错误

这是我添加到.net页面的js文件,如下所示

    </form>
    <script type="text/javascript" src="../../scripts/BrowserCompat.js"></script>
</body>
</html>

Brows_FixUltraWebGrid();
函数browss_FixUltraWebGrid(){
FixRows();
}
函数FixRows(){
FixGridRows_render();
对于(变量i=0;i=0){
//找到了,链子
origFunc=igtbl_ptsRows[findex];
igtbl_ptsRows[findex]=函数(){
//你的新密码在这里
//调用原始函数(链)
//origFunc();
//你的新邮政编码在这里
var strTransform=this.applyXslToNode(this.Node);
if(标准转换){
var anId=(this.AddNewRow?this.AddNewRow.Id:null);
//新逻辑包括tbody(如果不存在)
变量tadd1='';
var tadd2='';
如果(!(/\/.test(strTransform))){
tadd1='';
tadd2='';
}
此.Grid.\u innerObj.innerHTML=
“+tadd1+strTransform+tadd2+”;
//老一套
//此.Grid._innerObj.innerHTML=“+strTransform+”;
var tbl=this.Element.parentNode;
igtbl_replaceChild(tbl,this.Grid.\u innerObj.firstChild.firstChild,this.Element);
igtbl_fixDOEXml();
var _b=该.Band;
var headerDiv=igtbl_getElementById(this.Grid.Id+“_hdiv”);
var footerDiv=igtbl_getElementById(this.Grid.Id+“_fdiv”);
if(this.AddNewRow){
如果(_b.Index>0 | | | u b.AddNewRowView==1&&!headerDiv | | | u 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]。行[0]);
其他的
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;
这个;
for(var i=0;i
我必须在cheep上解决问题,而且有太多的开发人员需要许可证才能升级到与浏览器兼容的控件的新版本,所以这是我唯一的选择。谢谢,顺便说一句。。。现在检查一下,注意旧版本的IE(8或更少)不支持indexOf。如果indexOf未定义,您可能需要使用循环。我需要将此javascript放在哪里才能工作?它可以运行,但旧的javascript仍在运行used@jumpdart将其放置在原始函数赋值后的任何位置都应该有效。似乎它正在重置为原始函数。。。调查一下。我添加了一个问题来解释我是如何处理这些组件的。我以前使用过这些组件,但不知何故我是这样做的
    </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');
        };
    }
}