0

私のasp.netページでは、ダーティコントロールを制御する必要があります。私はjavascriptが得意ではないので、インターネットでそれを行うための解決策を見つけました:

<script type="text/javascript" language="javascript">
    //Demo of completely client side dirty flag.

    function setDirty() {
        document.body.onbeforeunload = showMessage;
        //debugger;
        document.getElementById("DirtyLabel").className = "show";
    }

    function clearDirty() {
        document.body.onbeforeunload = "";
        document.getElementById("DirtyLabel").className = "hide";
    }


    function showMessage() {
        return ""
    }

    function setControlChange() {
        if (typeof (event.srcElement) != 'undefined') {
            event.srcElement.onchange = setDirty;
        }
    }

    document.body.onclick = setControlChange;
    document.body.onkeyup = setControlChange;

    window.onunload = function (sender, eventArgs) {
        if (window.opener != null) {
            window.opener.ClearBlocker();

            if (window.opener.TempClientReturnFunction != null)
                window.opener.TempClientReturnFunction = window.opener.ReturnFunction;
        }
    }
</script>

しかし、Dirty Controls を制御する必要があるページが 7 ページほどある場合、冗長なコードが多すぎます。関数を呼び出すことができる場所からクラス/ライブラリを作成する方法はありますか、それとももっとスマートな方法がありますか?

4

2 に答える 2

1

すでに提案したように、コードを別のファイルに入れて、それを必要とするすべてのページに含めます。

他に検討したいのは、「モジュール」パターンを採用することです。これにより、javascriptグローバル名前空間にメンバーを1つだけ配置します。

モジュール化すると、コードは次のようになります。

var DIRTY_CONTROL = (function(){ //module pattern
    // *** Private members ***
    var dirtyLabelId = "DirtyLabel";
    var showMessage = function() {
        return "";
    };
    var setDirty = function(id) {
        id = id || dirtyLabelId;
        document.body.onbeforeunload = showMessage;
        //debugger;
        document.getElementById(id).className = "show";
    }
    var clearDirty = function clearDirty(id) {
        id = id || dirtyLabelId;
        document.body.onbeforeunload = "";
        document.getElementById(id).className = "hide";
    };
    var setControlChange = function(e) {
        e = e || window.event;
        var target = e.target || e.srcElement;
        target.onchange = setDirty;
    };
    var init = function() {
        document.body.onclick = document.body.onkeyup = setControlChange;
        window.onunload = function() {
            if (window.opener) {
                if (window.opener.ClearBlocker) {
                    window.opener.ClearBlocker();
                }
                if (window.opener.ReturnFunction) {
                    window.opener.TempClientReturnFunction = window.opener.ReturnFunction;
                }
            }
        };
    };
    // *** Public members ***
    //Expose private members here, as required.
    return {
        clearDirty: clearDirty,
        setDirty: setDirty,
        init: init
    };
})();

テストされていません

慣例により、モジュールの名前は大文字になります。

次のようにパブリック関数を呼び出します。

DIRTY_CONTROL.init();

また

DIRTY_CONTROL.clearDirty();
于 2012-07-23T09:09:35.450 に答える
0

その JS ブロックを Dirty.js などの JS ファイルに入れ、それを使用するすべてのページで次のコードを使用します。

<script src="Dirty.js"></script>

実際に呼び出す必要がある場合に応じて、タグの間、または本文の最後に追加できます。

于 2012-07-23T07:06:38.737 に答える