Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№118-05-2006 16:00:29

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Открытие диалога и управление им

Задача:
Есть расширение под FF. Нужно при некоторых действиях открывать диалог и программно управлять им. Например, когда выполняются длительные действия - менять прогресс-бар. А потом программно-же и закрыть.
Пытаюсь делать так:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
ww.foo();
....
ww.close();
Однако при этом открывается ещё одно окно браузера. Это напрягает.

Какие есть нормальные решения задачи?

Отсутствует

 

№218-05-2006 16:43:04

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: Открытие диалога и управление им

sutni пишет

...
Однако при этом открывается ещё одно окно браузера....

А если убрать ww.open() ?


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№318-05-2006 16:53:24

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Re: Открытие диалога и управление им

Если убрать open(), то не появляется мой диалог.

Отсутствует

 

№418-05-2006 17:09:17

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: Открытие диалога и управление им

sutni пишет

Если убрать open(), то не появляется мой диалог.

А почему ? Так задумано, что ли ? Т. е., он в *.xul так настроен ?

Диалог открывается по openDialog, а новое окно браузера - по open.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№518-05-2006 17:21:04

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Re: Открытие диалога и управление им

А почему ? Так задумано, что ли ? Т. е., он в *.xul так настроен ?

Вовсе нет. Вот заголовок xul:
<!--window-->
<window id="qsWaiterWindow"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
           onload="alert(1);">

Если вместо
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
делать
openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
то диалог открывается.  Но как же к нему тогда доступиться?

Отсутствует

 

№618-05-2006 17:44:37

CVB
Участник
 
Группа: Members
Зарегистрирован: 13-04-2006
Сообщений: 54

Re: Открытие диалога и управление им

а если так попробовать !

Выделить код

Код:

aaa.js
function WinisRun(win)
{
 // win - указатель на окно
}
bbb.xul
<script type="application/x-javascript" src="chrome://.../content/aaa.js"/>
<window id="qsWaiterWindow"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
           onload="WinisRun(this)">

Отсутствует

 

№718-05-2006 17:48:13

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: Открытие диалога и управление им

sutni пишет

...
Если вместо
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
делать
openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
то диалог открывается...

Ну... не знаю. У меня оба варианта работают.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№818-05-2006 17:49:30

CVB
Участник
 
Группа: Members
Зарегистрирован: 13-04-2006
Сообщений: 54

Re: Открытие диалога и управление им

Вроде можно ещё так

Выделить код

Код:

var dialog = document.getElementById('qsWaiterWindow');
dialog.foo();

Отсутствует

 

№918-05-2006 17:50:05

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Re: Открытие диалога и управление им

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


Проблема в следующем коде:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
for()
{
     ........
     ww.foo();
     ......
}
....
ww.close();

Функция foo определена в диалоге и занимается его перерисовкой (меняет value у элементов диалога).

Так вот перерисовка элементов на диалоге не происходит. (Наверное точнее сказать, что функция вызывается, значения элементов меняются, но окно не перерисовывается.) Если например в foo() после присвоения новых значений вставить alert, то новые значения будут видны. Иначе нет.
Есть ли какой нибудь способ принудительно перерисовывать диалог? Уделить ему машинного времени.....

Или обеспечить в диалоге принудительную перерисовку (обновление) в конце функции foo()

Отредактировано sutni (18-05-2006 18:08:40)

Отсутствует

 

№1018-05-2006 19:42:42

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: Открытие диалога и управление им

sutni пишет

...
Функция foo определена в диалоге и занимается его перерисовкой (меняет value у элементов диалога).

Так вот перерисовка элементов на диалоге не происходит...

Скорее всего, неправильно меняете состояние элементов (А value, вроде, вообще на отображение элементов никак не влияет). У меня работает следующий код:
winn.xul

Выделить код

Код:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<dialog id="window" title="0"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type="application/x-javascript">
function hello ()
{
    alert ("hello");
}
function tick_dialog ()
{
    var flag = document. getElementById ("cb000"). getAttribute ("checked");
    flag = !flag;
    document. getElementById ("cb000"). checked = flag;
    window. setTimeout (tick_dialog, 200);
}
</script>    
<checkbox id="cb000" checked="true" label="1"/>

</dialog>

который я запускаю из Custom Button скриптом:

Выделить код

Код:

var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen");
window. setTimeout (function () {ww.tick_dialog()}, 1000);

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1119-05-2006 09:15:41

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Re: Открытие диалога и управление им

А если в Вашем примере попробовать выполнить след. код

Выделить код

Код:

var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen");
window. setTimeout (function () {ww.tick_dialog()}, 1000);
for (var i=0;i<999999999;i++)
{
	var k=i;
}

То отображение диалога произойдёт только после выполнения цикла. В этом вся и засада.

А value я меняю у элемента label так:

Выделить код

Код:

function animateDotter()
	{
		var t=document.getElementById('qsWaiterTitle');
		var s=getString("waitlabel");
		l_curDotCount+=1;
		var ti=l_curDotCount%(l_maxDotCount+1);
		t.setAttribute('value',s+ti);		
	}

Отсутствует

 

№1219-05-2006 11:02:48

sutni
Участник
 
Группа: Members
Зарегистрирован: 13-02-2006
Сообщений: 25

Re: Открытие диалога и управление им

Сделал. По извращенному, но других путей не вижу.
Если брать в виде примера

Выделить код

Код:

var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen");
window. setTimeout (function () {ww.tick_dialog()}, 1000);
for (var i=0;i<999999999;i++)
{
    var k=i;
}

то цикл выносится в отдельную функцию. Даже не сам цикл а только его тело. Заводится глобальная переменная показывающая текущий шаг цикла. А в функции происходит рекурсивный вызов через setTimeout с инкрементом шага.

Теперь есть возможность проводить обновление диалога при каждом шаге.

Если у народа есть более удачные решения - всегда рад выслушать.

Отредактировано sutni (19-05-2006 11:04:29)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]