簡體   English   中英

設置“ location.hash”不適用於IE中的部分頁面回發。 它在FireFox中工作

[英]Setting the “location.hash” cannot work with the partial page postback in IE. It works in FireFox

我有一個奇怪的問題,無法解決。 為了澄清我的問題,我做了一個簡單的測試頁面:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="MyApplication.Web.Surveillance.Reports.test1" %>

<!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></title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="scriptmanager" runat="server" />
    <asp:UpdatePanel ID="up1" runat="server">
        <ContentTemplate>
            <asp:Button ID="btn1" runat="server" Text="test1" />
            <%= DateTime.Now %>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button ID="btn2" runat="server" Text="test2" />
        <script type="text/javascript" language="javascript">
        $(document).ready(pageInit);
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_endRequest(pageInit);

        function pageInit() {
            window.location.hash = "#0";
        }
    </script>

    </form>
</body>
</html>

在此測試頁中,我有兩個按鈕。 “ test1”按鈕位於更新面板中。 “ test2”按鈕在外面。 運行此頁面時,可以看到該URL,例如“ http://localhost/test/test1.aspx#0 ”。 單擊“ test1”按鈕后,可以看到URL更改為“ http://localhost/test/test1.aspx# ”。 缺少“ 0”。 之后,一切都很好。 如果我測試“ test2”按鈕。 一切都還好。

我也發現此問題僅發生在IE中。 FireFox工作正常。

我的問題是,當我單擊“ test1”按鈕時如何保持正確的URL?

謝謝

我找到了解決方案。 如在此博客中看到的。

頁面上發生以下事情:

為了使用ASP.NET頁上的“更新面板”進行部分回發,必須在該頁上嵌入腳本管理器。 此腳本管理器控件將在頁面上呈現大量Javascript,例如UpdatePanel之類的控件將用於對頁面進行令人眼花partial亂的部分更新。

該Javascript篡改了url的哈希值,顯然是在使用“更新面板”時啟用了歷史記錄和深層鏈接,並且出於某些(我仍然未知)的原因,它更改了url,刪除了哈希標記后的所有內容。

他提供的第一個解決方案對我有用。 您需要在scriptmanager聲明之后在ASP.NET頁面中添加這樣的行:

<script type=”text/javascript”>
Sys._Application.prototype._setState = function() {}
</script>

嘗試使用非0的值,例如:

window.location.hash = "#a";

我認為#0表示滾動到名稱為0的標記,至少在IE非標准中,默認情況下不允許這樣做:P

除了使用window.location.hash,您還可以使用href:

window.location.href = '#0';

這適用於所有瀏覽器,並且可以應用於每個網頁。

我遇到了一個模擬問題,在那兒我聽過hasg的更改,而Scriptmanager在第一次回發時不斷重置哈希值。 通過覆蓋_setState函數的Pascals解決方案對我來說不起作用,但是我發現了可能對某人有所幫助的不同方法。

$(window).hashchange(function () {
   if (window.location.hash == '#' || window.location.hash == '') {
      window.history.back(-1);
   }
});

hashchange是我在這里找到的jQuery插件

非常感謝Pascal對此。 他的解決方案有效。 我將其直接放在scriptmanager標記之后。 當URL包含哈希值時,我在所有瀏覽器上看到的行為均顯示在頁面上。

我的頁面使用一個函數使用.animate滾動到特定的哈希位置,並且在Pascal的修復程序中仍然可以正常運行:

    function goToByScroll(id) {
        $('html,body').animate({ scrollTop: $("#" + id).offset().top +160 }, 'slow');
    }

    if (window.location.hash != '') {
        goToByScroll(window.location.hash.substr(1));
    };

據我所知,該頁面上的任何其他功能都沒有受到損害。 我已經在Windows 7上的IE9,FF 20.0.1,Chrome 26.0.1410.64和Opera 12.1中成功測試了該解決方案。

如果我能投票贊成帕斯卡,我會的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM