Разработка для Mozill'ы, по-русски

Окна.

Для открытия обычного окна мы используем функцию window.open, о которой я вкратце упоминал в Первой главе. Вернемся к ней ещё раз и подобнее:

Формат функции прост - дескриптор=window.open(ссылка, имя окна, опции);, где:

Типичная строка опций представляет собой что-то в таком роде: "toolbar,location=yes, menubar=no,top=200px, left=100" - эта строка говорит открыть окно браузера, содержащее toolbar, строку адреса и без меню с расположением 200 пикселей от верхнего края экрана и 100 от левого. Данное окно запуститься в контексте браузера. Строка опций определяет - будет ли открытое окно обычным окном браузера(по умолчанию), со всей встроенной функциональностью (включая меню по правой клавише мыши), или "чистым" XUL окном. "Чистое" окно требует, чтобы была включена следующая опция: chrome. Когда chrome отключён, следующие атрибуты применимы к окну: toolbar location directories personalbar status menubar scrollbars extrachrome

Эти опции применимы и к обычному окну браузера и к окну chrome: resizable dependent modal dialog centerscreen top left height width innerHeight innerWidth outerHeight outerWidth screenX screenY.

Часть опций требует привилегий безопасности для использования. Это: titlebar close alwaysLowered z-lock alwaysRaised minimizable . Привилегиями, по умолчанию, обладают программы, запущенные из контекста crome://

Я попытался свести значения всех опций для window.open() в таблицу:

Опция Назначение (в скобках значение по умолчанию) chrome браузер Требуют привил.
height, width, innerHeight, innerWidth, outerHeight, outerWidth размеры окна + +  
top, left позиция окна + +  
resizable разрешать ли изменение размеров окна(true) + +  
dependent закрывать, если закрывается родительское окно, новое окно всегда наверху(false) + +  
modal окно модальное(false), если текущее окно уже и так модально, то modal=true + +  
dialog остаётся только кнопка закрытия окна в titlebar(false) + +  
centerscreen вывести окно по центру экрана(false) + +  
toolbar, personalbar показывать панель инструментов(true)   +  
location строка адреса(true)   +  
status строка статуса(true)   +  
menubar меню(true)   +  
scrollbars прокрутка(true)   +  
extrachrome загружать sidebar (true)   +  
titlebar Включает декорацию окна назначаемую оконным менеджером(заголовок окна, бордюр вдоль окна)(true)     +
close кнопка закрытия окна в заголовке(true)     +
alwaysLowered, z-lock удерживают окна под другими окнами, когда они получают фокус(false)     +
alwaysRaised удерживают окна над другими окнами, когда они получают фокус(false)     +
minimizable ?     +

Атрибуты window:

window - не единственный вариант окна, который существует в XUL. Другие элементы это dialog, page, и wizard.

Окно диалога - dialog

Окна диалога служат для специальных функций, в стиле отображение сообщений или ввода дополнительной информации. Обычно, они запускаются не сами по себе, а в контексте других, главных, окон.
Для создания диалоговых окон и служит специальный тег <dialog>. Внешне он очень сильно похож window. Вы можете просто поменять window на dialog во всех предыдущих примерах. Возьмём самый первый пример этого руководства и произведём замену:

Посмотреть пример 8.1
<?xml version="1.0" encoding="windows-1251"?>
<dialog title="Здравствуй" 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <description value="Take Back the Web!"/>
</dialog>
Одно из отличий диалога от обычного окна - наличие набора кнопок. Этот набор фиксирован, надписи на них считываются из chrome в зависимости от платформы, от установленного языка и прочего. Заметили, что появились две пустые кнопки? Окно диалога должно запускаться из защищенного приложения. Приложение должно располагаться в chrome:// или быть подписанным и допущенным, чтобы иметь доступ внутрь chrome. Так как текущий пример запущен с сайта, то мы не увидели никаких надписей на кнопках, а если вы загляните в JavaScript Console, то увидите сообщение о нарушении прав доступа.
Формат dialog похож на window, с дополнительными атрибутами. Вот эти атрибуты:


Второй отличительной особенностью окон диалога, является то, что им можно передавать параметры при запуске. Для этого служит:

window.openDialog()
Этот метод window также вызывается только из защищённых приложений (chrome или подписанных).
window.openDialog() приходиться родным братом window.open(), он эквивалентен дописанным опциям в window.open: chrome=yes,dialog=yes
 

дескриптор окна = window.openDialog(ссылка, имя, опции, аргумент 1, аргумент 2, …);

Как видим, добавились списки аргументов. Полученные аргументы, доступны внутри отрывшегося окна, посредством масива в JavaScript window.arguments. Первый аргумент будет window.arguments[0].

Комментарий от Андрея Куликова:
В качестве аргументов, передаваемых в окно диалога могут быть объекты:

