После обновления кнопка "Назад" не работает должным образом - PullRequest
0 голосов
/ 20 июня 2020

Я снова задаю этот вопрос, потому что этого вопроса больше нет в моем списке вопросов, и у меня есть подходящий ответ. Более 100 человек просмотрели этот вопрос, прежде чем он исчез без комментариев или ответа.

Я работаю в Windows, Apache / mod_ perl, d HTML (HTML, CSS, JavaScript, Perl) среды. Я работаю над приложением, которое должно работать в браузерах Chrome, Edge, FF, IE и Opera. Проблема, которую я описываю, как и ожидалось, работает в FF и IE. Это не работает должным образом в Chrome, Edge или Opera.

Я создал веб-страницу с шестью окнами iframe для отображения цветных карт округов Кентукки за последние 5 лет в качестве меры . Каждый iframe имеет много ссылок. Если я возьму 3 ссылки, например, в одном или любом сочетании iframe, и введу Refre sh, веб-страница вернется в исходное состояние. На этом этапе, если я перейду назад, я ожидаю, что уйду со страницы.

Но этого не происходит. Чтобы покинуть страницу, мне нужно ввести Back n + 1 раз, где n - количество взятых мной ссылок. И каждая запись Back просто заставляет составную веб-страницу мигать, пока я не уйду с нее.

Ссылка ниже покажет вам эту проблему. Он запускается с сервера в моем доме в Кентукки. Введите любые 3 ссылки, refre sh и попробуйте отступить.

http://steepusa.no-ip.info/scx/gencm1m.cgi?str=0 ~ SKY ~ здоровые роды! V ~ l

В Refre ничего нет sh процесс находится под контролем моих программ. Пользователь просто вводит в браузере кнопку Refre sh. Это похоже на то, что история составной веб-страницы была стерта, но количество записей в истории не обнулялось. Он не делает шаг назад в истории использованных ссылок.

Это не может быть правильным. Это не имеет никакого смысла для меня. Это единственная нерешенная проблема с кроссбраузерностью, которая возникла у меня при завершении работы над этим приложением. Чтобы увидеть, как веб-страница работает, как задумано и ожидаемо, попробуйте ссылку в FF или IE. Любая помощь будет принята с благодарностью.

craigt

1 Ответ

0 голосов
/ 20 июня 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...