OK、こんにちは。スタック オーバーフローは初めてですが (登録に関する限り)、解決策を見つけるために定期的に使用しています。問題を検索しましたが、問題にほぼ関連するいくつかの記事や質問を見つけましたが、正確な問題に実際に答えているものはありません。これが何百万回も尋ねられた場合は、申し訳ありません!
私は JQuery にはかなり慣れていませんが、一般的に JavaScript の経験はある程度あります。私は、新しい Web サイトに実装しようとしている history.pushstate および history.popstate メソッドにまったく慣れていません。私は ajax を使用してコンテンツをロードしていません。コンテンツを iframe にロードしていますが、同じ原則が適用されます。それに応じてページ URL を更新し、ブラウザで前後に移動できるようにする必要があります。
私のコードからわかるように、私はかなり有能ですが、あなたの答えには優しくしてください!
OK、pushstate の実装に成功し、ページの読み込みは正常に行われているようです (例はここにあります... http://beta.casafondaradio.com ) 。効果。つまり、popstate 関数を起動するには、2 回クリックする必要があるようです。何が間違っているのかわかりません。
メイン関数は、関連するリンクの 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> 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> 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> 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> 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> 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> 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> PLAYERS</asp:HyperLink></li>
<iframe id="contentFrame" frameborder="0" style="height:100px;" scrolling="no" src='<asp:Literal ID="mainFrameSource" runat="server"></asp:Literal>'></iframe>
head セクションの私の 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 にの ID を追加しましiframe
た!