2015-10-28 4 views
0

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

Я довольно новичок в 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, указанный выше, и он находится в текущее состояние (т.е. не работает). Любая помощь будет принята с благодарностью, ясно, что я делаю что-то неправильно, но я понятия не имею, что это такое.

Заранее благодарен!

RESOLVED! Модифицированный мою 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!

+0

Duh! OK Я теперь обнаружил, что проблема в том, что обновление 'src'' iframe' вызывает дополнительную 'pushstate' ... Мне нужно решение, чтобы это не происходило! Я предполагаю, что на самом деле замена 'iframe' будет делать это, но тогда не добавление' iframe' с новым 'src' будет иметь такой же эффект? Могу ли я использовать метод «replacestate» для решения этой проблемы? – Claud

ответ

0

ОК, я разработал его ... Это был вопрос iframe, который менял src, нажимая запись истории из iframe. Таким образом, первый щелчок назад возвращал iframe назад и не стрелял сверху windowpopstate. Моим решением было переписать iframe. Я обновил свой «вопрос» выше с помощью моего нового кода.