Я столкнулся с небольшой досадой, которая взрывается, чтобы стать огромной проблемой.Закрытие предположения о прерываниях оконных перерывов
Проблема 1: В Internet Explorer при закрытии окна (что вы открыли через window.open
) ownerDocument
исчезнет вместе с ним.
Следствием этого является то, что любой вызов к DOM, такие как appendChild
или createElement
, потерпит неудачу с SCRIPT70: Permission Denied
или SCRIPT1717: The interface is unknown
.
Я рассмотрел поведение других браузеров, таких как Chrome. В Chrome ownerDocument
все еще ссылается на #document
, но ownerDocument.defaultView
в конечном итоге будет undefined
. Это имеет смысл для меня. Звонки на appendChild
и createElement
пройдут. Я думаю, что все в порядке, пока вы не пытаетесь напрямую ссылаться на defaultView
.
Проблема 2: В Internet Explorer, когда вы нажимаете кнопку закрытия в порожденном окне, похоже, что это не соответствует циклу события. Я прикрепил событие unload
к порожденному окну, и он стреляет сразу же вместо очереди в конце цикла Event. Это делает мне не. Совершенно невозможно справиться с этой довольно тривиальной проблемой.
Если мы только что проблема 1 было бы -still болезненными но- простое решение: проверить, если ownerDocument
существует и пропустить, если он не делает. Так как ownerDocument
исчезает в середине синхронного кода JavaScript.
Ожидаемое поведение: Узел DOM не должен исчезать, если вы указали его - разумность сбора мусора.
Ожидаемое поведение 2: Узел DOM не должен исчезать синхронным кодом. (если вы не удалите его, конечно).
Известное обходное решение: переместите весь код, который взаимодействует с DOM в окне, так что, когда окно закрыто, это среда выполнения JavaScript. Это не тривиальное решение и может потребовать значительных изменений в вашей архитектуре.
Crappy solution: Оберните любую функцию, которая взаимодействует с DOM в функции, которая будет потреблять ошибки, если она обнаружит, что окно элемента было закрыто. Это довольно инвазивное и оказывает значительное влияние на производительность, и IE уже настолько медленный.
Есть ли лучшее решение?
Что я хочу, по крайней мере, является способом для игнорировать любые Error
s, которые выбрасываются, потому что пользователь закрыл окно. проблема 1 и проблема 2 Исследуйте основные предположения, которые вы делаете о JavaScript-коде: сбор мусора и цикл событий.
Демонстрационный сценарий
<script type="text/javascript">
function go() {
var popup = window.open('', 'open', 'width=500,height=300,scrollbars=yes,resizable=yes');
popup.document.open();
popup.document.write('<html><head></head><body></body></html>');
popup.document.close();
for (var i = 0; i < 10000; i += 1) {
var node = popup.document.createTextNode(i + " ");
popup.document.body.appendChild(node);
}
}
</script>
<input type="button" onclick="go();" value="Open popup" />
(сохранить как файл с расширением .html)
Инструкции:
- Открыть в Internet Explorer 9
- Нажмите "Открыть всплывающее окно"
- Закройте окно в то время как это делает
- соблюдать "Отказано в доступе"
Вот это JSFiddle: http://jsfiddle.net/C9p2R/1/
Это происходит во всех версиях IE? –
Это происходит в IE9. Я не осмелился проверить старые версии. Я не знаю об IE10. – Halcyon
Я правильно понимаю, что Chrome позволяет вам модифицировать DOM закрытых окон, пока вы держите ссылки на него? И вы хотите, чтобы это поведение в IE? – Bergi