Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Фрэймы и окна

Содержание:

1. Почему document.write() открывает новое окно вместо того, чтобы писать в текущем окне?
2. Как я могу загрузить фрейм без дополнительных файлов?
3. Как я могу ссылаться на функции в другом фрейме?
4. Как я могу изменить два фрейма одновременно одним щелчком?
5. Как может код в одном фрейме определить, закончил ли загрузку код в других фреймах в моем frameset'е?
6. Почему мой вызов window.open() не отображает тип окна и размер, который я определяю?
7. Как я могу создать модальное окно (которое не может быть минимизировано) используя JavaScript?
8. Могу ли я написать JavaScript, который выполнится, когда пользователь закроет окно?
9. Как я могу управлять размещением нового окна, используя window.open()?
10. Как я могу закрыть окно без появления подсказки предупреждения?
11. У меня есть всплывающее окно для меню. Как я могу при выборе из этого меню открыть документы в полноэкранном окне?
12. Могу ли я многократно использовать одно и то же всплывающее окно на различных страницах?
13. Как открыть страницу в полноэкранном режиме, как при нажатии клавиши F11?
14. Как обратиться к скрипту в другом фреме?
15. На что заменить невалидный target=_blank?
16. Как запретить загрузку моего сайта во фрейме?
17. Параметры(атрибуты) window.open
18. Как определить, активна ли страница(окно) в браузере?

Почему document.write() открывает новое окно вместо того, чтобы писать в текущем окне?

Это наиболее популярное непонимание среди JavaScript программистов.

Как только текущий документ завершил загрузку, вы абсолютно не можете использовать document.write() для изменения содержимого. Поведение document.write() по умолчанию, как только текущий документ выполнил загрузку, должно открыть новое окно типа text/html, и направить ваш вывод в то окно.

Запомните, что единственная возможность для вас изменить отображение только что загруженного объекта документа - это:

1. Содержание элементов формы
2. Характеристики документа, которые выставляются через модель объекта документа (как bgcolor)
3. Экран, в котором выполняются апплеты или плагины, и,
4. Слои, которые имеют собственный объект документа и могут, таким образом, быть восстановлены независимо от объекта документа вашего скрипта.
Пример использования innerHTML


Как я могу загрузить фрейм без дополнительных файлов?

Как я загружаю пустой фрейм? Это выполняется использованием переменной, а затем использованием JavaScript: URL для загрузки фрейма, затем ссылка на эту переменную через атрибут src тега фрейма.

<script language=JavaScript>
var emptyFrame = "<html><body>some <B>HTML</B> text</body></html>";
</script>
...
<iframe src="javascript:parent.emptyFrame"></iframe>

Как я могу ссылаться на функции в другом фрейме?

Лучше всего определять функции внутри одиночного документа, родительского frameset-документа, обозначая HTML документ, который определяет frameset(s). Затем функция может быть вызвана, используя следующее выражение

parent.frameName.function();
Вы также можете выполнять функции в других фреймах, используя
windowReference.function()

Как я могу изменить два фрейма одновременно одним щелчком?

Сделать функцию:

function newPages() {
 parent.frameA.document.location.href="http://.....";
 parent.frameB.document.location.href="http://.....";
}
Затем вы вызываете эту функцию через любой объект, который поддерживает событие onClick:
<a href="JavaScript:newPages()">Continue to the new pages</a>
Замечание: Если одна из страниц, которую вы желаете изменить имеет в себе эту функцию, вы должны поместить setTimeout() в команде, которая изменяет локальную страницу:
function newPages() {
 parent.frameA.document.location.href="http://.....";
 setTimeout('self.location.href="http://....."', 250);
}
Таким образом, все ваши другие обращения выполняются прежде, чем вы закроете эту страницу. Естественно, ваши специфические потребности будут отличаться, а это - только предложение.

Как может код в одном фрейме определить, закончил ли загрузку код в других фреймах в моем frameset'е?