var obj = new Object()
obj.name = 'NoName'
obj.arr = [1,2,3]
...   
var newDialog = window.openDialog(,,,obj)
Внутри окна диалога обращение к свойствам и методам как обычно: ...window.arguments[0].name
 

page

Тэг page является другим примером корневого тэга. Он также похож по использованию на window и вы можете использовать его вместо window, но это будет крайне нежелательно :). Основное назначение page - подгружать документы внутри iframe. При помощи него, создаются такие панели настройки, как "Options.." у Mozilla. Никаких дополнительных атрибутов не имеет.

iframe

Хотя iframe сам не является "корневым элементом", он служит для того, чтобы в нём отображали другие "корневые элементы", поэтому мы рассмотрим его в этой главе.

Использование iframe очень похоже на iframe в HTML

. Тэг iframe позволяет включать внешние web-страницы и xul документы внутри xul. Любой XUL документ, включаемый с помощью iframe обязан начинаться с тега page.
iframe обладает единственным специальным атрибутом: и несколькими специальными методами:

Чаще всего iframe применяют для создания сложных окон со сменяющейся частью (таких как окно настройки Mozilla), и для создания аналога браузера (окна предосмотра)

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window title="iframe"
    orient="vertical" width="400px" height="300px"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <description value="Это iframe"/>
    <iframe flex="1" src="http://xul.ru"/>
</window>
Посмотреть пример 8.3

Существует вариант iframe, специально "заточенный" для просмотра web-документов - это <bowser>. В дополнение к возможностям iframe в нём реализованы функциональность браузера, такие как: работа с историей посещения страниц ( goBack(), goForward() ), домашняя страница ( homePage, goHome()) и тд. Если заинтересовались - подробности на xulplanet. Также рекоммендую присмотреться к tabbrowser

Вариант iframe, предназначенный для создания визуального редактора, называется <editor>. editor, например, является "сердцем" Mozilla Composer. Позволяет редактировать как текст, так и HTML. Документация »

wizard

Рассмотрим ещё один элемент, отвечающий за рисования окна - wizard. В главе "Поиграем в карты?" я высказывал сожаление, что для того, чтобы переключаться между "картами" stack или deck обязательно необходим JavaScript, который осуществит это переключение. wizard это некая комбинация между dialog и deck. Предназначен он для создания всем знакомых "Мастеров" (настройки/установки и тп), ведущих пользователей шаг-за-шагом через некий процесс. Внутри представляет из себя некую последовательность "карт", связанных между собой последовательностью перехода по умолчанию.

wizard состоит из двух частей: внешней, wizard, который и отвечает за создание окна и внутренней - коллекции wizardpage служащей страницами диалога, и хранящей внутри себя XUL содержимое. Внизу каждого диалога рассположены кнопки перехода между диалогами (следующий, предыдущий, отменить)

Следует помнить, что wizard, как dialog можно вызывать только из защищённых мест, например, из chrome://.

Типичный пример:

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<wizard id="wizard" title="Вступаем в клан"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

  <wizardpage description="Пол" pageid="sex" next="agr">
    <description>
      Вам необходимо ответить на несколько вопросов, чтобы определить, 
	достойны ли вы принятия в клан.
    </description>
    <label value="Какого вы пола?"/>
    <menulist>
      <menupopup>
        <menuitem label="Мужского"/>
        <menuitem label="Женского"/>
      </menupopup>
    </menulist>
  </wizardpage>
  <wizardpage description="Агрессия">
    <description value="Вы агрессивны?"/>
    <radiogroup>
      <radio value="yes" label="Да"/>
      <radio value="now" label="Нет"/>
    </radiogroup>
  </wizardpage>
</wizard>

wizard описывает общее поведение мастера и поддерживает следующие специальные атрибуты: Атрибуты положения и размеров такие же, как и у window, наследником которого он является.
wizardpage описывает одну из страничек Мастера, а также её поведение.
Атрибуты wizardpage: Описание методов, специфичных для wizardpage, смотрим XULPlanet.

Мы можем динамично, на лету, проверять и менять порядок смены страниц при помощи JavaScript. Например, повесим обработчик на <wizardpage onpageshow= или <wizardpage onpageadvanced= и внутри него, проверив некие вводимые значения, сменим next таким образом:

 document.getElementById('Wizardpage3').next="Wizardpage17";
или просто запретим переход к следующей странице
 document.getElementById('Wizardpage3').canAdvance=0;
Для понимания цепочки сообщений: обработчики, при нажатии на кнопку Next, вызываются в следующем порядке:
АтрибутВ каком тэгеГде вызывается
onpagehidewizardpageВызывается на странице, покидаемой пользователем
onpageadvancedwizardpageВызывается на странице, покидаемой пользователем
onwizardnextwizardВызывается в Мастере
onpageshowwizardpageВызывается на странице, в которую приходит пользователь


Хотите помочь? Вы нашли ошибку или хотите сделать комментарий - пишите. Я рад любой помощи.


©Yegor Turin (electroCat.ru) 2004 year. All Rights Reserved.