【问题标题】:Silverlight 4: Detect browser F5 / refresh and X / CloseSilverlight 4:检测浏览器 F5 / 刷新和 X / 关闭
【发布时间】:2011-03-28 06:17:02
【问题描述】:

我想确定如何通过silverlight 4.0甚至在服务器端过滤F5、刷新按钮、X和关闭浏览器。

谢谢

已编辑:

我在 2011 年 7 月 28 日的今天向我的问题添加了赏金。我以前的解决方案/答案在 IE 9 中不再有效。

window.onunload = function (e) {
    // Firefox || IE
    e = e || window.event;
    var y = e.pageY || e.clientY;

    if (y < 0) {
        alert("close");
    }
    else {
        alert("refresh");
    }
}

当用户按 F5、刷新、X 和关闭按钮时,不应出现消息框。以防万一解决方案是 onbeforeunload。

感谢您的帮助!

【问题讨论】:

  • 如何过滤 - 拦截它并阻止用户这样做?我怀疑这是可能的。
  • 我只是想知道如何,不是阻止而是重新加载网络服务。
  • 重新加载网络服务是什么意思?如果 Web 服务处于某些非默认状态,请添加一些状态变量,该应用程序将在启动时设置,因此每次重新启动都会重置此变量,您会从中获取事件吗?
  • 感谢 Zeela,但是,我需要确定用户是关闭还是刷新浏览器。您还有其他建议吗?
  • 致我所有的 stackoverflow 小伙伴,这个有什么更新吗?谢谢

标签: silverlight browser silverlight-4.0 refresh


【解决方案1】:

客户端无法确定应用程序启动是否是用户执行刷新操作的结果。

但是,您可以在服务器端确定页面正在刷新。您可以将以下属性添加到托管 Silverlight 应用程序的 ASPX 页面的代码隐藏中。

public bool IsRefresh
{
   get { Request.Headers["pragma"] ?? "").Contains("no-cache"); }
}

现在您可以使用此属性有条件地在 silverlight 插件 initParams 中包含一个值。

<object ...>
   <param name="initParams" value="IsRefresh=<%=IsRefresh.ToString()%>" />
</object>

然后在 silverlight 代码中,您可以确定应用程序是否由于刷新而最后加载:-

if (Application.Current.Host.InitParams["IsRefresh"]  == "True")

【讨论】:

  • * Request.Headers["Accept-Encoding"] * Request.Headers["Accept-Charset"] * Request.Headers["Accept-Language"] * Request.Headers["Accept"]所有这4个,当我按F5时,IsRefresh仍然是False,我错过了什么吗?
  • 即使我改成这个,Request.Headers["pragma"].Contains("no-cache");或 (Request.Headers["pragma"] ?? "").Contains("no-cache");这是错误:对象引用未设置为对象的实例
【解决方案2】:

因为在客户端是不可能的,所以我在服务器端做了。

我使用此代码解决了我的问题:

window.onunload = function (e) {
        // Firefox || IE
        e = e || window.event;
        var y = e.pageY || e.clientY;

        if (y < 0) {
            alert("close");
        }
        else {
            alert("refresh");
        }
    }

【讨论】:

    【解决方案3】:

    没有属性可以检查您的应用程序是否通过按 F5 按钮加载,但您可以处理应用程序启动事件并设置一个带有日期时间的变量。页面加载的那一刻,您可以检查时间跨度是否只是几秒钟前。所以现在您知道应用程序是第一次加载或按下 F5 按钮时,那只是几秒钟前。 我不知道这对你来说是否足够,但你可以试一试:

    App.xaml.cs

    public class App : Application
    {
     private DateTime appStartupTime {get; set};
     public App()
     {
         Startup += new EventHandler(Application_Startup);
     } 
    
     void Application_Startup(object sender, StartupEventArgs e)
     {
       //initialize the startupTime
       appStartupTime = DateTime.Now; 
     }
     public bool IsApplicationReLoaded
     {
       get
       {
         //return true if your app is started less 10 seconds ago
         return DateTime.Now.AddSeconds(-10) < appStartupTime;
       }
      }
    }
    

    现在你可以开始在任何地方使用下面的代码了

    (Application.Current as App).IsApplicationReloaded
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2021-10-05
      • 2010-10-18
      相关资源
      最近更新 更多