Часто, при работе с много-фрэймовыми документами, необходимо иметь доступ к данным в объектах, принадлежащих фреймам "брата". Думается, что в течение инициализации frameset'а, пока дочерние фреймы загружаются, фрейм A запрашивает данные из фрейма B только, чтобы узнать, что фрейм B не закончил загрузку или выполнение кода. Эта проблема синхронизации часто приводит к ошибкам, подобным "object has no property indexed by zero" или "parent.frameB.variableName is undefined".

Чтобы решить это, можно выполнить onLoad обработчики в frameset так, чтобы любой требуемый перекрестно-граничный код выполнялся только после того, как подготовлен весь набор документов:

frameset.html:

<frameset rows="50%,50%" onLoad="alert('Done the frameset')">
  <frame name="frameA" src="frameA.html">
  <frame name="frameB" src="frameB.html">
</frameset>
frameA.html:
<body bgcolor="white" onLoad="alert('Done A')"> </body>
frameB.html:
<body bgcolor="white" onLoad="alert('Done B')"> </body>
Если все идет хорошо, вы увидите сообщение из фрейма A, затем B, затем из frameset, так как событие frameset onLoad обрабатывает файлы после того как все фрэймы загрузятся.

OnLoad замечание:Некоторые Netscape клиенты по ошибке вызывают функцию frameset onLoad перед каждой дочерней функцией документа onLoad.


Почему мой вызов window.open() не отображает тип окна и размер, который я определяю?

Важно заметить, что третий параметр для функции window.open() может не содержать whitespace:

