Открытие окна с автоматическим изменением размеров

Привет!!!Пишу хелп для одной формы, возле каждого поля формы есть изображение с буквой ( i ), при нажатии на неё открывается новое окно, для этого окна программа на Perl генерирует HTML код, тело которого содержит только одну таблицу, внутри которой и находится сам хелп. Всё вроде чудно работает, но так как объём помощи для каждого поля разный, соответственно и высота таблицы тоже разная, нужно как-то автоматически изменять размер окна, в зависимости от его содержимого.Вопрос:Можно ли каким-нить способом открывать окно, с помощью window.open(), которое будет обхватывать эту таблицу так, что бы вокруг неё не оставалось пустого места???Заранее спасибо,Денис
14 ответов

Читаем размеры таблицы, подставляем их в третий аргумент метода:http://www.quirksmode.org/viewport/compatibility.html http://forum.vingrad.ru/index.php?showtopic=37271 http://forum.vingrad.ru/index.php?showtopic=2785 http://forum.vingrad.ru/index.php?showtopic=4463 http://forum.vingrad.ru/index.php?showtopic=2786Там можно найти полезный вещи. Не получится - пиши. И желательно выложи код... Код открытия окна и HTML код, получаемый браузером при обработке perl скрипта


Aliance - да нет, меня не разрешение интересует. Ладно поясню немного иначе:Есть некое изображение, на событие Click этого изображения вешаю такой код:
onclick="window.open('/cgi-bin/nl/sys/faq.pl?faq=1','10','width=450 height=280 resizable=no, menubar=no, scrollbars=auto, location=no, status=no, toolbar=no'); return false"
Открывается, к примеру, такая страничка:
               FAQ                                                                                                 Help page №1                                                                                                                                                                                          В поле Merk вы должны указать марку                                      вашего автомобиля, как показано на рисунке ниже:                                     

                                                                       

                                                                                                      
                                                                                          
Так вот, из первого кода видно, что высота нового окна height=280, а мне нужно что бы эта высота соответствовала высоте таблицы, второго кода, т.е. что бы не оставалось пустого места внизу открываемого окна.


да нет, меня не разрешение интересует.
иам не только разрешение. Там есть и размеры блока - например scrollLeftkorob2001Вот, посмотри, выбири что тебе нужно. Я бы советовал бы scrollHeight:
1112222234444444444


korob2001 узнаёшь свою высоту как показал Aliance, либо сам решаешь какая высота лучше, затем вызываем self.resizeTo(W, H), тем самым подгоняем размер окна.


