Закрытие чистого модального диалога html / css вызывает новую запись истории

#javascript #modal-dialog #browser-history

#javascript #modal-dialog #браузер-история

Вопрос:

Я использую

 http://domain.com/page1.htm#modal
  

чтобы открыть модальный диалог с помощью css и псевдоселектора :target.

Проблема возникает, когда я закрываю это с помощью <a href>close</a> . Это правильно закрывает модальное окно, но также добавляет новую запись истории. Итак, история теперь выглядит так:

 http://domain.com/page1.htm
http://domain.com/page1.htm#modal
http://domain.com/page1.htm
  

Есть ли какой-либо способ предотвратить создание тегом action этой новой записи истории?

Комментарии:

1. Простое решение — не использовать привязку, кнопка с onclick может быть лучше. Или, если история важна, вы можете заглянуть в API истории .. developer.mozilla.org/en-US/docs/Web/API/History_API

2. Я пытался найти способ решить эту проблему, используя только html / css, чтобы модальный диалог продолжал работать даже без javascript, но это может оказаться невыполнимой задачей. @Keith: History API делает много хороших вещей, я использую его во многих местах, но решение этой проблемы, похоже, не входит в их число.

3. Я не уверен, что вы имеете в виду, API истории pushState / replaceState / popState практически позволяет вам делать с историей все, что вы хотите. И да, выполнение этого CSS только, я думаю, невозможно, так как это поведение тега привязки.

4. Насколько я вижу, History API не позволяет удалять записи истории.

5. Вы просто выполняете history.back() или history.go(-1) и т. Д. вы контролируете popState, поэтому вы можете игнорировать его необходимость. Я добавлю пример фрагмента..

Ответ №1:

Ниже приведен пример того, как возиться с историей.. Итак, в качестве примера, когда вы закрываете диалоговое окно, вы можете просто выполнить history.go(-2); чтобы удалить последние 2 элемента истории.

 $('#removeHist').click(function () {
  history.back();
});

$('#pushdaft').click(function () {
  history.pushState({},'daft title', '?someparam');
  console.log('pushed location: '   location.href);
});

window.onpopstate = function(event) {
  console.log('location now: '   location.href);
}

console.log('hello');  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#one">One</a>
<a href="#two">Two</a>
<button id="pushdaft">Add history</button>

<button id="removeHist">Remove History</button>  

Комментарии:

1. Спасибо за пример, Кит. Немного сложно читать из-за использования ужасной библиотеки jQuery, но я вижу, как это работает. Окончательное решение, используемое в отдельном сообщении ниже, чтобы я мог включить код.

2. jQuery не так уж и плох.. Я понимаю, как некоторые люди рассматривают его как большую библиотеку-монстра, поскольку он становится большим включением, когда требуется всего несколько функций. Я просто хочу, чтобы jQuery шел по пути Lodash, с NPM, чтобы, скажем, вы могли сделать, var ajax = require(‘jquery / ajax’);

3. Возникли проблемы с Internet Explorer, поэтому протестировал выше, но в IE произошел сбой: Ошибка: { «message»: «SecurityError», «filename»: » stacksnippets.net/js «, «линено»: 23, «кольно»: 3 }

Ответ №2:

Окончательное используемое решение, да, оно использует Javascript, но возвращается к в основном работающему senario, если Javascript недоступен:

 document.querySelector(".close").onclick = function() { history.back(); return false; };  
 <a href title="Close" class="close"></a>  

Комментарии:

1. К сожалению, это не работает в Internet Explorer. History.back() удаляет хэш #modal1 из URL-адреса, но не обновляет экран, чтобы отразить это. тем не менее, он отлично работает в Firefox! Есть предложения, как заставить IE обновить экран и переосмыслить CSS без перезагрузки всей страницы?

Ответ №3:

Для всплывающего окна только CSS вы должны использовать флажок или радиовход вместо :target . Затем вы откроете всплывающее окно с псевдоклассом:проверено, который не создает запись истории.

Пример в CodePen

 <body>
  <div class="pop-wrapp">
    <input type="checkbox" id="open" name="mobile-pop">
    <label for="open" class="open-pop"></label>
    <div class="popup">
      <label for="open" class="close-pop">×</label>
      <div>Text inside of the pop up</div>
    </div>
    <label for="open" class="close-pop-overlay"></label>
  </div>
</body>

<style>

*, *::before, *::after {
    box-sizing: border-box;
    transition: all 0.35s ease;
}
body {
  font-size: 2rem;
}
label {
    cursor: pointer;
}
#open {
    /* hiding the checkbox */
    display: none;
}
.popup {
    position: absolute;
    left: -100%;
    top: 10vw;
    background: white;
    padding: 5vw;
    z-index: 200;
    width: 80vw;
}
#open:checked ~ .popup {
left: 10vw;
}
/* An overly, to be able to click outside of the popup and close it */
#open:checked ~ .close-pop-overlay {
    position: fixed;  
    inset: 0;
    background: #00000040;
    z-index: 100;
    cursor: initial;
}
</style>