Почему window.parent самореференция?
Из документации и нескольких связанных постов Stackru я понимаю, что window.parent, если нет другого родителя, будет ссылаться на себя и, следовательно, никогда не будет неопределенным.
Я не могу найти достойную причину, почему это так. У JavaScript есть свои особенности, но этот кажется странным.
MSDN просто утверждает, что
Если текущее окно не имеет родителя, то есть занимает все окно браузера, Parent возвращает объект Window текущего окна.
Государства MDN
Если у окна нет родителя, его родительское свойство является ссылкой на себя.
И сам стандарт W3
Значение родительского атрибута объекта Window ДОЛЖНО быть объектом Window родительского документа или объектом Window документа, если родительский документ отсутствует.
Я не видел, чтобы другие языки действовали так, какова причина такого самоссылающегося дизайна? Разве 'null' или 'undefined' не создали бы более очевидную ситуацию, когда вы нажмете на самый верхний элемент в окне?
Так почему же?
3 ответа
При работе с iframes разработчики часто автоматизируют процессы, которые перемещаются по окнам. Хотя алгоритмы по своей сути будут состоять из одной базовой логики, концептуальные подходы будут отличаться.
Вместо того, чтобы работать в режиме "родители-дети", иногда разработчик создает систему таким образом, что кажется, что он ищет не родителя, а просто подходящее окно для использования. Тот, который контролирует (не обязательно держит) область, где код выполняется в настоящее время.
В случае таких подходов было бы концептуально странным для программы возвращать "false" или "undefined" при запросе ссылки на "правильное" окно, потому что оно должно быть.
Например, Боб программирует:
Боб: Я встроил iframe! Хорошо, позвольте мне поиграть с window
который содержит весь мой iframe (не window
самого фрейма)
Боб: Что? Ноль? Но я не понимаю, мой iframe запущен и работает, как не может быть никакого окна, которое управляет им?
Я просто говорю, что window.parent
может не означать буквально и строго получить родителя из DOM (например, .parentElement
делает), но больше хотелось бы указать на окно, которое абсолютно оборачивает не только ваш скрипт, но и все остальное, что оборачивает его на более низких уровнях.
В случае самого верхнего окна (где выполняется ваш скрипт) этот оператор может возвращать то же самое окно, потому что, не имея какого-либо другого окна, более важного, чем оно, он просто становится "правильным" для использования при поиске старшего контейнер.
Надеюсь, у меня есть смысл.
Я предполагаю, что это просто неудачное именование. Это свойство могло бы быть лучше названо чем-то вроде "parentOrCurrentWindow".
Если вам нужно "родительское или текущее окно", то возможность доступа к нему как к "родительскому" делает ваш код немного короче. И если вы знаете, что это так, то это не имеет большого значения. Можно сказать, что лучше получить НЕКОТОРЫЕ окна, чем нуль.
Но обратите внимание, это не имеет ничего общего с языком JavaScript. Речь идет о DOM-модели, реализованной браузерами. Модель DOM может быть улучшена, чтобы включить два свойства parentOrCurrent и parentOrNull. И на самом деле вы можете назначить эти переменные в своем собственном коде, чтобы было понятно, о чем вы говорите.
Я бы сказал, что это помогает с окнами связи. При загрузке стороннего контента он может использовать window.parent.postMessage, поскольку он является формой взаимодействия с контекстом реализации, но может быть реализован без родительского окна. HTML-страница, загружающая контент в iframe, будет иметь свое собственное окно в качестве родительского окна iframe, но у контента, загруженного во что-то вроде плагина браузера, такого как электронное веб-представление, не будет родительского окна, поэтому пост-сообщение не будет выполнено и контекст реализации не будет возможность слушать это событие. Таким образом, в основном это просто позволяет сети безопасности позволить разработчикам всегда использовать window.parent, потому что они могут не знать, будет ли их код запускаться из window.top или нет.