0

私のシステムは 500 ミリ秒ごとにデータを取り出し、私の画面は互いに離れた html テーブルでいっぱいです。また、すべてのセルには一意のキー属性があります。とにかくすべてをキャッシュしています。

上記の tableRows の cellElements の settimeout 関数を含むグローバル JavaScript オブジェクト (_cellColorTimeouts) があります。セルのキャッシュ後、システムはタイムアウト関数を作成し、特定のセルの css を消去します (3000 ミリ秒)。

以下のコード ブロックでは、uiElementKey_X と uiElementKey_Y はまったく同じですが、キャッシュされるものが異なります。テーブルIDに一意のサフィックスを追加すると、それらが異なります。このプロセスは、行アイテムとセル アイテムに対しても行われます。

_cellColorTimeouts データの例は

//array object keys are names of unique cell items.
_cellColorTimeouts = [uiElementKey_X_1, uiElementKey_X_2, uiElementKey_X_3,
                      uiElementKey_Y_1, uiElementKey_X_2, uiElementKey_Y_3];

. 
. //does somethings to change cell colour
.

    //after 3 seconds i need to clear css of this cell without looping the dom so i do it via cached dom.
    if (_cellColorTimeouts.hasOwnProperty(uiElementKey) && _cellColorTimeouts[uiElementKey] != null) {
         clearTimeout(_cellColorTimeouts[uiElementKey]);
         _cellColorTimeouts[uiElementKey] = null;
       }
       _cellColorTimeouts[uiElementKey] = setTimeout(function () {
               clearColourOfCell(cell);
       }, 3000);
}

function clearColourOfCell(cell) {
    cell.style.backgroundColor = cell.rowBGColour;
    cell.style.color = "black";
    _cellColorTimeouts[cell.uiElementKey] == null;
    clearTimeout(_cellColorTimeouts[cell.uiElementKey]);
}

したがって、問題はsettimeout関数が最初のテーブルでは機能しないことですが、2番目のテーブルはまったく問題ありません。グローバルから settimeout 関数が ID を返すかどうかを確認しました。はい、あります。最初のテーブルでは、どういうわけか機能しません。この質問が私の場合にはあまりにもユニークであることはわかっていますが、どんなアイデアでも評価されますか?

---- 編集 ---- フル機能ノーカット バージョン -----

