окно popstate запускается только после 2 обратных кликов и каждые два

Хорошо, привет всем, я новичок в Stack Overflow (что касается регистрации), но регулярно использую его для поиска решений. У меня был поиск по моей проблеме, и хотя я нашел несколько статей и вопросов, почти относящихся к моей проблеме, ни одна из них не ответила на мою конкретную проблему. Так что извините, если это было задано миллион раз!

Я новичок в JQuery, но в целом имею некоторый опыт работы с JavaScript. Я совершенно не знаком с методами history.pushstate и history.popstate, которые я пытаюсь реализовать на своем новом веб-сайте. Я не использую ajax для загрузки контента. Я загружаю его в iframe, но применяются те же принципы, мне нужно, чтобы URL-адрес страницы обновлялся соответствующим образом и имел возможность вернуться назад и вперед в браузере.

Пожалуйста, будьте нежны со мной в своих ответах, хотя я довольно компетентен, как вы увидите из моего кода, я не слишком продвинут!

ОК, я успешно реализовал pushstate, и загрузка страницы работает нормально (пример здесь... http://beta.casafondaradio.com ), но когда я нажимаю кнопку «Назад» в браузере, это не дает желаемого эффекта. то есть кажется, что мне нужно дважды щелкнуть по нему, чтобы сработала функция popstate. Не могу понять, что я делаю не так.

Основная функция запускается с атрибутом onclick для соответствующих ссылок. Я знаю, что есть более элегантный способ сделать это, но я просто хотел, чтобы он был простым и понятным для меня!

Мои ссылки (в ASP.NET) имеют следующий формат:

<li runat="server" data="home" id="liHome" class="menuList"><asp:HyperLink ID="hlHome" onclick="return pageLoader(this);" data="home" CssClass="menuLink" runat="server" ToolTip="Home | CasafondaRadio.com" NavigateUrl="~/"><i class="fa fa-home" aria-hidden="true"></i>&nbsp;HOME</asp:HyperLink></li>
<li runat="server" data="schedule" id="liSched" class="menuList"><asp:HyperLink ID="hlSched" onclick="return pageLoader(this);" data="schedule" CssClass="menuLink" runat="server" ToolTip="Schedule | CasafondaRadio.com" NavigateUrl="~/schedule.aspx"><i class="fa fa-clock-o" aria-hidden="true"></i>&nbsp;SCHEDULE</asp:HyperLink></li>
<li runat="server" data="events" id="liEvent" class="menuList"><asp:HyperLink ID="hlEvent" onclick="return pageLoader(this);" data="events" CssClass="menuLink" runat="server" ToolTip="Events | CasafondaRadio.com" NavigateUrl="~/events.aspx"><i class="fa fa-star" aria-hidden="true"></i>&nbsp;EVENTS</asp:HyperLink></li>
<li runat="server" data="residentdjs" id="liDJs" class="menuList"><asp:HyperLink ID="hlDJs" onclick="return pageLoader(this);" data="residentdjs" CssClass="menuLink" runat="server" ToolTip="Resident DJs | CasafondaRadio.com" NavigateUrl="~/residentdjs.aspx"><i class="fa fa-headphones" aria-hidden="true"></i>&nbsp;DJS</asp:HyperLink></li>
<li runat="server" data="about" id="liAbout" class="menuList"><asp:HyperLink ID="hlAbout" onclick="return pageLoader(this);" data="about" CssClass="menuLink" runat="server" ToolTip="About | CasafondaRadio.com" NavigateUrl="~/about.aspx"><i class="fa fa-info-circle" aria-hidden="true"></i>&nbsp;ABOUT</asp:HyperLink></li>
<li runat="server" data="contact" id="liCont" class="menuList"><asp:HyperLink ID="hlCont" onclick="return pageLoader(this);" data="contact" CssClass="menuLink" runat="server" ToolTip="Contact | CasafondaRadio.com" NavigateUrl="~/contact.aspx"><i class="fa fa-envelope" aria-hidden="true"></i>&nbsp;CONTACT</asp:HyperLink></li>
<li runat="server" data="webplayers" id="liPlay" class="menuList"><asp:HyperLink ID="hlPlay" onclick="return pageLoader(this);" data="webplayers" CssClass="menuLink" runat="server" ToolTip="Web Players | CasafondaRadio.com" NavigateUrl="~/webplayers.aspx"><i class="fa fa-cog" aria-hidden="true"></i>&nbsp;PLAYERS</asp:HyperLink></li>

<iframe id="contentFrame" frameborder="0" style="height:100px;" scrolling="no" src='<asp:Literal ID="mainFrameSource" runat="server"></asp:Literal>'></iframe>

Мой код Javascript в разделе заголовка...

<script type="text/javascript">
        function resetiFrame(obj) {
            $('#contentFrame').css("height", "100px");
        }
        function resizeiFrame(obj) {
            if ($('#contentFrame').attr('src') != '') {
                var dochgt = $(obj.contentWindow.document).height();
                $('#contentFrame').css("height", dochgt + "px");
            }
        }

        // Page Loader Functions
        var pageUrl = "", pageTitle = "", pageRef = "", pageContent = "",
        lastPageUrl = "", lastPageTitle = "", lastPageRef = "", lastPageContent = "";

        init = function() {
            // Do this when a page loads.
            // Page initialisation stuff will go here
        };

        function pageLoader(objLink) {
            var data = objLink.getAttribute('data'),
                titText = objLink.getAttribute('title'),
                url = objLink.getAttribute('href');

            // alert('data = ' + data + '\ntitle = ' + titText + '\nurl = ' + url);

            lastPageUrl = pageUrl; lastPageTitle = pageTitle; lastPageRef = pageRef; lastPageContent = pageContent;
            pageUrl = url; pageRef = data; pageTitle = titText; pageContent = data + "Content.aspx";
            historyUpdate(pageRef, pageTitle, pageUrl);
            loadPageData(pageContent);
            addActiveClass(data);
            return false;
        }

        function historyUpdate(data, title, url) {
            window.history.pushState(data, title, url);
        }

        function loadPageData(urlToOpen) {
            $("#contentFrame").attr('src', urlToOpen);
            init();
        }

        function addActiveClass(data) {
            $('#list li').removeClass('active');
            $('.menuList').filter('[data="' + data + '"]').addClass('active');
        }
    </script>

Мой код javascript в теге закрытия перед телом...

<script type="text/javascript">
        theiFrame = document.getElementById("contentFrame");

        $('#contentFrame').load(function () {
            resetiFrame(theiFrame);
            resizeiFrame(theiFrame);
        });

        $(window).resize(function () {
            resetiFrame(theiFrame);
            resizeiFrame(theiFrame);
        });

        $(window).on("popstate", function (e) {
            var origState = e.originalEvent.state;
            if (origState !== null) {
                // Load previous content
                alert(origState);
                if (origState == lastPageRef) {
                    alert("is last Page Ref!");
                }
            } else {
                alert('else : ' + e.originalEvent.state);
            }
        });

        init();
    </script>

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

Заранее спасибо!

РЕШЕНО! Изменил мою функцию loadPageData() следующим образом...

function loadPageData(urlToOpen) { $('#contentFrame').remove(); var ifr = $('<iframe/>', { id: 'contentFrame', src: '/' + urlToOpen, style: 'height:100px;', load: function () { resizeiFrame(); } }); $('#frameContainer').append(ifr); }

И добавил идентификатор frameContainer в DIV с исходным iframe в нем!


person Claud    schedule 28.10.2015    source источник
comment
Да! ОК, теперь я обнаружил, что проблема в том, что обновление src из iframe вызывает дополнительные pushstate... Мне нужно решение, чтобы этого не произошло! Я предполагаю, что на самом деле замена iframe сделает это, но разве добавление iframe с новым src не даст такого же эффекта? Могу ли я использовать метод replacestate для решения проблемы?   -  person Claud    schedule 28.10.2015


Ответы (1)


Хорошо, я разобрался... Проблема заключалась в iframe, изменение src приводило к удалению записи истории из iframe. Таким образом, первый щелчок назад возвращал iframe назад, а не запускал верхний window popstate. Мое решение состояло в том, чтобы переписать файл iframe. Я обновил свой «вопрос» выше своим новым кодом.

person Claud    schedule 28.10.2015