Спасибо, вроде немного понял, но видимо не до конца.Выношу в отдельный файл main.js, такую функцию:
function selfResizer( id ) {     table = document.getElementById( id );     h = table.scrollHeight;     // Так как ширина всегда остаётся 450, изменяю только высоту     self.resizeTo(450, h);}
Вешаю её на событие onLoad открываемого окна , где s - id таблицы, по которой мне нужно отрегулировать размер окна , но почему-то всё эта байда не работает . Думаю проблема в self, насколько я понимаю это объект текущего окна. Пробовал написать последнюю строку и так: window.resizeTo(450, h); Что не так???


self и window указывают на текущее окно(синонимы). Судя по коду всё правильно, как "трабла" себя проявляет?


Во, вроде заработало, просто я тестировал похоже не с тем окном. А почему этот код не изменяет размеры, если окно модальное???Открываю окно так:
function winOpener( id, urlz ) {       window.showModalDialog( urlz,[], "dialogHeight: 50px; dialogWidth: 450px; dialogHide: yes; help=no; status=no; edge=raised; unadorned=yes; scroll=no");       return false;}
затем в на onLoad только что открытого окна вешаю тот же код:
function selfResizer( id ) {     table = document.getElementById( id );     h = table.scrollHeight + 30;     window.resizeTo(450, h);}
Но размеры его не изменяются, хотя если заменить строку кода, которая отрывает модальное окно на window.open(.....) (обычное окно), то всё работает.Просто мне желательно, что бы эти окна открывались как модальные, так как это делаю в виде СПРАВКИ, чел не понял что делать с тем или иным полем, открыл окно, прочитал закрыл.


А почему этот код не изменяет размеры, если окно модальное???
Возможно это фича, модальное окно открывается, останавливая исполнение и лочиться в размерах. Попробуй не задать размеры(dialog(Width|Height)) при открытии окна.
ак как это делаю в виде СПРАВКИ, чел не понял что делать с тем или иным полем, открыл окно, прочитал закрыл.
Почему справка должна открываться в модальном окне? Представь что я читаю справку и выполняю по шагам, что там написанно, не закрывая окна. С модальным окном так не получиться, йзеру придётся часто окно открывать-читат и закрыватЬ-работать, пока его это не задолбает


Да и потом работать они будут только в IE.


Попробуй не задать размеры(dialog(Width|Height)) при открытии окна.
Не изменяет размеры модальных окон.
Почему справка должна открываться в модальном окне?
Каждое поле имеет свою справку, которую генерирует один и тот же Perl скрипт, допустим юзер вызвал справку для первого поля, окно отрылось, он прочитал её и вместо того, что бы закрыть окно справки, он просто уберает с него фокус. Затем он вызывает справку для какого-нить следующего поля, но так как окно уже открыто, справка загрузится в это окно, проблема в том, что оно так и остаётся свёрнутым, информация в нём правда меняется, но нужно не забыть, что окно было опущено, а не закрыто. Иначе он даже не заметит, что справка была вызвана и показана.Я вот думал сначала, узнать открыто ли окно спавки или нет, если да, то загружать в него следующую справку и тут же переводить на него фокус. Тогда спавка будет появляться не зависимо от того было ли окно свёонуто или закрыто. Затем подумал ещё чуток и вот до чего додумался:Так как код, который изменяет размеры окна, вызывается из открываемого окна, т.е. этот код:
function selfResizer( id ) {     table = document.getElementById( id );     h = table.scrollHeight + 30;     window.resizeTo(450, h);}
То решил при каждом вызове данной функции просто переводить фокус на текущее окно, т.е. на окно справки.
function selfResizer( id ) {     self.focus();     table = document.getElementById( id );     h = table.scrollHeight + 30;     window.resizeTo(450, h);}
Теперь даже если окно было свёрнуто, а не закрыто, то при последующем вызове оно получает фокус, что и было нужно. Потому нужда в модальных окнах отпала сама собой.Всем большое спасибо, очень помогли.


Каждое поле имеет свою справку, которую генерирует один и тот же Perl скрипт, допустим юзер вызвал справку для первого поля, окно отрылось, он прочитал её и вместо того, что бы закрыть окно справки, он просто уберает с него фокус. Затем он вызывает справку для какого-нить следующего поля, но так как окно уже открыто, справка загрузится в это окно, проблема в том, что оно так и остаётся свёрнутым, информация в нём правда меняется, но нужно не забыть, что окно было опущено, а не закрыто. Иначе он даже не заметит, что справка была вызвана и показана.
Используй обычные окна. Просто глянь сюда и там есть то, что тебе нужно:
var newWindow;function makeNewWindow(url) {    if (!newWindow || newWindow.closed) {        newWindow = window.open(/* твои параметры */);    } else {        // окно уже существсует => просто передаем ему фокус        newWindow.focus();    }}


Aliance - Спасибо, но это даже не нужно, потому как если окно уже открыто, то при вызове следующей справки новое окно не открывается, просто подгружается информация в уже открытое окно.Потому я просто передаю ему фокус при загрузке информации, т.е. хоть окно существует, хоть нет, в любом случае ему нужно передать фокус, что я и делаю в следующем коде:
function selfResizer( id ) {     self.focus();     table = document.getElementById( id );     h = table.scrollHeight + 30;     window.resizeTo(450, h);}
Эта функция висит на событии onLoad, документа, который подгружается в окне. Другими словами, если окно уже открыто, то при клике на следующей кнопке HELP в него загружается нужная справка. Текущее, т.е. окно в котором выводится сама справка, получает фокус и затем меняет свои размеры в зависимости от размера единственной таблицы текущего документа. Если же окно было закрыто, то просто открывается окно со справкой, затем оно получает фокус и меняет свои размеры.Всё работает на ура. ;))))Ещё раз спасибо.


Не могу подогнать размер содержимого под размер окна,т.е. всякий раз при генирации странички она может быть наполнена различным кол-ом онформации,я не знаю её отчный размеров,как сделать так чтобы каждый раз окно рисовалось красиво?


вообще это нормально, что информация подстраивается под размер окна, а не наоборотесли вы знаете объём инфо, то можно при открытии окна задавать предполагаемые размеры, если не знаете, то можно js определить, скажем местоположение контрольного блочка, т.е.информация выводится в окне в каком-нибудь диве
<div id="info">help information help information help information help information help information help information help information help information help information help information <div id="control"></div></div>
 определяем положение блока control (вроде offsetTop), и ресайз окна в нужную сторону