function setWidgetData(widgetId, rowId, colId, value, colIndex) {
"use strict";

// check colIndex
if (colIndex === undefined || colIndex === null) {
    colIndex = 0;
}

// loop on ui tables
var uiTables = _widgetUIElements[widgetId];
//var timeout;
for (var tableId in uiTables) {
    var uiTable = uiTables[tableId];
    var uiElementKey = tableId + "#" + rowId + "#" + colId + "#" + colIndex;
    var cellCachedObject = uiTable[uiElementKey];

    // check cell
    if (cellCachedObject == undefined) {
        //console.log("cell is undefined : " + "widgetId : " + widgetId + " - " + "rowId : " + rowId + " - " + "colId : " + colId + " - " + "colIndex : " + colIndex);
    }
    else {
        // get cell
        var cell = cellCachedObject["domElement"];
        // set sell value
        var cellValue = value;

        // is value numeric? it means we will make some conversions on value
        if (isNumeric(cellValue)) {
            var canPaint = false;
            // check cell entity
            switch (cellCachedObject["entity"]) {
                // date-time?           
                case "DATETIME":
                    // convert unix date time to readable date time
                    cellValue = new Date(fixDecimalSeparator(cellValue) * 1000);
                    cellValue = fixDateTimeDigits((cellValue.getDate())) + "/" + fixDateTimeDigits((cellValue.getMonth() + 1)) + " " + fixDateTimeDigits(cellValue.getHours()) + ":" + fixDateTimeDigits(cellValue.getMinutes());
                    break;
                // date?           
                case "DATE":
                    // convert unix date time to readable date time
                    cellValue = new Date(fixDecimalSeparator(cellValue) * 1000);
                    cellValue = fixDateTimeDigits((cellValue.getDate())) + "/" + fixDateTimeDigits((cellValue.getMonth() + 1));
                    break;
                // numeric?          
                case "NR":
                    // fix "," character in value
                    cellValue = fixDecimalSeparator(cellValue);
                    //just format the presicion
                    cellValue = number_format(cellValue, cellCachedObject["precision"], '.', ',');
                    canPaint = true;
                    break;
                // other?           
                default:
                    // fix "," character in value
                    cellValue = fixDecimalSeparator(cellValue);
                    // if cell is number, no entity conversion
                    // entity convertion
                    cellValue = entityConverter(cellCachedObject["entity"], cellCachedObject["entityTo"], cellValue);
                    cellValue = new Number(cellValue).toFixed(cellCachedObject["precision"]);

                    // if widget currency is not USD. it means user selected currency from currency list or default user currency
                    if (cellCachedObject["isConvertable"]) {
                        // this scoop is not active with the new xml. if FOREX1 widget entity is RECIPCUR but never should not be
                        if (cellCachedObject["widgetIsFOREX1"]) {
                            cellValue = _currencyConverter.convertTrend(cellValue, cellCachedObject.currencyValueType, cellCachedObject["currencyTo"], cellCachedObject["rowId"], cellValue);
                        }
                        else {
                            cellValue = _currencyConverter.convert(cellValue, cellCachedObject["currency"], null, cellCachedObject["precision"]);
                        }
                    }
                    canPaint = true;
            }

            // if it is not date time
            if (canPaint) {
                // get current value of cell
                var currentValue = cell.getAttribute("currentValue");
                // check current value of cell make them coloured.
                if (currentValue !== undefined) {
                    // new value is bigger than old value
                    var newVal = parseFloat(value);
                    var oldVal = parseFloat(currentValue);
                    var rowBGColour = cellCachedObject["rowBGColor"];
                    cell.rowBGColour = rowBGColour;
                    cell.uiElementKey = uiElementKey;
                    if (newVal > oldVal) {
                        //cell.css({ "background-color": "Green", "color": "White" });
                        cell.style.backgroundColor = "green";
                        cell.style.color = "white";
                    }
                    // new value is smaller than old value
                    if (newVal < oldVal) {
                        //cell.css({ "background-color": "Red", "color": "White" });
                        cell.style.backgroundColor = "red";
                        cell.style.color = "white";
                    }
                    if (_cellColorTimeouts.hasOwnProperty(uiElementKey) && _cellColorTimeouts[uiElementKey] != null) {
                        clearTimeout(_cellColorTimeouts[uiElementKey]);
                        _cellColorTimeouts[uiElementKey] = null;
                    }
                    _cellColorTimeouts[uiElementKey] = setTimeout(function () {
                        return function () {
                            clearColourOfCell(cell);
                        };
                    } (cell), 3000);
                    newVal = oldVal = rowBGColour = null;
                }
                currentValue = null;
            }
            canPaint = null;

            // set new value as a current value
            cell.setAttribute("currentValue", value);
        }

        cell.innerHTML = '';
        cell.innerHTML = cellValue;

        cellValue = null;
    }

    uiTable = uiElementKey = cellCachedObject = null;
}

uiTables = null;
}
4

1 に答える 1

1

あなたは私がこれが問題であることを確実に知るのに十分なコードを投稿しませんでした、しかしそれは良い賭けです:

   _cellColorTimeouts[uiElementKey] = setTimeout(function () {
      return function() {
           clearColourOfCell(cell);
      };
   }(cell), 3000);

このようにタイムアウトハンドラーを設定することで、ハンドラーがその「セル」変数の独自のプライベートコピーを確実に持つようになり、ハンドラーが最終的に呼び出される前に「セル」がどのように変更されても、そのコピーは正しい値を保持します。 。

于 2012-07-11T15:07:26.190 に答える