Установка «location.hash» не может работать с частичной обратной передачей страницы в IE. Работает в FireFox - PullRequest
2 голосов
/ 28 июня 2010

У меня странная проблема, решение которой я не смог найти. Чтобы прояснить мою проблему, я сделал просто тестовую страницу:

    <%@ 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#".. , И после этого все ок. Если я проверю кнопку «test2». Все тоже хорошо.

Я также считаю, что эта проблема возникает только в IE. FireFox работает отлично.

У меня вопрос: как сохранить правильный URL-адрес, когда я нажимаю кнопку «test1»?

Спасибо

Ответы [ 5 ]

2 голосов
/ 04 августа 2011

Я нашел решение. Как видно на этом блоге .

На странице происходит следующее:

Чтобы выполнить частичную обратную передачу с использованием панели обновления на странице ASP.NET, необходимо встроить диспетчер скриптов на страницу. Этот элемент управления Script Manager будет отображать большой объем Javascript на странице, который будет использоваться такими же элементами управления, как UpdatePanel, для частичного обновления страницы.

Этот Javascript изменяет значение хэша URL-адреса, по-видимому, для включения истории и создания глубоких ссылок при использовании панелей обновления, и по какой-то (пока мне неизвестной) причине он изменяет URL-адрес, удаляя все после хеш-метки.

Первое решение, которое он предоставил, сработало для меня. Вам нужно добавить такую ​​строку на страницу ASP.NET после объявления администратора сценариев:

<script type=”text/javascript”>
Sys._Application.prototype._setState = function() {}
</script>
1 голос
/ 11 августа 2011

Вместо использования window.location.hash, вы также можете использовать href:

window.location.href = '#0';

Это работает во всех браузерах и может применяться к любой веб-странице.

1 голос
/ 11 августа 2011

попробуйте использовать что-то, отличное от 0, например:

window.location.hash = "#a";

Я думаю, что # 0 означает прокрутку до тега, имя которого равно 0, и это не разрешено по умолчанию, по крайней мере, в IE нестандартно: P

0 голосов
/ 16 апреля 2013

Большое спасибо Паскалю за это.Его решение сработало.Я поместил его сразу после тега scriptmanager.Я видел поведение во всех браузерах при посадке на страницу, когда URL содержал хэш.

Моя страница использует функцию для прокрутки к определенному местоположению хеша с использованием .animate, и она по-прежнему прекрасно работает с Паскалем.исправить:

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

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

Насколько я могу судить, нет никаких других функциональных возможностей на странице.Я успешно протестировал решение в IE9, FF 20.0.1, Chrome 26.0.1410.64 и Opera 12.1 в Windows 7.

Если бы я мог проголосовать за вас, Паскаль, я бы.

0 голосов
/ 25 мая 2012

У меня была проблема с simulair, когда я слушал изменения hasg и Scriptmanager сохранял сброс хеша при первой обратной передаче. Решение Паскаля путем переопределения функции _setState у меня не сработало, но я нашел другой подход, который может кому-то помочь.

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

hashchange - плагин jQuery, который я нашел здесь

...