Страницы: 1
Задача:
Есть расширение под FF. Нужно при некоторых действиях открывать диалог и программно управлять им. Например, когда выполняются длительные действия - менять прогресс-бар. А потом программно-же и закрыть.
Пытаюсь делать так:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
ww.foo();
....
ww.close();
Однако при этом открывается ещё одно окно браузера. Это напрягает.
Какие есть нормальные решения задачи?
Отсутствует
...
Однако при этом открывается ещё одно окно браузера....
А если убрать ww.open() ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Если убрать open(), то не появляется мой диалог.
А почему ? Так задумано, что ли ? Т. е., он в *.xul так настроен ?
Диалог открывается по openDialog, а новое окно браузера - по open.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
А почему ? Так задумано, что ли ? Т. е., он в *.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");
то диалог открывается. Но как же к нему тогда доступиться?
Отсутствует
а если так попробовать !
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)">
Отсутствует
...
Если вместо
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ентов на части порвет !!!
Отсутствует
Вроде можно ещё так
Отсутствует
Немного разобрался. 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)
Отсутствует
...
Функция 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ентов на части порвет !!!
Отсутствует
А если в Вашем примере попробовать выполнить след. код
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); }
Отсутствует
Сделал. По извращенному, но других путей не вижу.
Если брать в виде примера
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)
Отсутствует
Страницы: 1