2010-08-11 7 views
11

Tôi muốn xác định cách lọc F5, nút làm mới, X và đóng trình duyệt qua silverlight 4.0 hoặc thậm chí ở phía máy chủ.Silverlight 4: Phát hiện trình duyệt F5/refresh và X/Close

cảm ơn bạn

EDITED:

tôi thêm tiền thưởng cho câu hỏi của tôi chỉ ngày hôm nay, 28 tháng 7 năm 2011. Giải pháp trước đây của tôi/câu trả lời là không còn làm việc trong 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"); 
    } 
} 

Khi người dùng nhấn F5, làm mới, X và nút đóng, hộp thông báo sẽ KHÔNG xuất hiện. Chỉ trong trường hợp giải pháp là onbeforeunload.

Cảm ơn sự giúp đỡ của bạn!

+0

Lọc cách - đánh chặn nó và ngăn chặn người dùng làm việc đó? Tôi nghi ngờ điều đó là có thể. – Rup

+0

Tôi chỉ muốn biết làm thế nào, không để ngăn chặn nhưng để tải lại dịch vụ web. – xscape

+0

Ý của bạn là gì khi tải lại dịch vụ web? Nếu dịch vụ web ở một số trạng thái không mặc định, hãy thêm một số biến trạng thái, ứng dụng đó sẽ đặt lúc khởi động và vì vậy mọi lần khởi động lại sẽ đặt lại biến này và bạn sẽ nhận được sự kiện từ biến đó? – Zee

Trả lời

2

vì nó không thể ở phía khách hàng, tôi đã làm nó trong máy chủ bên.

tôi giải quyết vấn đề của tôi sử dụng mã này:

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

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

Cách này hoạt động như thế nào? –

0

Không có thuộc tính nào để kiểm tra xem ứng dụng của bạn có được tải hay không bằng cách nhấn nút F5 nhưng bạn có thể xử lý sự kiện khởi động ứng dụng và đặt biến với ngày giờ. Thời điểm trang của bạn được tải, bạn có thể kiểm tra xem khoảng thời gian có chỉ là một vài giây trước không. Vì vậy, bây giờ bạn biết rằng ứng dụng được nạp lần đầu tiên hoặc nút F5 được nhấn khi thời gian đó chỉ là một vài giây trước. Tôi không biết nếu điều này là đủ cho bạn, nhưng bạn có thể cung cấp cho nó một thử:

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; 
    } 
    } 
} 

Bây giờ bạn có thể bắt đầu sử dụng mã dưới đây từ khắp mọi nơi

(Application.Current as App).IsApplicationReloaded 
2

Không thể phía máy khách để xác định liệu khởi động ứng dụng có phải là kết quả của một hoạt động làm mới được người dùng thực hiện hay không.

Tuy nhiên, bạn có thể xác định tại các máy chủ rằng một trang đang được làm mới. Bạn có thể thêm thuộc tính sau vào mã-đằng sau của trang ASPX lưu trữ ứng dụng Silverlight.

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

Bây giờ bạn sử dụng thuộc tính này để điều kiện có giá trị trong plugin bạclight initParams.

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

Sau đó trong mã Silverlight bạn có thể xác định xem ứng dụng lần cuối được nạp như một kết quả của việc làm mới với: -

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

* Yêu cầu.Headers ["Accept-Encoding"] * Request.Headers ["Accept-Charset"] * Request.Headers ["Accept-Language"] * Request.Headers ["Accept"] Tất cả 4, khi Tôi nhấn F5, IsRefresh vẫn còn sai, tôi có bỏ lỡ bất cứ điều gì? – xscape

+0

Ngay cả khi tôi thay đổi nó thành điều này, Request.Headers ["pragma"]. Chứa ("no-cache"); OR (Request.Headers ["pragma"] ?? "") .Contains ("no-cache"); Đây là lỗi: Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng – xscape