myWindow = window.open("http://www.netscape.com/", "myWindowName",
"toolbar=yes, location=yes, directories=no, status=yes, menubar=yes,
		scrollbars=yes, resizable=yes, height=400, width=600");

Как я могу создать модальное окно (которое не может быть минимизировано) используя JavaScript?

<BODY onBlur="self.focus();">

Могу ли я написать JavaScript, который выполнится, когда пользователь закроет окно?

Вы можете использовать обработчик события onUnLoad объекта окна.


Как я могу управлять размещением нового окна, используя window.open()?

windowReference = window.open("document.html", "windowName",
		"screenX=20,screenY=30")

Как я могу закрыть окно без появления подсказки предупреждения?

Сообщение "close window" не будет появляться если:

  • Окно, которое вы пытаетесь программно закрыть было программно открыто вашим скриптом или документом вашего скрипта или
  • Окно, которое вы пытаетесь закрыть - первый документ, загруженный в этом окне (например, оно было создано связью с предварительно неиспользованным target, или все документы были загружены в окне, используя location.replace()).
  • В некоторых браузерах срабатывает такой Хук:
    top.opener=top; top.close();

У меня есть всплывающее окно для меню. Как я могу при выборе из этого меню открыть документы в полноэкранном окне?

В заголовке начального HTML документа поместите предложение window.name.

window.name="a_Name"
Затем в окне откройте предложения в меню, используйте то же самое имя.
varName = open("whatever.htm","a_Name","");

Могу ли я многократно использовать одно и то же всплывающее окно на различных страницах?

Да, используйте то же самое имя каждый раз в открытом окне. Размер окна должен быть тот же самый.

varName = open("whatever.htm","same_Name","");
Когда вы хотите закрыть всплывающее окно, просто откройте его перед закрытием.
varName = open("whatever.htm","same_Name","");
varName.close()

Как открыть страницу в полноэкранном режиме, как при нажатии клавиши F11?

Работает только в IE, в остальных браузерах просто максимизирует страницу.

var myWin = window.open("index.html", "", "fullscreen");

Как обратиться к скрипту(объекту) в другом фреме или окне?

Пусть, например, ваше окно разбито на два фрейма: левый и правый. Пусть левый фрейм вы назвали LEFT, а правый - RIGHT. Предположим, скрипт у вас работает в левом фрейме, а в правом имеется форма ANKETA, а в ней - поле TIME. И вот вам очень хочется, чтобы значение поля TIME стало равно D. Обращаемся из левого фрейма в правый:

 WINDOW.TOP.RIGHT.ANKETA.TIME.VALUE=D

Соответственно, из правого фрейма в левый мы придем так:

 WINDOW.TOP.LEFT.FORMNAME.ELEMENT.NAME

Если вы захотите приказать из левого фрейма загрузить новый документ в правый фрейм, путь будет несколько иной:

 WINDOW.TOP.RIGHT.DOCUMENT.OPEN()

Вот, например, функция, которая, выполняясь в левом фрейме, загружает в правый фрейм страницу с анкетой и заранее устанавливает курсор ввода в поле NAME:

FUNCTION LOADPAGE()
{
   WINDOW.TOP.RIGHT.DOCUMENT.OPEN("ANKETA.HTM");
   // Загружаем страницу
   WINDOW.TOP.RIGHT.ANKETA.NAME.FOCUS();
   // Помещаем курсор в поле NAME
}

Перейдем к адресации между окнами. Основная страница с внутренним именем CENTER содержит левый фрейм с основным меню (название MENU) и правый, куда загружаются текущие документы (название MAIN). Посетитель щелкнул на ссылке в правом фрейме, в результате была выполнена команда

W=WINDOW.OPEN("WIZARD.HTM", "WIZARD", "WIDTH=400,HEIGHT=344,RESIZABLE=YES");

Было создано окно с внутренним именем WIZARD, и в нем запустился мастер выбора курса. Вся эта троица может наперекрест обмениваться информацией, устанавливать друг у друга значения полей - в общем, общаться. Например, путь из окна мастера в правый фрейм такой:

WINDOW.CENTER.MAIN... // Далее могут
   следовать названия формы и элемента

На что заменить невалидный target=_blank?

В настоящее время атрибут ccakrb target=_blank считется невалидным, вместо него можно испоьзовать следующую конструкцию:
onclick="return !window.open(this.href)"
Пример: Эта ссылка откроется в новом окне/вкладке.
<a href="http://htmlweb.ru"
	onclick="return !window.open(this.href)">
	Эта ссылка откроется в новом окне/вкладке.
</a>

Как запретить загрузку моего сайта во фрейме?

Вставьте следующий код в заголовок своей страницы:

<script type="text/javascript">
if (top != self) {top.location.href = self.location.href;}
</script>

Параметры(атрибуты) window.open

Параметры(атрибуты) window.open
Атрибут Значения Описание
copyhistory [=yes|no] | [=1|0] Сохранение истории загрузки документов в данное окно
directories [=yes|no] | [=1|0] Наличие в данном окне кнопок групп новостей
height = pixelheight Высоту окна (в пикселах)
location [=yes|no] | [=1|0] Наличие поля Location
menubar [=yes|no] | [=1|0] Наличие меню
resizable [=yes|no] | [=1|0] Наличие рамки окна, позволяющей изменять его размеры
scrollbars [=yes|no] | [=1|0] Наличие линеек прокрутки
status [=yes|no] | [=1|0] Наличие строки состояния
toolbar [=yes|no] | [=1|0] Наличие панели инструментов
width = pixelwidth Ширину окна (в пикселах)

Как определить, активна ли страница(окно) в браузере?

Возможно ли определить активна ли страница в браузере?

Другими словами, если я в браузере открываю другую закладку или открываю другое приложение, затем возвращаюсь к браузеру с нужной мне страницей, возникает ли какое-нибудь событие в окне, которое можно отловить? Мне надо обновлять информацию после того как страница(окно) в браузере снова стала активной.

var focus;
function focuswindow() { focus = true; }
function hidewindow() { focus = false; }
window.onfocus = focuswindow();
window.onblur = hidewindow();

if( focus ) {
	//что-то делаем
}

Если Вы хотите вызывать некую функцию(обработчик) только когда оано активно - воспользуйтесь следующим javascript-кодом

var interval_id;
$(window).focus(function() {
    if (!interval_id)
        interval_id = setInterval(hard_work, 1000);
});

$(window).blur(function() {
    clearInterval(interval_id);
    interval_id = 0;
});
var isActive;

window.onfocus = function () {
  isActive = true;
};

window.onblur = function () {
  isActive = false;
};

setInterval(function () {
  console.log(window.isActive ? 'active' : 'inactive');
}, 1000);

Читать дальше: Строки в JavaScript