我再次问这个问题是因为这个问题已经不在我的问题列表中了,而且我有一个有效的答案。 在这个问题消失之前,有100多人观看了这个问题,没有任何评论或答案。
我在Windows,Apache/mod_perl,dHTML(HTML,CSS,JavaScript,Perl)环境中工作。 我正在开发一个应用程序,应该可以在Chrome,Edge,FF,IE和Opera浏览器上运行。 下面我所描述的问题在FF和IE中都能正常工作。 它在Chrome,Edge或Opera中都不能像预期的那样工作。
我已经建立了一个网页多达6个iframes显示最近5年的肯塔基州县的彩色地图的测量。 每个iframe都有许多链接。 如果我采取3个链接,例如,在一个或任意组合的iframes,并输入刷新,网页返回到其初始状态。 此时,如果我返回,我将期望离开该页面。
但这种情况不会发生。 要离开页面,我必须输入回n+1次,其中n是我采取的链接数量。 并且每个Back条目只会导致复合web页面闪烁,直到我离开该页面。
下面的链接将向您展示这个问题。 它正在我肯塔基州家中的服务器上执行。 输入任意3个链接,刷新,并尝试退出。
http://steepusa.no-ip.info/scx/gencm1m.cgi?str=0~Sky~HealthyBirths!V~L
刷新过程中的任何内容都不在我的程序控制之下。 用户刚刚进入浏览器刷新按钮。 这就像复合网页的历史记录已经被擦除,但是历史记录条目的计数没有被归零。 它不会在链接的历史记录中后退一步。
这不可能是正确的。 这对我来说毫无意义。 这是我在完成这个应用程序时唯一一个悬而未决的跨浏览器问题。 若要查看网页的工作方式,请尝试FF或IE中的链接。 任何帮助都将不胜感激。
克雷格特
首先,在给出我的答案之前,我认为这个问题应该用浏览器代码来回答。 在我的应用程序中的所有演示页面中,当我刷新然后进入后退按钮时,我就离开了该页面。 我认为这个多iframe页面应该以同样的方式工作。 Github上有一个线程(#2944),涉及主要浏览器的代表,于2017年开通,大约十几天前更新,内容是关于公开History.index。 他们意识到带有多个iframes的页面的路由困难,并且正在寻找一些方法来帮助开发人员。
html是如下所示的4个链接。
{
<A ID='delnkSetID1' CLASS='lnk3' STYLE='POSITION:absolute;TOP:260px;LEFT:133px;'
TITLE='Back In History' ONMOUSEOVER=\"setStatus(' ');\" ONMOUSEOUT=\"setStatus('
');\" ONCLICK='doHstry2(\"B\");'>Back</A>
<A ID='delnkSetID2' CLASS='lnk3' STYLE='POSITION:absolute;TOP:260px;LEFT:193px;'
TITLE='Forward In History' ONMOUSEOVER=\"setStatus(' ');\" ONMOUSEOUT=\"setStatus('
');\" ONCLICK='doHstry2(\"F\");'>Forward</A>
<A ID='delnkSetID3' CLASS='lnk3' STYLE='POSITION:absolute;TOP:260px;LEFT:273px;'
TITLE='Refresh To The Initial State' ONMOUSEOVER=\"setStatus(' ');\"
ONMOUSEOUT=\"setStatus(' ');\" ONCLICK='doRfrsh();'>Refresh</A>
<A ID='delnkSetID4' CLASS='lnk3' STYLE='POSITION:absolute;TOP:260px;LEFT:348px;'
TITLE='Leaave The Page' ONMOUSEOVER=\"setStatus(' ');\" ONMOUSEOUT=\"setStatus('
');\" ONCLICK='doHstry2(\"L\");'>Leave</A>
}
接下来是JavaScript。
}
var cntIndx, lstHstLen, stpsInStrt; // Globals for the emulation of a history index.
if (cntIndx === undefined) {
cntIndx = 0; // 'Current' position in the history object.
lstHstLen = history.length; // 'Last' history length.
stpsInStrt = history.length; // Initial history length depending on call origin.
}
function doHstry2(op) {
if (history.length != lstHstLen) { // History length has increased since last time.
cntIndx = 0; // Reset the top (equal to 0) of history index.
}
var histCntNow = history.length; // Quantity same in all iframes and the parent.
switch(op) { // Do the operation requested.
case 'L': // Leave the page.
var nBck = histCntNow - stpsInStrt + cntIndx + 1;
history.go(-nBck);
break;
case 'B': // Back 1 in history.
cntIndx--;
history.go(-1);
break;
case 'F': // Leave the page.
if (cntIndx + 1 <= 0) { // The zero position is the top of the history stack.
cntIndx++;
history.go(+1);
}
}
lstHstLen = history.length; // Capture the 'current' history length.
}
function doRfrsh() {
this.location.href = \"gencm1m.cgi?str=$params\"; // $params is Perl variable.
}
}
该方法最初将全局历史对象位置指示符设置为0,最后一个历史条目,以及全局“最后一个”历史长度和初始条目处的历史长度。
在函数输入之后,我首先检查历史记录是否增加(更改)。 如果它有,我重置位置指示器到‘顶部’的历史。
接下来,我现在捕获历史长度。
然后我通过操作处理一个开关。 前进和后退块增加(如果不在顶部)和减少位置索引,并且都采取适当的前进或后退步骤。 刷新将条目URL分配给this.location.href。 离开块计算要跳过以离开的条目数。 计算从当前历史长度减去初始条目历史长度加上历史顶部的cntIndx值+1。
最后,当我离开时,我将历史长度设置为上一个历史长度。
我已经用3个模块/页面进行了测试,这些模块/页面带有多个iframes,在我正在使用的应用程序中,它们被从11个不同的地方以不同的方式调用。 每种不同的方式都有不同的起始历史长度。 我在调用/使用每个模块的每种方式上运行了6个测试。 最后2个涉及到在每个复合页面上相当多的随机移动。 它在所有情况下都按预期工作。
如有任何意见将不胜感激。 谢谢大家的帮忙。 您可以在上面的链接中看到解决方案的工作。
CT