3

古いインフラジスティックス UltraWebGrid のかなり複雑な実装があります。アップグレードするように言われただけでも、ブラウザーの互換性を強制しようとしています。私のグリッドは、IE 以外のブラウザの特定のグリッドの行をレンダリングしていません。以下に追加する組み込みのjavascriptにエラーを追跡しました。動的に追加された行をレンダリングしようとする前に、グリッド html テーブルに tbody 要素を追加することで、グリッドを強制的に機能させることができると思います。このアイデアに出くわすための私のロジックは以下のとおりです。どうすればこれを行うことができますか?

This SO questionに従って、IE のみが tbody 要素を空のテーブルに自動的に追加します。他のブラウザでは、tbody 要素が存在するために少なくとも 1 つの行が必要です。このグリッドのレンダリングを妨げていると思われる JavaScript エラーは、メイン グリッド テーブルの tbody 要素を取得できないことです。これは、ブラウザーが IE 以外の場合、javascript を介してテーブル内の tbody 要素を強制することで修正できるはずです。

古いインフラジスティックス グリッドの組み込み JavaScript は、この tbody 要素が空のグリッドにあると想定しているようです。このため、javascript が存在しない要素を呼び出しているため、私のページは IE 以外のブラウザーでグリッドの行を読み込むことができません。

JavaScript を壊す:

(これは、IE 以外のブラウザーでは最後の行で中断されます。tbody 要素がないためだと思います)

var strTransform = this.applyXslToNode(this.Node);
if (strTransform)
{
    var anId = (this.AddNewRow ? this.AddNewRow.Id : null);
    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;
4

1 に答える 1

1

上部に innerHTML を設定する場合は、tbody を追加することをお勧めします。strTransform に既に tbody が含まれているかどうかを確認し、含まれていない場合は自分で追加します。何かのようなもの:

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>";
于 2012-11-30T16:22:08.890 に答える