Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果在ASP.NET中关闭窗口但不在回发时显示消息_Javascript_Jquery_Asp.net - Fatal编程技术网

Javascript 如果在ASP.NET中关闭窗口但不在回发时显示消息

Javascript 如果在ASP.NET中关闭窗口但不在回发时显示消息,javascript,jquery,asp.net,Javascript,Jquery,Asp.net,我希望仅当用户关闭我的ASP.NET Web表单页面或离开该页面时,才向用户显示消息。如果他们单击任何按钮、LinkButton、AutoPostBack元素或任何其他将回发的内容,那么我不想显示该消息 到目前为止,我有以下代码: <script type="text/javascript"> var postback = false; addToPostBack = function(func) { var old__doPostBack = __doPostBack;

我希望仅当用户关闭我的ASP.NET Web表单页面或离开该页面时,才向用户显示消息。如果他们单击任何按钮、LinkButton、AutoPostBack元素或任何其他将回发的内容,那么我不想显示该消息

到目前为止,我有以下代码:

<script type="text/javascript">

var postback = false;

addToPostBack = function(func) {
    var old__doPostBack = __doPostBack;
    if (typeof __doPostBack != "function") {
        __doPostBack = func;
    } else {
        __doPostBack = function(t, a) {
            if (func(t, a)) old__doPostBack(t, a);
        }
    }
};

$(document).ready(function() {
    addToPostBack(function(t,a) {
        postback = true;
    });
});

$(window).bind("beforeunload", function() {
    if (!postback) {
        return "message";
    }
});
</script>

var postback=false;
addToPostBack=函数(func){
var old__doPostBack=_doPostBack;
if(类型为uu doPostBack!=“函数”){
__doPostBack=func;
}否则{
__doPostBack=函数(t,a){
if(func(t,a))old_uudopostback(t,a);
}
}
};
$(文档).ready(函数(){
addToPostBack(函数(t,a){
回发=真;
});
});
$(window.bind(“beforeunload”,function()){
如果(!回发){
返回“消息”;
}
});
这可以部分工作,但似乎可以阻止自动回发事件的触发,并且仍然显示链接按钮等的消息

我怎样才能做到这一点?

试试这个:-
您可以通过使用以下代码来实现这一点:

<script type="text/javascript">
        var isChanged = false;
        $(document).ready(function () {
            $('input').click(function () {
                isChanged = true;
            });
            $('select').click(function () {
                isChanged = true; 
            });
        });

        $(window).bind("beforeunload", function () {
            if (isChanged) {
                return '>>>>>Before You Go<<<<<<<< \n Your custom message go here';                
                }           
        })

    </script>

这将使用调用uu doPostBack的时间戳,然后执行默认行为

onbeforeunload事件仅在其时间戳与最新的_doPostBack时间戳之间的差异大于allowedWaitTime时才会显示自定义消息

用法:将其包含在页面的任何位置

更新: 现在,它还将使用选项处理WebForm_doPostBack

(function ($) {

    if (typeof $ !== 'function') {
        throw new Error('jQuery required');
    }

    /* The time in milliseconds to allow between a __doPostBack call and 
       showing the onbeforeunload message. */
    var allowedWaitTime = 100,

        timeStamp = new Date().getTime(),

        // Each function to override
        baseFuncs = {
            __doPostBack: this.__doPostBack,
            WebForm_DoPostBackWithOptions: this.WebForm_DoPostBackWithOptions
        };

    // Set timeStamp when each baseFunc is called
    for (var baseFunc in baseFuncs) {
        (function (func) {
            this[func] = function () {
                var baseFunc = baseFuncs[func];
                timeStamp = new Date().getTime();
                if (typeof baseFunc === 'function') {
                    baseFunc.apply(arguments.callee, arguments);
                }
            }
        })(baseFunc);
    }

    /* Form submit buttons don't call __doPostBack so we'll set timeStamp 
       manually on click. */
    $('input[type="submit"]').click(function () {
        timeStamp = new Date().getTime();
    });

    $(this).on('beforeunload', function (e) {

        // Only return string if allowedWaitTime has elapsed
        if (e.timeStamp - timeStamp > allowedWaitTime) {
            return 'message';
        }
    });
}).call(window, jQuery);

在链接按钮和按钮上,设置
onclick=“$(窗口)。取消绑定(“beforeunload”);返回true;“

自动回邮元素应将
onchange
或导致自动回邮设置为
onchange=“$(窗口)。取消绑定(“beforeunload”);返回true;“


请确保在回发发生后再次绑定beforeunload

我无法让它工作(总是显示消息)。通过绑定到click,这难道不意味着即使您单击了屏幕的空白部分,它也会取消onbeforeunload事件吗?因此,如果您在浏览器中单击,它将使该单击的
onbeforeunload
为空,如果您尝试通过naivgate访问其他Url,它将显示消息。这似乎是最好的解决方案。非常感谢你。我将allowedWaitTime增加到100,因为我发现正常提交通常需要45毫秒。我还发现,对于称为WebForm_DoPostBackWithOptions而不是_doPostBack的按钮,这不起作用,因此,我复制了代码以覆盖WebForm的_doPostBack,并使用Options覆盖_doPostBack。我添加了对WebForm _DoPostBackWithOptions的支持,以便为这两种方法设置时间戳。我认为这不会处理链接按钮(呈现为标记),对吗?此外,如果您单击输入或选择“然后单击取消”中止离开页面,它将不会再次询问您。如果用户在警告框中按“取消”,则还必须重新绑定beforeunload。您可以在此处查看答案
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script type="text/javascript">
        var isChanged = false;
        $(document).ready(function () {
            $('input').click(function () {
                isChanged = true;                

            });
            $('select').click(function () {
                isChanged = true;                

            });
        });

        $(window).bind("beforeunload", function () {
            if (isChanged) {
                return '>>>>>Before You Go<<<<<<<< \n Your custom message go here';                
                }           
        })

    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table border="0" cellpadding="0" cellspacing="0">
            <tr>
                <td>
                    <asp:TextBox runat="server" ID="txtbox" />      
                </td>
            </tr>
            <tr>
                <td>
                    <asp:Button Text="button" runat="server" ID="btn" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:DropDownList runat="server" ID="ddl">
                        <asp:ListItem Text="One" />
                        <asp:ListItem Text="Two" />
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:CheckBox Text="Check" runat="server" ID="chk" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RadioButtonList runat="server" ID="radio">
                        <asp:ListItem Text="One" />
                        <asp:ListItem Text="Two" />
                    </asp:RadioButtonList>
                </td>
            </tr>


        </table>
    </div>
    </form>
</body>
</html>
(function ($) {

    if (typeof $ !== 'function') {
        throw new Error('jQuery required');
    }

    /* The time in milliseconds to allow between a __doPostBack call and 
       showing the onbeforeunload message. */
    var allowedWaitTime = 100,

        timeStamp = new Date().getTime(),

        // Each function to override
        baseFuncs = {
            __doPostBack: this.__doPostBack,
            WebForm_DoPostBackWithOptions: this.WebForm_DoPostBackWithOptions
        };

    // Set timeStamp when each baseFunc is called
    for (var baseFunc in baseFuncs) {
        (function (func) {
            this[func] = function () {
                var baseFunc = baseFuncs[func];
                timeStamp = new Date().getTime();
                if (typeof baseFunc === 'function') {
                    baseFunc.apply(arguments.callee, arguments);
                }
            }
        })(baseFunc);
    }

    /* Form submit buttons don't call __doPostBack so we'll set timeStamp 
       manually on click. */
    $('input[type="submit"]').click(function () {
        timeStamp = new Date().getTime();
    });

    $(this).on('beforeunload', function (e) {

        // Only return string if allowedWaitTime has elapsed
        if (e.timeStamp - timeStamp > allowedWaitTime) {
            return 'message';
        }
    });
}).call(window, jQuery);