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>

但如果我有 7 页需要控制脏控件,那将是过多的冗余代码。有什么方法可以创建一些我可以调用函数的类/库,或者有没有更聪明的方法呢?

4

2 回答 2

1

正如已经建议的那样,将您的代码放入一个单独的文件中,然后包含在需要它的每个页面上。

您可能要考虑的其他事情是采用“模块”模式,从而将不超过一个成员放入 javascript 全局命名空间。

模块化后,您的代码将如下所示:

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 回答