5

这似乎是一个常见问题,但搜索没有返回任何内容。

我有以下代码在页面卸载之前执行。问题是如果卸载是回发,我不想向用户发出警告,但我不知道如何区分回发和导航到的用户例如另一页。

// This is executed before the page actually unloads
        $(window).bind("beforeunload", function () {

            if (prompt) {

                //prompt
                return true;
            }
            else {

                //reset our prompt variable
                prompt = true;
            }
        })

在后面的代码中运行脚本,即如果 Page.IsPostBack 然后设置提示不是一个选项。

有任何想法吗?

编辑:

这是我最终得到的解决方案:

 function DoNotPrompt() {
              prompt = false;
        }

然后我将此添加到所有控件中,用户可以在其中执行导致回发的操作。

OnClientClick="DoNotPrompt()

然后检查这个标志,如果用户真的离开页面,即不是回发,则只在“beforeunload”中返回一个字符串。

我还必须使用以下代码: var magicInput = document.getElementById('__EVENTTARGET');

    if (magicInput && magicInput.value) {
        // the page is being posted back by an ASP control 
        prompt = false;
    }

原因是我有一个自定义用户控件,它是一个列表框,我无法添加上述方法。所以用它来捕捉那个事件并将标志设置为假。

不是最优雅的解决方案。

谢谢,迈克尔

4

3 回答 3

2

您可以捕获提交并将 onbeforeunload 重置为:

jQuery(function($) {
    var form = $('form'), oldSubmit = form[0].onsubmit;
    form[0].onsubmit = null;

    $('form').submit(function() {       
        // reset the onbeforeunload
        window.onbeforeunload = null;

        // run what actually was on
        if(oldSubmit)           
            oldSubmit.call(this);           
    });
});

这是我页面中经过测试的代码:)

于 2012-05-02T13:25:29.290 回答
1

JavaScript 在客户端运行;就客户端而言,页面不会保持从一个视图到下一个视图的状态。回发完全是一个 ASP.NET 概念。

您可以通过在服务器端运行一些代码来解决此问题,该代码根据是否Page.IsPostBack为真定义了一个 JavaScript 变量。

例子:

<%@ Page Language="C#" AutoEventWireup="true"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Page.IsPostBack -> client</title>

    <script type="text/javascript">
        var isPostback = <%= Page.IsPostBack %>;
        console.log("IsPostBack: " + isPostback);
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="btnTest" Text="Click me..." />
    </div>
    </form>
</body>
</html>
于 2012-05-02T13:23:04.247 回答
1

__EVENTTARGET这可能无法涵盖所有​​回发情况,但您可以通过询问隐藏的输入来判断页面是否由 ASP 控件回发。

当页面由 ASP 控件回发时,此输入由 ASP 设置。

var magicInput = document.getElementById('__EVENTTARGET');

if (magicInput && magicInput.value) {
   // the page is being posted back by an ASP control
}
于 2012-05-02T13:25:15.483 回答