Во-первых, прежде чем дать свой ответ, я думаю, что эту проблему нужно решить в коде браузера. На всех страницах презентации в моем приложении, когда я обновляю sh и затем нажимаю кнопку «Назад», я покидаю страницу. Я думаю, что эта страница с несколькими iframe должна работать так же. И есть ветка (# 2944) на Github с участием представителей основных браузеров, открытая в 2017 году и обновлявшаяся около десятка дней до go, о раскрытии history.index. Они знают о трудностях маршрутизации страниц с несколькими фреймами и ищут способ помочь разработчикам.
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 hPosCntIndx = 0; // 'Current' position in the history object.
var lstHstLen = history.length; // 'Last' history length.
var stpsInStrt = history.length; // Initial history length depending on the call origin.
function doHstry2(op) { // Facilitate exit from a multiple iframe page.
if (history.length != lstHstLen) { // History length has increased since the last time in.
hPosCntIndx = 0; // Reset the top (equal to 0) of history index.
}
switch(op) { // Do the operation requested.
case 'L': // Leave the page.
var nBck = history.length - stpsInStrt + hPosCntIndx + 1; // Composite history - hitory count at entry + position count relative to the 'top' of history + 1.
history.go(-nBck);
break;
case 'B': // Back 1 in history.
hPosCntIndx--;
history.go(-1);
break;
case 'F': // Leave the page.
if ( hPosCntIndx + 1 <= 0 ) { // The zero position is the top of the history stack.
hPosCntIndx++;
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, последнюю запись истории, а также глобальную «последнюю» длину истории и длину истории при начальной записи.
После ввода функции я начинаю с проверки, увеличилась ли (изменилась) ли история. Если это так, я сбрасываю индикатор положения в «ВЕРХНЮЮ» истории.
Затем я обрабатываю переключатель операцией. Блоки «Вперед» и «Назад» увеличивают (если не вверху) и уменьшают индекс позиции, и оба делают соответствующий шаг вперед или назад. Refre sh назначает URL записи this.location.href. Блок Leave вычисляет количество записей, которые нужно пропустить, чтобы выйти. При вычислении вычитается начальная длина истории входов плюс значение cntIndx из верхней части истории + 1 из текущей длины истории.
Наконец, когда я ухожу, я устанавливаю длину истории как последнюю длину истории.
Я тестировал это с 3 модулями / страницами с несколькими iframe, которые вызываются из 11 разных мест по-разному в приложении, над которым я работаю. Каждый способ имеет свою начальную длину истории. Я провел по 6 тестов для каждого способа вызова / использования каждого модуля. Последние 2 связаны с небольшим случайным перемещением на каждой составной странице. Во всех случаях он работал должным образом.
Любые комментарии приветствуются. Спасибо всем за внимание. И вы можете увидеть, как решение работает по ссылке выше в любом из 5 браузеров, указанных выше.
Мои правки немного ужесточили код и добавили комментарии.
ct