История pushState внутри iframe, влияющая на макет родительского окна в Chrome?

У меня есть iframe, в котором pushState запускается, чтобы предоставить пользователю возможность просматривать назад и вперед. К этому iframe применено некоторое преобразование, и родительское окно реагирует на движение мыши, обновляя perspective-origin.

См. соответствующую страницу.

В Safari все нормально, но при просмотре истории в Chrome макет родителя ужасно ломается. Мне это кажется безумием, так как содержимое iframe никогда не должно влиять на макет родительского окна.

Для проверки вы можете просмотреть несколько вкладок внутри iframe, а затем нажать кнопку «Назад» в браузере. Также обратите внимание, что если вы перейдете на вкладку «Люди» и откроете любого из людей с изображением, кнопка «Назад» в левом верхнем углу вызовет ту же функцию, привязанную к pop state (furnax.goBack), не затрагивая родительское окно.

Либо это ошибка, либо просмотр истории делает больше, чем я думаю.

Я надеюсь, что у кого-то есть понимание.


Обработчик всплывающего состояния:

$(window).on("popstate", function () {
  if (furnax.popStoryEnabled) furnax.goBack();
});

Функция возврата:

goBack: function () {
  var myHistory = tempDb.getItem("prev").split(",");
  var to = "";
  if (myHistory != "") {
    to = "#" + document.getElementById(myHistory[myHistory.length - 1]).id;
  } else {
    to = "#" + $(".view").first().attr("id");
  }
  furnax.load(to, "pushright", true);
  myHistory.pop();
  tempDb.setItem("prev", myHistory.toString());
},

person Francesco Frapporti    schedule 09.11.2014    source источник
comment
Вы когда-нибудь догадывались об этом? У меня такая же проблема.   -  person Matthew Harrison    schedule 26.11.2014
comment
Неа! Пришлось переключиться на другие проекты. Но я подозреваю, что это зависит от неправильной обработки некоторых состояний истории, которые затем вызывают некоторую ошибку Chrome.   -  person Francesco Frapporti    schedule 26.11.2014


Ответы (1)


У меня это происходит как в Chrome 41, так и в Safari 8 на OS X 10.10.2. Я не думаю, что проблема в pushState. Я считаю, что происходит то, что когда вы меняете URL-адрес в iframe, браузер устанавливает фокус на iframe и автоматически прокручивает документ, чтобы показать полный iframe.

Я считаю, что это похоже на ошибку, с которой я столкнулся, сосредоточившись на входных данных внутри iframe, преобразованного с помощью CSS. Ошибка Webkit #143100, ошибка Chromium #470891.

Я не уверен, что ваша ситуация считается ошибкой, поскольку я считаю, что браузеры должны делать все возможное, чтобы отображать сфокусированные элементы, даже если это означает прокрутку элемента overflow:hidden. Опять же, я не уверен, что iframe действительно получает фокус, это может быть другая проблема, которая просто частично перекрывается.

Я бы попробовал сделать так, чтобы обработчик всплывающего состояния переместил «iPhone» в центр окна и изменил его URL-адрес только после того, как он закончил анимацию. Если это не сработает, возможно, вы можете взглянуть на пример страницы, на которую я ссылаюсь в своих отчетах об ошибках. Это может дать вам дополнительное представление о природе автоматической прокрутки.

person Chad von Nau    schedule 26.03.2015